程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 延時函數出錯,volatile一例,volatile一例

延時函數出錯,volatile一例,volatile一例

編輯:關於C語言

延時函數出錯,volatile一例,volatile一例


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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved