【问题标题】:FreeRTOS initial context switchFreeRTOS 初始上下文切换
【发布时间】:2017-03-25 07:26:42
【问题描述】:

我正在尝试理解 freeRTOS 上一个简单的 2 任务模型的工作流程。为了清楚起见,添加伪代码,

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

主要

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 函数中创建的,那么会调用调度程序(成功创建所有任务)。如果在创建任务之前未调用调度程序,将如何执行对调度程序的调用?或者简单地说,当执行从 main 开始时,是什么导致控制从 Task_A 和 Task_B 出来,以便稍后调用调度程序?如果我的理解有缺陷,请纠正我。

【问题讨论】:

  • 我根本不清楚你在问什么。请编辑问题以提供更多信息,也许添加伪代码以澄清您感到困惑的地方。

标签: operating-system kernel embedded scheduling freertos


【解决方案1】:

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

在您的示例中,main 正在执行。它调用构建和初始化任务数据结构的任务创建例程。它不运行任务,而是返回到main。然后main 再次调用任务创建例程并再次返回到main。最后main 调用调度程序,调度程序选择准备运行的最高优先级任务并开始执行该任务。调度器不返回main

【讨论】:

    【解决方案2】:

    第一个 main 开始执行。它调用 xTaskCreate,它将只创建任务 1(处于就绪状态)并返回到 main,它再次调用 xTaskCreate,它只创建一个任务 2(处于就绪状态)并返回。执行 vTaskStartScheduler() 后,调度器将根据优先级(选择的调度算法)调度这两个任务。最高优先级的任务将首先从就绪状态进入运行状态并开始执行作为参数传递的任务函数(TaskA 或 TaskB)在调用 xTaskCreate 时。

    【讨论】:

      【解决方案3】:

      任务在创建时不会开始执行,但是无论调度程序是否正在运行,您都可以在创建后立即处理其 TaskHandle_t 指针。为此,必须将“*TaskHandle_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 用于传回一个句柄,通过该句柄可以引用创建的任务。

      【讨论】:

        猜你喜欢
        • 2017-06-13
        • 1970-01-01
        • 1970-01-01
        • 2011-07-05
        • 2017-08-11
        • 2021-12-22
        • 2015-09-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多