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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...