進入臨界保護(支援巢狀):taskenter_critical();
退出臨界保護(支援巢狀):taskexit_critical();
中斷裡進入臨界保護(支援巢狀): taskenter_critical_from_isr();
中斷裡退出臨界保護(支援巢狀): taskexit_critical_from_isr( x );
進入臨界保護的定義**:
從中可以看出,uxcriticalnesting++,正因為該變數的處理,才支援了巢狀。
退出臨界保護的定義**大同小異。
void vportentercritical( void )
繼續深入,可以看到,實際上是操作了 basepri暫存器來實現開關中斷的機理,而要關閉的中斷是哪些優先順序的中斷,則是由 configmax_syscall_interrupt_priority(如果用cubemxs生成的話預設是systick的優先順序)所決定。
configmax_syscall_interrupt_priority = configlibrary_max_syscall_interrupt_priority << 4,所有小於該優先順序的中斷都會被關斷。
static portforce_inline void vportraisebasepri( void )
在裸機中,開關中斷是下面兩個語句:
使能全域性中斷: __set_primask(0);
禁止全域性中斷: __set_primask(1);
要注意,因為 freertos 存在不受其控制的更高優先順序中斷,使用者需要根據實際情況進行特別處理,可以不採用 freertos 的開關中斷函式,而是直接使用__set_primask 實現全域性中斷的開關。
還要注意一點:使用臨界保護時,在排程器沒開始工作時,使用無效。有效的使用是在排程器開始工作後的任務裡選擇使用的。
FreeRTOS 臨界區總結
當一名嵌入式開發人員從裸機開發切換到 基於 freertos 的開發後就要注意 中斷,資源競爭等等問題了。下面,總結一下 freertos 臨界區的知識及用法 1.應用程式使用臨界區 1.1 深入剖析的方法 1.2 使用方法 2.中斷函式中臨界區 2.1 深入剖析的方法 2.2 使用方法 void ...
FreeRTOS臨界資源保護(臨界區保護)
臨界區未保護出現的異常 今天我們說說其中之一的原因 臨界資源未保護。我們先看個例子,假如有乙個5個節點單向鍊錶,如下結構 head 1 2 3 4 5 null 有一任務a在乙個單向鍊錶的2 3節點之間插入乙個新的2a節點,已經將2 2a,還未將2a 3,此時,鍊錶變為兩個未完整的部分,如下結構 h...
FreeRTOS臨界區相關函式
taskenter critical 和 taskexit critical 臨界區保護 實際上就是在taskenter critical 和taskexit critical 無法被中斷,常用在時序讀取一些感測器和晶元上 比如flash和eeprom上 taskenter critical 此處為...