2017-05-29 60 views
0

我有一個隊列,在不同的中斷髮生時調用隊列的put和pull函數。有沒有辦法在這種情況下防止競爭狀況? 雖然我們不能等待中斷服務例程中的信號量,但創建類似功能的最佳方式是什麼。 我們使用Zynq FPGA的ARM-Cortex A5處理器來開發代碼。ISR(中斷服務程序)中的信號量同步

+1

C不知道ISR,你應該更具體地瞭解平臺並理想地展示一些可編譯的示例代碼。在一個非常簡單的情況下,在ISR內部防止中斷可能就足夠了。 –

+0

@FelixPalmen感謝您的評論我會更新它 –

+1

注意 - 您可以肯定地從ISR POST信號量單元 - 這是發信號通知I/O已完成的線程的最常用方式。確實,你一定不要試圖等待:) – ThingyWotsit

回答

1

假設每個中斷都會導致處理器的「中斷禁用」狀態打開,並且假定您正在處理的中斷具有相同的優先級(即不能中斷另一中斷的執行) ,那麼已經不存在競爭條件,您的ISR可以訪問共享隊列。 (當發生中斷時,處理器進入中斷禁止模式,將所有寄存器壓入堆棧,跳轉到ISR入口點並繼續執行,一旦ISR完成,「iret」指令執行反向操作這個簡單的描述可以在不同的處理器和平臺上以不同的方式實現)。

+0

請注意,無論從驅動程序處理程序線程正在進行的pop的哪個階段,共享隊列索引操作都必須能夠使ISR可以安全地推送。 – ThingyWotsit

+0

@ThingyWotsit,你是對的。幸運的是,這個隊列似乎只能在ISR中訪問。否則,非ISR訪問本身應執行中斷禁用指令以進行安全訪問。 –

相關問題