首页 > 解决方案 > 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 秒才能完成。

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

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

标签: multithreadingarduinomultitaskingesp32freertos

解决方案


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


推荐阅读