FreeRTOS 調(diào)度鎖,任務(wù)鎖和中斷鎖
1?調(diào)度鎖
????調(diào)度鎖就是 RTOS 提供的調(diào)度器開關(guān)函數(shù)。
????如果某個(gè)任務(wù)調(diào)用了調(diào)度鎖,處于調(diào)度鎖開和調(diào)度鎖關(guān)之間的代碼在執(zhí)行期間是不會(huì)被高優(yōu)先級(jí)的任務(wù)搶占的,即任務(wù)調(diào)度被禁止。這一點(diǎn)要跟臨界段的作用區(qū)分開,調(diào)度鎖只是禁止了任務(wù)調(diào)度,并沒有關(guān)閉任何中斷,中斷還是正常執(zhí)行的。而臨界段進(jìn)行了開關(guān)中斷操作。
????
2 中斷鎖?
FreeRTOS 沒有專門的中斷鎖函數(shù)
中斷服務(wù)程序臨界段處理函數(shù)就可以實(shí)現(xiàn)同樣效果。
3?任務(wù)鎖
為了防止當(dāng)前任務(wù)的執(zhí)行被其它高優(yōu)先級(jí)的任務(wù)打斷而提供的鎖機(jī)制就是任務(wù)鎖。
FreeRTOS 也沒有專門的任務(wù)鎖函數(shù),但是使用 FreeRTOS 現(xiàn)有的功能有兩種實(shí)現(xiàn)方法:
◆ 通過給調(diào)度器加鎖實(shí)現(xiàn)
????利用 FreeRTOS 的調(diào)度鎖功能給調(diào)度器加鎖的話,將關(guān)閉任務(wù)切換功能。
????另外特別注意,調(diào)度鎖只是禁止了調(diào)度器工作,并沒有關(guān)閉任何中斷。
◆ 通過關(guān)閉任務(wù)切換中斷 PendSV 和系統(tǒng)時(shí)鐘節(jié)拍中斷 Systick
????利用 FreeRTOS 的任務(wù)代碼臨界段處理函數(shù)就可以關(guān)閉 PendSV 中斷和 Systick 中斷。
因?yàn)檫M(jìn)入臨界段前,操作寄存器 basepri 關(guān)閉了所有小于等于宏定義
configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY ????所定義的中斷優(yōu)先級(jí)。
4?FreeRTOS 調(diào)度鎖開啟
使用這個(gè)函數(shù)要注意以下問題:?
1. 調(diào)度鎖函數(shù)只是禁止了任務(wù)調(diào)度,并沒有關(guān)閉任何中斷。?
2. 調(diào)度鎖開啟函數(shù) vTaskSuspendAll 和調(diào)度鎖關(guān)閉函數(shù) xTaskResumeAll 一定要成對(duì)使用。
3. 切不可在調(diào)度鎖開啟函數(shù) vTaskSuspendAll 和調(diào)度鎖關(guān)閉函數(shù) xTaskResumeAll 之間調(diào)用任何會(huì)引起任務(wù)切換的 API,比如 vTaskDelayUntil、vTaskDelay、xQueueSend 等。
5?FreeRTOS 調(diào)度鎖關(guān)閉
◆ 調(diào)度鎖關(guān)閉后,如果需要任務(wù)切換,此函數(shù)返回 pdTRUE,否則返回 pdFALSE。
????taskYIELD()用于請(qǐng)求切換到另一個(gè)任務(wù)。
????但是,如果沒有其他任務(wù)的優(yōu)先級(jí)高于或等于調(diào)用taskYIELD()的任務(wù),則RTOS調(diào)度程序只需選擇調(diào)用taskYILELD()任務(wù)即可再次運(yùn)行。
????如果configUSE_PREEMPTION設(shè)置為1,則RTOS調(diào)度程序?qū)⑹冀K運(yùn)行能夠運(yùn)行的最高優(yōu)先級(jí)任務(wù),因此調(diào)用taskYIELD()不會(huì)導(dǎo)致切換到更高優(yōu)先級(jí)的任務(wù)。
注意:這樣就是說可以切換到同優(yōu)先級(jí)的任務(wù),而FreeRTOS支持同優(yōu)先級(jí)任務(wù),這點(diǎn)需要注意,程序驗(yàn)證是可以切換到同優(yōu)先級(jí)的,
????