我終於也碰到volatile這個問題了

之前上ARM課,老師講到volatile這個關鍵字時,主要是說他用到更硬件相關的地方。好比咱們看到不少關於硬件的頭文件的時候,寄存器的定義都是幾乎都是volatile與內存地址相結合,由於咱們時刻想要的是寄存器的最新值,而volatile這個關鍵字的做用就是告訴編譯器不要對它聲明的變量進行優化,每次讀取操做都要得到它的最新值。異步


以上就是我在遇到volatile新的問題以前對於volatile的理解,認爲它通常就是用在與硬件相關的地方,其餘須要用到的地方不知道在哪裏。直到我昨天遇到了關於volatile的新問題。函數


我遇到的問題是這樣的,我用到了定時器來實現精確的延時,爲了判斷時間到而繼續進行運行下面的語句,我聲明瞭一個全局變量來代表定時時間是否到,中斷函數裏我就將這個標誌置位,表示時間到達。在用到定時器的函數裏,我就用while(!flag);這樣的語句來判判定時時間是否到,但我運行調試程序時,程序執行了中斷,可是程序就一直中止在while(!flag);這裏不往下執行了。想了很久,我也不知道爲何。最後多是靈感仍是什麼的,我無心在全局變量flag前面加了個volatile關鍵字,奇蹟發生了,程序終於順利運行起來了。看來,volatile還在其餘的地方有用處。最後,我在網上搜了關於voatile的用法,其中果真就有我面臨到的問題。優化


如今簡單總結一下volatile的用法。spa

它主要用到變量會異步改變的時候,主要表如今一下3個方面:操作系統

1.CPU外設寄存器 (我開始一直理解的volatile用法)線程

2.中斷和主循環都會用到的全局變量 (這就是我遇到的問題啦)調試

3. 操做系統中的線程間都會用到的公共變量 (暫時沒有遇到,不過記下了)內存

相關文章
相關標籤/搜索