當主函式與中斷函式共用變數時,可能發生:
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...