微軟引起的while不歸路

來源:互聯網
上載者:User
如果你是windows mobile的驅動程式開發人員,又恰好寫了類似的這樣一句話。
while(dev->devState!=5);
說明一下,dev是個結構體指標。你希望等待它的成員變數變成5,繼續執行。同時

有可能你在中斷服務程式中改變這個成員變數的值。
哈哈!我幸運的告訴你你已經進入了“死迴圈”,永遠跳不出去啦。

這是個編譯器最佳化產生的問題,看看編譯器產生的彙編片段。
|$L39064|
cmp r3, #5
bne |$L39064|
它將dev->devState最佳化為了一個寄存器r3,這樣的比較是跳不出迴圈的。

那麼要解決這個問題就是將dev這個指標聲明為volatile,之後,看編譯器產生的彙編片段,變成了
|$L39064|
ldr r3, [r6, #4]
cmp r3, #5
bne |$L39064|
這才是我們想要的結果。汗!!

我在WM533做的實驗,確實有這個問題。我覺得這個最佳化,微軟做的太離譜了。不知道算不算編譯器bug 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.