嵌入式與韌體
主程式正以「reg |= mask;」(讀取、修改、寫回)操作暫存器的位元時,中斷處理常式改寫了同一暫存器的另一個位元,可能發生的問題與對策的組合,下列何者正確?
- A中斷所做的變更會被主程式的寫回覆蓋而消失。在操作期間禁止中斷,或使用各位元專用的設定、清除暫存器
- B暫存器損壞而再也無法使用。更換微控制器
- C什麼事都不會發生。不需要對策
查看答案與解析
正確答案:A. 中斷所做的變更會被主程式的寫回覆蓋而消失。在操作期間禁止中斷,或使用各位元專用的設定、清除暫存器
「reg |= mask」是讀取暫存器、做OR運算、再寫回的三個動作。若在讀取之後立刻發生中斷,處理常式改變了另一個位元,主程式仍會依據中斷前讀到的舊值寫回,使處理常式的變更消失。只要在操作期間禁止中斷,或使用只有寫入1的位元才會改變的設定用、清除用暫存器,一次寫入即可完成,就不會發生這個問題。
- A. 正確。原因在於讀取到寫入之間被中斷插入。
- B. 電路並不會損壞,只是數值遺失。
- C. 數值有可能遺失。