Совместимость кодов спецификаций ESP-IDF и FreeRTOS

#c #task #esp32 #freertos #esp-idf

#c #задача #esp32 #freertos #esp-idf

Вопрос:

Я пытался изучить ESP-IDF с помощью FreeRTOS, и когда я использую код из таблицы данных с минимальными изменениями (ССЫЛКА на код: Страница документации: 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 nn";
    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 nn";
    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 …

Комментарии:

1. Какое сообщение об ошибке вы получили перед перезапуском? Это может помочь, если вы поместите короткое vTaskDelay() замыкание в while(true) цикл, чтобы у планировщика была возможность что-то делать. Это помогло мне в аналогичной ситуации.

Ответ №1:

Вам не нужно вызывать vTaskStartScheduler , если вы используете ESP-IDF. На другой платформе это может отличаться. Он уже вызывается перед main() запуском (см. https://github.com/espressif/esp-idf/blob/master/components/freertos/xtensa/port.c#L619 ).

Если вы вызовете его снова, это вызовет проблемы, поскольку вы узнали на собственном горьком опыте.

Результат, как и ожидалось: задачи 1 и 2 печатают строку один раз в секунду.

Поскольку вы запустили их практически в одно и то же время, поскольку они выполняют одну и ту же работу и приостанавливаются на одинаковое количество времени, более или менее случайно, выводит ли задача 1 или задача 2 сообщение первой каждую секунду.