[英]Preemption in FreeRTOS
我開始使用FreeRTOS,我想要一個中斷來搶占任何即將運行的任務,並運行我需要批判運行的任務。
有沒有辦法在FreeRTOS中做到這一點? (這是通過任務優先級來實現的嗎?)
沒有! 以上兩個答案都是危險的。
不要在ISR中使用taskENTER_CRITICAL()或taskEXIT_CRITICAL() - 在ISR中需要一個關鍵部分是不常見的,但是如果你這樣做則使用taskENTER_CRITICAL_FROM_ISR()/ taskEXIT_CRITICAL_FROM_ISR() 。 (可能AVR32端口是該規則的一個例外嗎?)
不要使用xTaskResumeFromISR()將任務與中斷同步。 已發布到該功能文檔的鏈接甚至說明了這一點。
如果我對您的問題的理解是正確的,您希望能夠讓中斷解鎖任務,然后如果該任務是能夠運行的最高優先級任務,則讓中斷直接返回到未阻止的任務。 如果我的理解是正確的,那么在下一頁上有一個如何以有效的方式做到這一點的例子: http : //www.freertos.org/RTOS_Task_Notification_As_Counting_Semaphore.html
您可以使用xTaskResumeFromISR執行此操作。
生成的任務有許多條件不被其他任務中斷(例如它的優先級必須足夠高)以及要滿足的許多其他條件,以確保不會中斷任何中斷(如產生的任務必須保證在下一次中斷之前完成)
簡短的回答是:是的,這是通過任務優先級來實現的。
在ISR完成后,FreeRTOS內核將考慮交換任何處於就緒狀態的任務,因此如果現在准備好更高優先級的任務,它將搶占當前正在運行的任務。
應該提到的是,只有通過FreeRTOS調用處理程序時才會出現這種情況。 在Cortex-A處理器上,IRQ或FIQ異常處理程序中有一個常見的IRQ入口點,很可能由FreeRTOS處理,或者由IRQ調度程序處理,IRQ調度程序很容易被FreeRTOS包裝,通常由端口層中的函數處理。名為vApplicationIRQHandler()。
在Cortex-M上不一定是這種情況,因為矢量通常由供應商的MCU API操縱。 在Cortex-M上,我使用ISR中的portYIELD_FROM_ISR()來保護它,這應該被實現為內核提供執行上下文切換的機會。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.