ESP-IDF和FreeRTOS数据表CODE兼容性

问题描述

我试图通过FreeRTOS来学习ESP-IDF,并且当我使用数据表中的代码时所做的更改很小 (参考代码https://S3MediaVault.com第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",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,NULL);
}

获得的输出

Documentation



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

解决方法

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

如果再次调用它,则会导致问题,因为您已经学会了困难的方法。

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

几乎在同一时间启动它们,它们执行相同的工作并且暂停了相同的时间,因此任务1或任务2每秒首先打印该消息多少是随机的。 / p>

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...