莫名其妙的錯誤。使用Systick做的延時。
初始化是這樣的:
//SysTick配置
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
if(SysTick_Config(SystemCoreClock/1000))//開Systick中斷,配置Systick時鐘。
{
while(1);
}
然後:
//延時函數。1個nTime相當於時間:1ms。
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的作用是: 作為指令關鍵字,確保本條指令不會因編譯器的優化而省略,且要求每次直接讀值.