簡體   English   中英

FreeRTOS中的搶占

[英]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執行此操作。

生成的任務有許多條件不被其他任務中斷(例如它的優先級必須足夠高)以及要滿足的許多其他條件,以確保不會中斷任何中斷(如產生的任務必須保證在下一次中斷之前完成)

1.啟用搶占:

這很簡單。

FreeRTOS的所有配置選項都在“FreeRTOSConfig.h”下

#define configUSE_PREEMPTION                    1

您可以將此值設置為1以使用搶占式RTOS調度程序,或者將0設置為使用協作RTOS調度程序。

請查看此鏈接以獲取更多信息

2.在ISR中使用關鍵部分

void taskENTER_CRITICAL( void );
//action

void taskEXIT_CRITICAL( void );

RTOS在這個關鍵部分內不會做任何額外的事情

參考: 這里

簡短的回答是:是的,這是通過任務優先級來實現的。

在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM