延時函數出錯,volatile一例

莫名其妙的錯誤。使用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的做用是: 做爲指令關鍵字,確保本條指令不會因編譯器的優化而省略,且要求每次直接讀值.

相關文章
相關標籤/搜索