2016-09-15 143 views
1

我正在使用ARM Cortex M4 MCU。如果我有優先級爲2的GPIO和優先級爲3的SPI驅動程序(即低於GPIO的優先級)的中斷處理程序,並且我從GPIO的中斷處理程序中調用(阻塞)SPI讀取,SPI功能是否工作?ARM Cortex-M4中斷優先級

+0

取決於是否所述函數將輪詢SPI控制器或等待中斷到達... – Notlikethat

+0

中斷處理程序中的阻塞讀取(或阻塞任何內容)是一個非常糟糕的主意。中斷應該始終儘可能快。 –

回答

2

回答你的問題,要看它是如何阻斷辦理過戶,作爲@Notlikethat說。

如果你的SPI驅動程序是一個輪詢驅動程序,那麼它很可能會工作。在這種情況下,您的GPIO中斷將在SPI外設內部的標誌上旋轉,等待傳輸的每個部分完成。

如果您的SPI驅動程序是中斷驅動的,那麼它將不起作用。由於您正在執行優先級2中斷(GPIO),所以優先級3中斷(SPI)將不會執行,直到GPIO中斷完成。根據您的SPI驅動程序的寫入方式,這可能會完全掛起您的系統,否則可能會導致超時。

如果你的SPI驅動程序DMA驅動,那麼答案不是那麼明確,取決於驅動程序是如何工作的。在這種情況下,您的事務可能會完成,但是如果該功能阻塞了等待DMA中斷,它可能永遠不會到達,這取決於它的優先級。

在上述任何一種情況下,一般會被認爲是不是一個好主意,這樣做中斷的裏面。如果你有一個RTOS,你可以使用一個等待信號量的高優先級任務來執行SPI事務,或者如果操作系統支持它,則使用延遲中斷處理。如果您沒有使用RTOS運行,我會考慮是否有方法可以發出較低優先級的中斷(即以最低優先級使用PendSV)或監視主進程內的標誌。使用較低優先級的中斷,您仍然可以搶佔主進程(如果這是需要的),但所有其他中斷可以繼續執行。如果你能在你的主要過程監控標誌,那麼這也將讓你的中斷繼續下去,但如果你有時間的限制,這可能不是儘可能(再次,這取決於你的應用程序的結構)

+0

我使用的MCU是沒有RTOS的Nordic nRF52。 I(將)的問題是我有一個SPI傳感器,每4ms有數據準備就緒,每個中斷將由SPI讀取並存儲在緩衝區中。讀取多個樣本後,數據將被處理。處理過程預計需要10ms。因此,在處理過程中預計會有2個樣本準備好並存儲(到雙緩衝區)。由於沒有RTOS,我需要以某種方式讓新數據讀取中斷搶佔處理處理程序。 持續 – tosa

+0

因此,我想讓SPI的讀入GPIO中斷處理程序直接發生,從而使數據處理功能可以由主(在較低的優先級)上運行。解決這個問題的最簡單(和強大的)方法是什麼?謝謝! – tosa

+0

根據你剛給我的數字,聽起來你不能跟上。如果每4毫秒,你將有新的數據需要10毫秒的處理,1秒鐘後,你將有一個150個樣本仍未處理的反向日誌。在什麼情況下進行處理?它是在一箇中斷中,還是在主進程中? – rjp