2016-11-11 34 views
3

我試圖理解freeRTOS上的簡單2任務模型的工作流程。添加了清晰的僞代碼,FreeRTOS初始上下文切換

Task_A

void Task_A(void *pvParameters) 
{ 
const char *pcTaskName = "Task_A is running\r\n"; 
    for(;;) 
    { 
    vPrintString(pcTaskName); 
    /* Delay for a period. */ 
    vTaskDelay(250/portTICK_RATE_MS);  
    } 
} 

Task_B

void Task_B(void *pvParameters) 
{ 
const char *pcTaskName = "Task_B is running\r\n"; 
volatile unsigned long ul; 
    for(;;) 
    { 
    vPrintString(pcTaskName); 
    /* Delay for a period. */ 
    vTaskDelay(250/portTICK_RATE_MS); 
    } 
} 

主要

int main(void) 
{ 
    xTaskCreate(Task_A, "Task 1", 1000, NULL, 1, NULL); 
    xTaskCreate(Task_B, "Task 2", 1000, NULL, 1, NULL); 
/* Start the scheduler so the tasks start executing. */ 
vTaskStartScheduler(); 
    for(;;); 
} 

假設這兩個任務,說Task_A和Task_B在主函數中創建一個調用調度程序給出(成功完成所有任務)。如果調度程序在創建任務之前未被調用,那麼將如何執行對調度程序的調用?或者簡單地說,當執行從main開始時,是什麼導致控制從Task_A和Task_B出來,以便稍後調用調度器?如果我的理解有缺陷,請糾正我。

+1

我一點也不清楚你在問什麼。請編輯問題以提供更多信息,或許添加僞代碼以澄清您感到困惑的地方。 – Ross

回答

4

任務在創建時不會開始執行。創建任務只是簡單地將調度程序需要了解的任務的數據結構和信息放入位置。直到調度程序運行其中一個任務,任務纔開始執行。

在您的示例main正在執行。它調用構建和初始化任務數據結構的任務創建例程。它不運行任務,而是返回到main。然後main再次調用任務創建例程,並再次返回main。最後,main調用調度程序,調度程序選擇準備運行並開始執行該任務的最高優先級任務。調度程序不會返回到main

1

第一主開始executing.It給予xTaskCreate通話將只能創建任務1(就緒狀態),並返回到主再次給予xTaskCreate通話只創建一個任務2(就緒狀態),並返回。執行vTaskStartScheduler()後,調度程序將根據優先級調度兩個任務(所選擇的調度算法)。最高優先級的任務將首先從就緒狀態變爲運行狀態,並開始執行任務功能(TaskA或TaskB)參數,同時調用xTaskCreate。