FreeRTOS 調度鎖,任務鎖和中斷鎖
調度鎖
調度鎖就是 RTOS 提供的調度器開關函數,如果某個任務調用了調度鎖開關函數,處於調度鎖開和調
度鎖關之間的代碼在執行期間是不會被高優先級的任務搶占的,即任務調度被禁止。這一點要跟臨界段的
作用區分開,調度鎖只是禁止了任務調度,並沒有關閉任何中斷,中斷還是正常執行的。而臨界段進行了
開關中斷操作。
中斷鎖
中斷鎖就是 RTOS 提供的開關中斷函數,FreeRTOS 沒有專門的中斷鎖函數,使用 前一節裏面介
紹的中斷服務程序臨界段處理函數就可以實現同樣效果。
任務鎖
簡單的說,為了防止當前任務的執行被其它高優先級的任務打斷而提供的鎖機制就是任務鎖。
FreeRTOS 也沒有專門的任務鎖函數,但是使用 FreeRTOS 現有的功能有兩種實現方法:
? 通過給調度器加鎖實現
利用 FreeRTOS 的調度鎖功能給調度器加鎖的話,將關閉任務切換功能,從而高優先級任務也就無法
搶占低優先級任務的執行,同時高優先級任務也是無法向低優先級任務切換的。 另外特別註意,調度
鎖只是禁止了調度器工作,並沒有關閉任何中斷。
? 通過關閉任務切換中斷 PendSV 和系統時鐘節拍中斷 Systick
利用 FreeRTOS 的任務代碼臨界段處理函數就可以關閉 PendSV 中斷和 Systick 中斷。因為進入臨界
段前,操作寄存器 basepri 關閉了所有小於等於宏定義
configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 所定義的中斷優先級(
的 PendSV 中斷和滴答定時器中斷是最低優先級中斷,所以也是被關閉的),這樣低優先級任務在執
行臨界段代碼期間是不會被高優先級任務打斷的,從而就實現了任務鎖的效果。
FreeRTOS 調度鎖開啟
使用如下函數可以實現 FreeRTOS 的調度鎖開啟:
? vTaskSuspendAll()
函數原型:
void vTaskSuspendAll( void );
函數描述:
函數 vTaskSuspendAll 用於實現 FreeRTOS 調度鎖開啟。
使用這個函數要註意以下問題:
1. 調度鎖函數只是禁止了任務調度,並沒有關閉任何中斷。
2. 調度鎖開啟函數 vTaskSuspendAll 和調度鎖關閉函數 xTaskResumeAll 一定要成對使用
3. 切不可在調度鎖開啟函數 vTaskSuspendAll 和調度鎖關閉函數 xTaskResumeAll 之間調用任何會引起任務切換的 API,比如 vTaskDelayUntil、 vTaskDelay、 xQueueSend 等。
FreeRTOS 調度鎖關閉
使用如下函數可以實現 FreeRTOS 的調度鎖關閉:
? xTaskResumeAll ()
函數原型:
BaseType_t xTaskResumeAll(void)
函數描述:
函數 xTaskResumeAll 用於實現 FreeRTOS 調度鎖關閉
? 調度鎖關閉後,如果需要任務切換,此函數返回 pdTRUE,否則返回 pdFALSE。
使用這個函數要註意以下問題:
1. 調度鎖函數只是禁止了任務調度,並沒有關閉任何中斷。
2. 調度鎖開啟函數 vTaskSuspendAll 和調度鎖關閉函數 xTaskResumeAll 一定要成對使用。
3. 切不可在調度鎖開啟函數 vTaskSuspendAll 和調度鎖關閉函數 xTaskResumeAll 之間調用任何會引起任務切換的 API,比如 vTaskDelayUntil、 vTaskDelay、 xQueueSend 等。
FreeRTOS 調度鎖,任務鎖和中斷鎖