主函式與中斷函式共享變數問題

2021-07-09 05:23:27 字數 830 閱讀 4463

當主函式與中斷函式共用變數時,可能發生: 

1.主函式對變數的 讀-寫,可能造成中斷函式對變數的 讀-寫無效。 

如:當主函式剛剛把變數讀入到內部暫存器時,還未再回寫到變數中 時,發生中斷,中斷中改寫了變數。當中斷返回時,主函式將值再回寫到變數中。造成中斷函式對變數的改寫無效。 

2.多位元組變數讀取錯誤。 

如:當變數的其中乙個位元組讀入到暫存器中時,發生中斷,中斷中改寫了變數值。當中斷返回時,變數的其他位元組繼續被讀入到暫存器中,造成新舊位元組組合錯誤。

主函式與中斷函式共享變數問題類似兩個執行緒共享資源的問題,如何解決共享資源衝突是系統結構設計的關鍵

解決方法

1.volatile

正確使用. 

2.注意臨界段(或原子操作). (寫變數時,關中斷,寫完後再開)

作業系統中對這種問題有另一種解決辦法,即引入乙個與ms_counter相同型別的臨時變數:

unsigned int tmp_counter;

在使用ms_counter做判斷前作如下操作:

do {

tmp_counter = ms_counter;

while (tmp_counter != ms_counter);

然後使用tmp_counter代替ms_counter進行判斷,這樣可以保證迴避樓主所述問題。

一般說來,volatile用在如下的幾個地方:

1)、中斷服務程式中修改的供其它程式檢測的變數需要加volatile;

2)、多工環境下各任務間共享的標誌應該加volatile;

3)、儲存器對映的硬體暫存器通常也要加volatile說明,因為每次對它的讀寫都可能由不同意義; 

python的主函式問題

當你開啟乙個.py檔案時,經常會在 的最下面看到if name main 現在就來介紹一下它的作用.每個檔案都有乙個內建的屬性叫 name 這個值取決於該檔案如何執行。如果這個檔案是直接執行的,name 的值等於 main 如果這個檔案是被別的檔案呼叫的,那麼 name 值就是該檔案的名字 不含字尾...

變數與函式

7.8 區域性變數和全域性變數 7.8.1 區域性變數 1 在函式內部或復合語句內定義的變數,只在本函式或本復合語句內可見,存在。7.8.2 全域性變數 1 在函式外定義的變數,從定義變數的位置開始到本原始檔結束可見,在程式整個執行期間存在。2 同名區域性變數與全域性變數在作用域重疊的部分,區域性變...

unp signal函式與系統中斷

一.signal分析 在posix中訊號的處理 include void signal int signo,void func int int else if sigaction signo,act,oact 0 struct sigaction signo代表是要檢測或者修改具體訊號的動作編號。r...