如何解决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(),在我的情况下,以1秒的间隔一个接一个地接收4个请求。因此,我将它们放入队列。每个请求都将作为http请求执行,这需要5秒钟才能完成。
这段代码可以毫无问题地执行第一个请求,但是执行第二个请求时,我得到了上面提到的错误。
我的问题是我该如何解决逐个执行队列中可用任务的问题。
解决方法
我认为为此目的动态创建/删除任务不是最佳方法。为什么不让任务仅在处理传入请求时运行?
但是,最好使用FunctionDef(identifier name,arguments args,stmt* body,expr* decorator_list,expr? returns)
自删除任务。
全局任务句柄可能会被重用/覆盖。而且看来您确实不需要任务句柄。 vTaskDelete(NULL);
是可选的,如果您不感兴趣,可以为handle参数指定NULL。
并且您应该进行一些错误检查;)
在RTFreeOS manual中指出,任务应该无限循环地运行,因此永远不要终止。如果它们确实终止了,则需要使用vTaskDelete(NULL);
将其删除,如HS2所述。
另请参阅以下问题/答案:FreeRTOS Task should not return - ESP32
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。