FreeRTOS臨界區操作

2021-10-04 17:12:46 字數 908 閱讀 7441

進入臨界保護(支援巢狀):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 此處為...