這個問題是關於編程沒有OS的小型微控制器。特別是,我目前對PICs感興趣,但問題是一般的。使用定時器保持時間中斷嵌入式微控制器
我見過幾次的保持時間以下模式:
定時器中斷代碼(比如定時器觸發每秒):
...
if (sec_counter > 0)
sec_counter--;
...
主線代碼(非中斷):
sec_counter = 500; // 500 seconds
while (sec_counter)
{
// .. do stuff
}
主線代碼可能會重複,將計數器設置爲各種值(不僅僅是秒)等等。
在我看來,當主線代碼中的sec_counter
分配不是原子時,這裏有一個競爭條件。例如,在PIC18中,分配被轉換爲4個ASM語句(在此之前加載每個字節並從存儲體中選擇正確的字節)。如果中斷代碼出現在中間,則最終值可能會損壞。
奇怪的是,如果賦值小於256,賦值是原子,所以沒有問題。
我對這個問題正確嗎? 您使用什麼模式來正確實現此類行爲?我看到幾個選項:
- 禁止中斷每個任務之前sec_counter並啓用後 - 這是不是漂亮
- 不要使用中斷,但相應地開始,然後調查的一個單獨的計時器。這是乾淨的,但用完了一個定時器(在前面的情況下,1秒定時器也可用於其他目的)。
還有其他想法嗎?
有趣的方法,雖然懷疑比禁用中斷更清潔。我不知道我需要volatile,因爲無論如何編譯器優化都是禁用的。 – 2009-05-21 13:08:05
我希望這己技巧被註釋掉,當你使用它,因爲它要氣色好怪異的人誰不立即意識到它的防護安劍錚,卓傑中斷改變一個「C指令」中的值。 – Martin 2009-05-22 06:50:03
從多個內存映射寄存器中讀取禁用中斷不起作用時,它也可以工作。 – Dipstick 2009-05-22 15:53:41