0

我试图用 FreeRTOS 学习 ESP-IDF,当我使用数据表中的代码时,更改非常小(参考代码:文档页面:53 和 54。董事会正在重新启动。

#include <stdio.h>

#include "freertos/FreeRTOS.h"
#include "freertos/task.h"

void vTask1(void* pvParameters){
    const char* pcTaskName = "Task 1 is running \n";
    for(;;){
        printf(pcTaskName);
        vTaskDelay(1000/ portTICK_PERIOD_MS);
    }
}

void vTask2(void* pvParameters){
    const char* pcTaskName = "Task 2 is running \n\n";
    for(;;){
        printf(pcTaskName);
        vTaskDelay(1000/ portTICK_PERIOD_MS);
    }
}



void app_main(void){
    xTaskCreate( vTask1,
                 "TASK 1",
                 1000,
                 NULL,
                 1,
                 NULL );
    xTaskCreate( vTask2, "TASK 2", 1000, NULL, 1, NULL);
    vTaskStartScheduler();
    while(true);
}


现在,当我删除了vTaskStartScheduler()和无穷大的 while 循环时。程序没有重新启动,但输出不如预期。 使用的代码

#include <stdio.h>

#include "freertos/FreeRTOS.h"
#include "freertos/task.h"

void vTask1(void* pvParameters){
    const char* pcTaskName = "Task 1 is running \n";
    for(;;){
        printf(pcTaskName);
        vTaskDelay(1000/ portTICK_PERIOD_MS);
    }
}

void vTask2(void* pvParameters){
    const char* pcTaskName = "Task 2 is running \n\n";
    for(;;){
        printf(pcTaskName);
        vTaskDelay(1000/ portTICK_PERIOD_MS);
    }
}



void app_main(void){
    xTaskCreate( vTask1,
                 "TASK 1",
                 1000,
                 NULL,
                 1,
                 NULL );
    xTaskCreate( vTask2, "TASK 2", 1000, NULL, 1, NULL);
}

得到的输出是

在此处输入图像描述



  1. 我想了解为什么数据表中显示的第一个代码不起作用。
  2. 为什么第二个代码的行为不像 Task1->Task2 - Task1->Task2 ...
4

1 回答 1

2

vTaskStartScheduler如果您使用的是 ESP-IDF,则无需致电。在其他平台上可能会有所不同。它已经在main()开始之前被调用(参见https://github.com/espressif/esp-idf/blob/master/components/freertos/xtensa/port.c#L619)。

如果你再次调用它,它会导致问题,因为你已经学会了艰难的方式。

输出如预期:任务 1 和 2 每秒打印一行。

由于您几乎在同一时间启动它们,当它们执行相同的工作并且它们暂停相同的时间时,任务 1 或任务 2 是否每秒首先打印消息或多或少是随机的。

于 2020-10-13T07:53:13.397 回答