ESP32 FreeRTOS任务不应返回



我使用多线程来逐个执行队列中可用的多个任务。一个任务结束后,我执行另一个任务,但在执行队列中的第二个任务时,我遇到了错误。

E (18470) FreeRTOS: FreeRTOS Task "taskTwo" should not return, Aborting now!

这是我的代码,

QueueHandle_t priorityTwoQue;
TaskHandle_t thTwo;
void receiveTaskDataFromSomeFunction() {
dataholder = (struct DataHolder *)malloc(sizeof(struct DataHolder));
extractData(jsonBuffer, dataholder);
jsonBuffer.clear();
SerialDebug.print("Requst Sending To Que");
xQueueSend(priorityTwoQue, &dataholder, portMAX_DELAY);
processQueue();

}
void processQueue() {
delay(100);
SerialDebug.println("Creating Task Prio 2");
xTaskCreate(taskPriorityTwo, "TaskTwo", 5000, NULL, 2, &thTwo);
}
void taskPriorityTwo(void * paramter) {
SerialDebug.println("Task Initiated");
threadTask(priorityTwoQue, "task2");
vTaskDelete(thTwo);
}

void threadTask(QueueHandle_t priorityQue, String taskName) {
struct DataHolder *taskdataholder;
xQueueReceive(priorityQue, &taskdataholder, portMAX_DELAY);
SerialDebug.print("Executing Task");
executeHttpRequest(taskdataholder);   
requestInProgress = false;
processQueue();
}

在上面的代码receiveTaskDataFromSomeFunction((中,每当收到新的任务请求时都会调用,在我的情况下,4个请求会以1秒的间隔逐一收到。因此,我把他们排到队列中。每个请求都作为一个http请求执行,需要5秒才能完成。

这段代码执行第一个请求没有任何问题,但在执行第二个请求时,我得到了上面提到的错误。

我的问题是如何解决一个接一个地执行队列中可用任务的问题。

我认为为此目的动态创建/删除任务不是最好的方法。为什么不让任务继续运行,只处理传入的请求呢?但是,最好使用vTaskDelete(NULL);自删除任务。全局任务句柄可能会被重新使用/覆盖。此外,你似乎并不真正需要任务句柄。它对于xTaskCreate是可选的,如果您不感兴趣,可以为句柄参数指定NULL。你应该做一些错误检查;(

在RTFreeOS手册中,它指出任务应该在无休止的循环中运行,所以永远不要终止。如高铁2号所述,如果它们确实终止,则需要使用vTaskDelete(NULL);删除它们。

另请参阅此问题/答案:FreeRTOS任务不应返回-ESP32

最新更新