我正在使用ARM Cortex M4 MCU。如果我有優先級爲2的GPIO和優先級爲3的SPI驅動程序(即低於GPIO的優先級)的中斷處理程序,並且我從GPIO的中斷處理程序中調用(阻塞)SPI讀取,SPI功能是否工作?ARM Cortex-M4中斷優先級
回答
回答你的問題,要看它是如何阻斷辦理過戶,作爲@Notlikethat說。
如果你的SPI驅動程序是一個輪詢驅動程序,那麼它很可能會工作。在這種情況下,您的GPIO中斷將在SPI外設內部的標誌上旋轉,等待傳輸的每個部分完成。
如果您的SPI驅動程序是中斷驅動的,那麼它將不起作用。由於您正在執行優先級2中斷(GPIO),所以優先級3中斷(SPI)將不會執行,直到GPIO中斷完成。根據您的SPI驅動程序的寫入方式,這可能會完全掛起您的系統,否則可能會導致超時。
如果你的SPI驅動程序DMA驅動,那麼答案不是那麼明確,取決於驅動程序是如何工作的。在這種情況下,您的事務可能會完成,但是如果該功能阻塞了等待DMA中斷,它可能永遠不會到達,這取決於它的優先級。
在上述任何一種情況下,一般會被認爲是不是一個好主意,這樣做中斷的裏面。如果你有一個RTOS,你可以使用一個等待信號量的高優先級任務來執行SPI事務,或者如果操作系統支持它,則使用延遲中斷處理。如果您沒有使用RTOS運行,我會考慮是否有方法可以發出較低優先級的中斷(即以最低優先級使用PendSV)或監視主進程內的標誌。使用較低優先級的中斷,您仍然可以搶佔主進程(如果這是需要的),但所有其他中斷可以繼續執行。如果你能在你的主要過程監控標誌,那麼這也將讓你的中斷繼續下去,但如果你有時間的限制,這可能不是儘可能(再次,這取決於你的應用程序的結構)
我使用的MCU是沒有RTOS的Nordic nRF52。 I(將)的問題是我有一個SPI傳感器,每4ms有數據準備就緒,每個中斷將由SPI讀取並存儲在緩衝區中。讀取多個樣本後,數據將被處理。處理過程預計需要10ms。因此,在處理過程中預計會有2個樣本準備好並存儲(到雙緩衝區)。由於沒有RTOS,我需要以某種方式讓新數據讀取中斷搶佔處理處理程序。 持續 – tosa
因此,我想讓SPI的讀入GPIO中斷處理程序直接發生,從而使數據處理功能可以由主(在較低的優先級)上運行。解決這個問題的最簡單(和強大的)方法是什麼?謝謝! – tosa
根據你剛給我的數字,聽起來你不能跟上。如果每4毫秒,你將有新的數據需要10毫秒的處理,1秒鐘後,你將有一個150個樣本仍未處理的反向日誌。在什麼情況下進行處理?它是在一箇中斷中,還是在主進程中? – rjp
- 1. ARM中的中斷優先級
- 2. Linux APIC中斷優先級
- 3. 優先級和優先級
- 4. 優先級隊列中的優先級
- 5. 如何更改串行驅動程序的中斷優先級,使其優先級高於以太網中斷?
- 6. 優先上傳優先級,以高優先級使用HTB qdiscs
- 7. 更改運行中斷處理程序的優先級級別?
- 8. 優先級
- 9. C++函數中非常奇怪的優先級/優先級
- 10. 優先中斷屬性
- 11. 流程優先與線程優先級
- 12. DB2中的優先級
- 13. 解析中的優先級
- 14. Rails3中路由優先級
- 15. Java中的優先級隊列中斷刪除重複元素
- 16. 如何在Arduino中設置中斷優先級?
- 17. 設置優先級
- 18. 優先級隊列
- 19. 基於優先級
- 20. 優先級反轉
- 21. 優先級:圖像
- 22. MySQL的優先級
- 23. CSS類優先級
- 24. 優先級反轉
- 25. 線程優先級
- 26. 基於優先級
- 27. ActiveMQ的優先級
- 28. 微控制器中斷優先級改變
- 29. SVA斷言中鏈式一元運算符的優先級
- 30. AFNetworking:中斷較高優先級請求的後臺請求
取決於是否所述函數將輪詢SPI控制器或等待中斷到達... – Notlikethat
中斷處理程序中的阻塞讀取(或阻塞任何內容)是一個非常糟糕的主意。中斷應該始終儘可能快。 –