<th id="alkcr"><pre id="alkcr"></pre></th>

  • 打印

    [原創] volatile關鍵字作用

    [復制鏈接]
    70|1
    跳轉到指定樓層
    樓主
    首先來看一段代碼:
      
    //P1.0口連接LED0
      
    #include <msp430.h>
      
    int main(void)
      
    {
      
           WDTCTL  = WDTPW | WDTHOLD;      // stop watchdog  timer
      
           unsigned  int i;
      
           P1DIR=0x01;                    //定義P1.0口為輸出引腳。
      
           while(1)
      
           {
      
               P1OUT=0x01;               //P1.0輸出高電平
      
               for(i=5000;i>0;i--);
      
               P1OUT=0x00;               //P1.0輸出低電平
      
               for(i=5000;i>0;i--);
      
           }
      
    }
      
    測試結果:
    LED0一直亮著
    為什么會這樣呢?
    把上述代碼變量i的定義語句做出如下修改,再上電測試
      
    volatile unsigned int i;
      
    測試結果:
    LED0 閃爍
    為什么加了volatile關鍵字就把問題解決了呢,這個關鍵字作用到底是什么?
    Volatile:定義“發揮性”變量,編譯器將認定該變量的值會隨時改變,對該變量的任何操作都不會被優化過程刪除。編者在實際編程的過程中發現,利用變量i遞減或遞加產生的軟件延時函數,會被編譯器優化而不會執行,因此若讀者遇到這種情況且希望延時函數工作,只能在變量i前加volatile關鍵字即可。
    注:上述內容摘自《MSP430單片機原理與應用—MSP430F5xx/6xx系列單片機入門、提高與開發(任保宏、徐科軍)》
    總結:
    volatile關鍵字作用。從實驗1測試結果可以得出,兩條for循環語句均被編譯器優化過程刪除。實際while循環中僅有P1OUT=0x01;P1OUT=0x00;所以輸出結果LED0常亮。通過實驗2可以得出如下結論:volatile關鍵字作用是告訴編譯器該變量(變量i)任何操作都不可以被優化過程刪除且希望軟件延時函數能正常工作

    使用特權

    評論回復
    沙發
    | 2019-9-11 21:28 | 只看該作者
    這應該還跟編譯器的優化設置有關吧

    使用特權

    評論回復
    掃描二維碼,隨時隨地手機跟帖
    您需要登錄后才可以回帖 登錄 | 注冊

    本版積分規則

    我要發帖 投訴建議 創建版塊 申請版主

    快速回復

    您需要登錄后才可以回帖
    登錄 | 注冊
    高級模式

    論壇熱帖

    在線客服 快速回復 返回頂部 返回列表
    成人短片线上看