延時函式中的volatile

2021-04-29 22:05:08 字數 717 閱讀 5385

除錯wince驅動時候,有時候碰到us級別的時序要求的短延時,使用硬體定時器顯得麻煩.一般我會用乙個短延時delay().今天碰到了離奇事情.

實現乙個短延時,用巨集,內聯函式或者函式都可以實現.下面是乙個例子.

#define delay(us) dowhile(0)

你能想象的出上面**有什麼問題?我使用pb的編譯器編譯完開始使用上面的延時函式實現一些io的驅動.竟然發現io不聽我控制!這就像碰到了一些明顯違背常理的事情,從而讓你開始懷疑1+1不等於2一樣糟糕!沒有辦法,我只好開始做一些基本的io測試.我讓乙個io輸出10次方波.結果示波器上只有3次雜訊一樣的東西!感謝我的示波器,我將波形放大(就是改變週期,呵呵)後看出了端倪.原來是延時時間不夠!

因為cpu指令一般有高達數百兆的速度(如果考慮流水線,實際執行速度更快),而io不會有那麼快的響應速度.所以,軟體上改變io頻率太快,硬體io是沒有辦法跟上的!所以io狀態變化間需要延時.

開始,我以為只是延時函式(巨集)延時的時間不夠.我改變了上面那個t的初值,更離奇的事情發生了.改變延時後,io的情況沒有一點好轉和變化!還是出現一樣的雜訊!

折騰磨蹭了許久.我突然想到,是不是**被編譯器給優化了?因為直觀感覺到像那樣的'無用處'的**是容易成為被優化的物件.這樣就會導致實際的延時總達不到預想效果.對付優化,我的手段不是很多,本能的先在變數前面加了volatile.結果成功了!io重新受到我控制了.(還好成功了,否則我就要展開對編譯器的深入透視了,目前可沒有時間啊.)

Linux Shell中的延時函式

linux shell 中的延時函式 在 linux shell 指令碼中經常需要做一些延時處理。所以經常要用到 sleep 或 usleep 函式。下面來說一下 sleep 和 usleep 的區別 sleep 預設以秒為單位。usleep 預設以微秒為單位。1s 1000ms 1000000us...

Linux Shell中的延時函式

linux shell 中的延時函式 在 linux shell 指令碼中經常需要做一些延時處理。所以經常要用到 sleep 或 usleep 函式。下面來說一下 sleep 和 usleep 的區別 sleep 預設以秒為單位。usleep 預設以微秒為單位。1s 1000ms 1000000us...

關於linux中的延時函式

應用程式 include usleep n n微秒 sleep n n毫秒 sleep n n秒 驅動程式 include mdelay n milliseconds 其實現 ifdef notdef define mdelay n else define mdelay n builtin cons...