ESP32 FreeRTOS动态创建删除任务遇阻,求解决方案
问题解决思路及优化方案
立即修复:移除start函数中的死循环
你的核心问题是startTask1和startCheckTask1里的for(;;)死循环完全多余,xTaskCreatePinnedToCore调用完成后,新任务已经被FreeRTOS调度器接管并开始运行,这两个start函数应该直接返回,主loop才能继续执行后续的startCheckTask1()。
修改后的start函数:
void startTask1(){ // 创建任务后直接返回,不要阻塞主流程 xTaskCreatePinnedToCore(Task1,"Task 1", 1024, NULL, 1, &hTask1, 1); } void startCheckTask1(){ xTaskCreatePinnedToCore(CheckTask1,"Check Task 1", 1024, NULL, 1, &hCheckTask1, 1); }
额外优化建议
规范任务删除逻辑
CheckTask里删除自己时,用vTaskDelete(NULL)更标准(NULL代表当前任务),无需手动传入自身句柄:// 替换原删除代码 vTaskDelete(hTask1); vTaskDelete(NULL); // 删除当前的CheckTask1避免重复创建任务
主loop触发任务创建后,立刻把触发条件置为false,防止主循环反复创建相同任务:if (some_condition_to_create_task_1){ startTask1(); startCheckTask1(); some_condition_to_create_task_1 = false; // 新增这行 }调整任务栈大小
1024字节的栈空间对于涉及LCD显示、模拟量读取的任务可能不足,建议增大到2048或4096,避免栈溢出导致的异常:xTaskCreatePinnedToCore(Task1,"Task 1", 2048, NULL, 1, &hTask1, 1);更安全的任务终止方式(可选)
直接删除任务不是最优雅的方式,可给Task1添加退出标志位,CheckTask计时结束后设置标志位,让Task1自行退出循环并清理资源:// 全局/静态变量,控制Task1退出 static bool task1_should_exit = false; void Task1(void *pvParameters) { (void) pvParameters; task1_should_exit = false; // 初始化标志位 while(!task1_should_exit){ readAnalogValue(); showOnDisplay(); vTaskDelay(500); } // 这里可添加硬件资源清理逻辑(如关闭继电器) vTaskDelete(NULL); // 自我删除 } void CheckTask1(void *pvParameters) { (void) pvParameters; vTaskDelay(5000); showResultOnDisplay(); task1_should_exit = true; // 通知Task1退出 vTaskDelete(NULL); // 自我删除 }任务优先级调整
若需保证CheckTask能及时执行,可将其优先级设为略高于Task1(比如2),避免被Task1长时间占用CPU:xTaskCreatePinnedToCore(CheckTask1,"Check Task 1", 2048, NULL, 2, &hCheckTask1, 1);
内容的提问来源于stack exchange,提问作者kxtronic
相关产品推荐
相关产品推荐

