莫名其妙的錯誤。使用Systick作的延時。 函數
初始化是這樣的: 優化
//SysTick配置 ui
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); v8
if(SysTick_Config(SystemCoreClock/1000))//開Systick中斷,配置Systick時鐘。 rem
{ 編譯器
while(1); 編譯
} 配置
而後: im
//延時函數。1個nTime至關於時間:1ms。 static
static uint32_t TimingDelay;
void Delay(__IO uint32_t nTime)
{
TimingDelay = nTime;
while(TimingDelay != 0);
}
void TimingDelay_Decrement(void)
{
if (TimingDelay != 0x00)
{
TimingDelay--;
}
}
原本一切都正常,這幾句代碼沒任何問題。
可今天不對勁了。
這句:while(TimingDelay != 0);
當TimingDelay 減到0 時候仍然不退出。延時失敗。莫名其妙的東西。
而後在羣裏邊討論了下發現問題了。
這東西是編譯器給優化掉了。
定義static uint32_t TimingDelay;
改爲static __IO uint32_t TimingDelay = 0;
即static volatile uint32_t TimingDelay = 0;
就行了。
volatile的做用是: 做爲指令關鍵字,確保本條指令不會因編譯器的優化而省略,且要求每次直接讀值.