我開始使用FreeRTOS的,我想一箇中斷搶佔任何任務正要就跑我需要辯運行的任務。有沒有辦法在FreeRTOS操作系統做到這一點(這是通過以下實現任務的優先級?)搶佔在FreeRTOS操作系統
有人點我一個例子。
在此先感謝。
我開始使用FreeRTOS的,我想一箇中斷搶佔任何任務正要就跑我需要辯運行的任務。有沒有辦法在FreeRTOS操作系統做到這一點(這是通過以下實現任務的優先級?)搶佔在FreeRTOS操作系統
有人點我一個例子。
在此先感謝。
您可以使用xTaskResumeFromISR做到這一點。
要使滿足的任務不被其他任務中斷(比如它的優先級必須足夠高)以及許多其他要滿足的條件以確保沒有中斷可以發生-serviced(如產生任務必須保證在下一個中斷前完成)
NO !上述答案都是危險的。
不要在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
簡短答案是:是的,這是通過任務優先級來實現的。
的FreeRTOS的內核會考慮任何任務交換處於就緒狀態的ISR完成後,所以它會搶佔當前運行的任務,如果一個高優先級任務現在已準備就緒。
應該提到的是,這真的是唯一真正的,如果處理程序是通過FreeRTOS的調用。在Cortex-A處理器上,IRQ或FIQ異常處理程序中有一個共同的IRQ入口點,它很可能由FreeRTOS處理,或者由IRQ調度程序處理,該處理程序很容易被FreeRTOS包裝,通常由端口層中的函數稱爲vApplicationIRQHandler()。
在Cortex-M上,情況並非一定如此,因爲矢量通常由供應商的MCU API操縱。在Cortex-M上,我會安全地使用ISR中的portYIELD_FROM_ISR()來防止這種情況發生,這應該被實現來爲內核提供執行上下文切換的機會。
是的,謝謝!這正是我所期待的。我會嘗試實施這個例子,看看事情是否有效。感謝您的幫助。 – Godspped