2016-09-09 38 views
-1

我正在與STM32系統,我需要通過UART RX接收字節,事情是我必須同步過程,這意味着當它做的其他事情我們不能運行ISR,反之亦然。顯然,最簡單的方法是在該「關鍵部分」期間禁用irq。但是我擔心後果,如果我在關鍵部分運行並且中斷即將出現但被禁用,那麼只要我再次啓用irq,該中斷是否會出現,或者是否應該丟失該數據通過中斷?可能disable_irq延遲傳入中斷或只是直接跳過它

+0

儘可能使用DMA和假脫機字節。 – LPs

+0

這取決於您在關鍵部分禁用了多長時間的中斷。如果硬件完成第二個字節的接收,則可能是第一個字節消失了。 (可能有硬件緩衝保留了幾個字節,但很明顯在某些時候它們會丟失。)因此,要在非常短的時間內禁用中斷,或者如LP所說,使用不同的技術將數據從硬件到RAM,如DMA傳輸。 – Ross

+0

請在「答案」字段中查看我的意見:如果使用disable_irq,則發生硬件中斷似乎無法準確緩衝硬件中斷。 –

回答

0

一個設計正確的系統應該有中斷粘性(在它們一旦到達中斷控制器,它們就會被註冊,直到被服務)。

換言之,如果在禁用中斷的情況下發生中斷,則應在重新啓用中斷後立即觸發處理器。

那麼唯一的問題是,在數據丟失之前,您可以延遲服務中斷多長時間。這是每個外設的問題。有時候,設計者會將緩衝區/ FIFO放入其中,而其他時候則需要快速處理它或者可能會丟失數據。

+0

謝謝你的回答,Russ。 –

+0

謝謝你的回答,Russ。事實上,我今天提出了一個想法,假設硬件在disable_irq期間將不能存儲任何東西,我們必須始終處理硬件ISR並臨時存儲相關數據,並在稍後安全地處理這些數據,在一些操作系統中通常稱爲延期rountine。這種機制明顯增加了複雜性,但卻避免了丟失中斷相關數據的風險。 –

+0

對不起,我以前的帖子可能不準確,基本上延遲的ISR例程主要用於縮短ISR的處理時間,但不是重合問題。這裏的關鍵問題是,即使是在調用延遲例程的時候,實際的硬件中斷仍然可能發生(假設它可能隨時發生),因此除了禁用IRQ之外幾乎沒有辦法同步該過程。但在disable_irq期間,帶有IRQ的數據可能會丟失 –