Operating system FreeRTOS初始上下文切换

Operating system FreeRTOS初始上下文切换,operating-system,kernel,embedded,scheduling,freertos,Operating System,Kernel,Embedded,Scheduling,Freertos,我试图理解freeRTOS上一个简单的2任务模型的工作流程。为清晰起见,添加了psuedo代码 任务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

我试图理解freeRTOS上一个简单的2任务模型的工作流程。为清晰起见,添加了psuedo代码

任务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 );    
    }
}
任务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 );
    }
}
主要


假设两个任务(比如Task_A和Task_B)都是在主函数中创建的,则会调用调度程序(在所有任务创建之后)。如果在创建任务之前未调用调度程序,将如何执行对调度程序的调用?或者简单地说,当执行从main开始时,是什么导致控制从Task_A和Task_B出来,以便稍后调用调度程序?如果我的理解有缺陷,请纠正我

任务在创建时不会开始执行。创建任务只是将调度器需要了解的有关任务的数据结构和信息放置到位。在计划程序运行其中一个任务之前,这些任务不会开始执行


在您的示例中,
main
正在执行。它调用任务创建例程,该例程构建并初始化任务数据结构。它不运行任务,而是返回到
main
。然后,
main
再次调用任务创建例程,并再次返回到
main
。最后,
main
调用调度程序,调度程序选择准备运行的最高优先级任务并开始执行该任务。调度程序不会返回到
main
第一个main开始执行。它调用xTaskCreate,只创建任务1(处于就绪状态),然后返回main,后者再次调用xTaskCreate,只创建任务2(处于就绪状态),并返回。执行vTaskStartScheduler()后,调度器将根据优先级(选定的调度算法)调度这两个任务。优先级最高的任务将首先从就绪状态转到运行状态,并开始执行任务功能(TaskA或TaskB)在调用xTaskCreate时作为参数传递。

任务在创建时不会开始执行,但您可以在创建任务后立即处理其TaskHandle\t指针,无论计划程序是否正在运行。为此,必须将“*TaskHandle\u t*const变量”作为xTaskCreate函数的第6个参数传递

    BaseType_t xTaskCreate( TaskFunction_t pxTaskCode,
                            const char * const pcName,
                            const uint16_t usStackDepth,
                            void * const pvParameters,
                            UBaseType_t uxPriority,
                            TaskHandle_t * const pxCreatedTask )
pxCreatedTask用于传回一个句柄,创建的任务可以通过该句柄引用


我一点也不清楚你在问什么。请编辑该问题以提供更多信息,或者添加伪代码以澄清您的困惑。
    BaseType_t xTaskCreate( TaskFunction_t pxTaskCode,
                            const char * const pcName,
                            const uint16_t usStackDepth,
                            void * const pvParameters,
                            UBaseType_t uxPriority,
                            TaskHandle_t * const pxCreatedTask )