日本a√视频在线,久久青青亚洲国产,亚洲一区欧美二区,免费g片在线观看网站

        <style id="k3y6c"><u id="k3y6c"></u></style>
        <s id="k3y6c"></s>
        <mark id="k3y6c"></mark>
          
          

          <mark id="k3y6c"></mark>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 單片機C語言中volatile的作用

          單片機C語言中volatile的作用

          作者: 時間:2016-11-23 來源:網(wǎng)絡 收藏
          一個定義為volatile的變量是說這變量可能會被意想不到地改變,這樣,編譯器就不會去假設這個變量的值了。精確地說就是,優(yōu)化器在用到這個變量時必須每次都小心地重新讀取這個變量的值,而不是使用保存在寄存器里的備份。下面是volatile變量的幾個例子:
          1). 并行設備的硬件寄存器(如:狀態(tài)寄存器)
          2). 一個中斷服務子程序中會訪問到的非自動變量(Non-automatic variables)
          3). 多線程應用中被幾個任務共享的變量
          回答不出這個問題的人是不會被雇傭的。我認為這是區(qū)分C程序員和嵌入式系統(tǒng)程序員的最基本的問題。嵌入式系統(tǒng)程序員經(jīng)常同硬件、中斷、RTOS等等打交道,所用這些都要求volatile變量。不懂得volatile內(nèi)容將會帶來災難。
          假設被面試者正確地回答了這是問題(嗯,懷疑這否會是這樣),我將稍微深究一下,看一下這家伙是不是直正懂得volatile完全的重要性。
          1). 一個參數(shù)既可以是const還可以是volatile嗎?解釋為什么。
          2). 一個指針可以是volatile 嗎?解釋為什么。
          3). 下面的函數(shù)有什么錯誤:
          int square(volatile int *ptr)
          {
          return *ptr * *ptr;
          }
          下面是答案:
          1). 是的。一個例子是只讀的狀態(tài)寄存器。它是volatile因為它可能被意想不到地改變。它是const因為程序不應該試圖去修改它。
          2). 是的。盡管這并不很常見。一個例子是當一個中服務子程序修該一個指向一個buffer的指針時。
          3). 這段代碼的有個惡作劇。這段代碼的目的是用來返指針*ptr指向值的平方,但是,由于*ptr指向一個volatile型參數(shù),編譯器將產(chǎn)生類似下面的代碼:
          int square(volatile int *ptr)
          {
          int a,b;
          a = *ptr;
          b = *ptr;
          return a * b;
          }
          由于*ptr的值可能被意想不到地該變,因此a和b可能是不同的。結果,這段代碼可能返不是你所期望的平方值!正確的代碼如下:
          long square(volatile int *ptr)
          {
          int a;
          a = *ptr;
          return a * a;
          }
          //-----------------------------------


          評論


          技術專區(qū)

          關閉