你在你所描述的情況下運行的風險(從內存到寄存器,更新寄存器讀取,寫入內存和任何這些操作之間的上下文切換髮生的)是,你可能會失去在其他方面做了更新。
例如:
main context:
read i (=10) from memory to register R1
add 5 to R1
<interrupt. Switch to interrupt context>
read i (=10) from memory to register R1
add 10 to R1
write R1 to i in memory (i = 20)
<end of interrupt. Back to main context>
write R1 to i in memory (i = 15)
正如你所看到的,從中斷更新已丟失。如果你的類型需要多次操作將它寫入內存,在寫操作過程中發生的中斷會發生
一個更大的問題。
例如:
main context:
read first half of i (=10) from memory to register R1
read second half of i (=10) from memory to register R2
add 5 to R1/R2 pair
write R1 to first half of i in memory
<interrupt. Switch to interrupt context>
read first half of i (= ??) from memory to register R1
read second half of i (= ??) from memory to register R2
add 10 to R1/R2 pair
write R1 to first half of i in memory
write R2 to second half of i in memory
<end of interrupt. Back to main context>
write R2 to second half of i in memory
在這裏,有沒有告訴什麼價值,我將結束了。
隨着sig_atomic_t
,則不會發生此第二個問題,這是因爲類型是保證使用原子讀/寫操作。
您所標記的問題作爲DSP。希望答案只突出顯示DSP上可能出現的問題?這個問題本身並沒有提到DSP。 – 2010-10-08 10:48:13