關於C語言中volatile關鍵字的作用


關於C語言中volatile 關鍵字的使用

紙上得來終覺淺,絕知此事要躬行!中國五千年文化,古人爺爺們誠不欺我,今天算是又體驗了一回。起因是這樣的:

 

 先上一張圖,圖中Req_Timer是我定義的一個變量,uint16_t   Req_Timer,在定時器里面加一遞增,按照流程,應該是先判斷USART_RX_STA是否為真,為真就跳出while執行下一步,為假就執行if語句,判斷Req_Timer是否>=0,若是則執行if里面的代碼,隨筆重點來了,我在仿真時發現,在Req_Time>100后,編譯器並不往下執行,依然是停留在等待Req_Time>=100這條語句,卡死在此處,仿真了幾次,百思不得其解,明明流程沒錯,怎么就是不執行。

在百度了很多關鍵詞后,在一個論壇中找到答案,在開中斷后,while里面嵌套的IF語句判斷變量不能正確判斷,論壇結貼寫明:在定義全局變量時,需要加上volatile關鍵字。

 

於是我又去查找volatile關鍵字的用法與定義:

volatile 影響編譯器編譯的結果,volatile指出 變量是隨時可能發生變化的,與volatile變量有關的運算,不要進行編譯優化,以免出錯

恍然大悟,也就是說在編譯器編譯時,因為我定義的變量在中斷打開,每個5MS加一的情況下,突然在別的文件中被清零,所以編譯器進行了優化,使得上面圖片中的if語句不能進行正確的判斷,從而引起故障。

 

 

volatile關鍵字以前也學過,但是理論終究是理論,當時學的迷迷糊糊,導致遇到問題時根本聯想不到使用這個關鍵字解決,感謝這次問題的出現,讓我對volatile 這個關鍵字有了更深的理解。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM