簡體   English   中英

在事件驅動的嵌入式系統中使用事件隊列避免競爭條件

[英]Avoiding Race Condition with event queue in event driven embedded system

我正在嘗試對 stm32 進行編程並使用事件驅動架構。 例如,當發生定時器中斷時,我將切換一個引腳,並在發生 ADC DMA 緩沖區完全中斷時將一些數據傳輸到外部 flash 等等。

將有多個中斷源,每個中斷源具有相同的優先級,從而禁用嵌套。

我將使用中斷來設置一個標志來通知我的 main 發生了中斷並在 main 中處理數據。 ISR 內部不會有處理/指令。

困擾我的是,從長遠來看,在 main 和 ISR 中訪問變量(在這種情況下為標志)可能會導致競爭條件錯誤。

所以我想使用循環事件隊列而不是標志。

只有 ISR 能夠寫入事件隊列緩沖區並增加“head”。 只有 main 能夠讀取事件隊列(並根據事件執行指令)並增加“tail”。

由於 ISR 嵌套被禁用,每個 ISR 將訪問事件隊列數組的不同元素,主 function 只會在事件隊列上有新事件時做出反應,避免競爭條件對吧? 還是我錯過了什么?

如果我做錯了什么,請糾正我。

謝謝你。

如果中斷只設置了一個變量,並且在主上下文准備好之前什么都不做,那么根本就沒有理由產生中斷。

例如:如果你得到一個 DMA 完整的硬件中斷並設置了一個變量,那么你所做的就是將一位信息從硬件寄存器復制到一個變量中。 通過輪詢變量而不是不啟用中斷並直接輪詢硬件標志,您可以擁有更簡單的代碼,具有相同的性能和更少的錯誤可能性。

僅當您實際上要在無法等待的中斷上下文中執行某些操作時才啟用中斷,例如:讀取 UART 接收到的數據寄存器,以便接收到的下一個字符不會溢出緩沖區。

如果在中斷完成后不能等待的事情然后需要與主上下文進行通信,那么您需要共享數據。 這意味着您需要某種方法來防止競爭條件。 最簡單的方法是原子訪問,只有一側寫入數據項。 如果這還不夠,那么老式的方法是在主上下文訪問共享數據時關閉中斷。 使用 LDREX/STREX 指令有更復雜的方法,但只有在確定簡單方法對您的應用程序不夠好時,您才應該探索這些方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM