#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);
}
Полученный результат равен
- Я хочу узнать, почему первый код, показанный в таблице данных, не сработал .
- Почему второй код не ведет себя как 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 сообщение первой каждую секунду.