multithreading - 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 秒才能完成。
此代码执行第一个请求没有任何问题,但在执行第二个请求时,我得到了我上面提到的错误。
我的问题是如何解决执行队列中可用的任务的问题。
解决方案
我认为为此目的动态创建/删除任务不是最好的方法。为什么不保持任务运行只处理传入的请求?但是,最好使用vTaskDelete(NULL);
自删除任务。全局任务句柄可能会被重用/覆盖。此外,您似乎并不真的需要任务句柄。它是可选的xTaskCreate
,如果您对它不感兴趣,可以为句柄参数指定 NULL。你应该做一些错误检查;)
推荐阅读
- c# - 在 ASP.NET Core 3.1 中添加 IdentityUser 作为外键时创建的重复表
- c# - 在Datagridview C#中按按钮状态处理单击
- java - 在自定义 Spring 端点的单元测试期间 GET“连接被拒绝”上的 I/O 错误命中 Spring 控制器中的默认 swagger 端点
- javascript - Express GET 请求适用于本地服务器,但不适用于托管站点
- c# - 如何在统一中更快地进行动态 2D 碰撞?
- javascript - 使用'map'方法修改内部内容,javascript
- batch-file - 批量命名问题
- html - 为什么我的背景图片不显示
- json - Power BI - 如何在 Power Query 中组合来自另一个查询(表)的列中的所有值
- dns - 仅 PTR 记录;我可以在其中添加 TXT 记录吗?