2016-10-09 67 views
2

我開始使用FreeRTOS的,我想一箇中斷搶佔任何任務正要就跑我需要辯運行的任務。有沒有辦法在FreeRTOS操作系統做到這一點(這是通過以下實現任務的優先級?)搶佔在FreeRTOS操作系統

有人點我一個例子。

在此先感謝。

回答

1

您可以使用xTaskResumeFromISR做到這一點。

要使滿足的任務不被其他任務中斷(比如它的優先級必須足夠高)以及許多其他要滿足的條件以確保沒有中斷可以發生-serviced(如產生任務必須保證在下一個中斷前完成)

1

1.搶佔方式:

這是很簡單的事。

FreeRTOS中所有的配置選項下的「FreeRTOSConfig.h中」

#define configUSE_PREEMPTION     1 

您可以設置爲1使用RTOS搶佔式調度,或0使用合作RTOS調度。

檢查this link更多信息

2.使用內部ISR關鍵部分

void taskENTER_CRITICAL(void); 
//action 

void taskEXIT_CRITICAL(void); 

RTOS不會做anythis這個關鍵部分

裁判裏面還有:here

3

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

+0

是的,謝謝!這正是我所期待的。我會嘗試實施這個例子,看看事情是否有效。感謝您的幫助。 – Godspped

0

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

的FreeRTOS的內核會考慮任何任務交換處於就緒狀態的ISR完成後,所以它會搶佔當前運行的任務,如果一個高優先級任務現在已準備就緒。

應該提到的是,這真的是唯一真正的,如果處理程序是通過FreeRTOS的調用。在Cortex-A處理器上,IRQ或FIQ異常處理程序中有一個共同的IRQ入口點,它很可能由FreeRTOS處理,或者由IRQ調度程序處理,該處理程序很容易被FreeRTOS包裝,通常由端口層中的函數稱爲vApplicationIRQHandler()。

在Cortex-M上,情況並非一定如此,因爲矢量通常由供應商的MCU API操縱。在Cortex-M上,我會安全地使用ISR中的portYIELD_FROM_ISR()來防止這種情況發生,這應該被實現來爲內核提供執行上下文切換的機會。