caicaptain2 发表于 2023-4-4 11:39:57

FreeRTOS的vTaskDelete()踩坑指南


任务删除函数很少有人使用,网站也找不到可靠的案列,引发了一系列的问题。
由于FreeRTOS没有任务的reset功能,只好只用任务的动态创建-删除-创建-删除的方法。
本来的功能是,按一个键,就创建任务,按另一个键就删除任务。 如果删除任务的按键多按几次,程序就会跑飞崩溃。



产生问题的缘由是,vTaskDelete(Htask) 执行后,Htask不会赋值为NULL。如果不小心执行了2次删除,程序会跑飞崩溃。


情况1: 在本任务Htask中执行vTaskDelete(NULL),删除自己,一定要先Htask=NULL,再执行vTaskDelete(NULL)。
情况2:在其他任务中执行vTaskDelete(Htask),一定要先判断(Htask!=NULL) ,再执行vTaskDelete(Htask),还要再跟上一句Htask=NULL。
因为,当初创建Htask的时候未必成功,删除任务后,要手动给任务句柄赋值NULL。








tcs_stm32 发表于 2023-4-4 18:01:21

这个就和用malloc free差不多,可能多次free

diiiiiii 发表于 2023-4-4 18:11:19

esp32就是这样做的。

gjeoi 发表于 2023-4-4 19:37:01

freertos官方文档有详细注解。链接如下:https://www.freertos.org/a00126.html

caicaptain2 发表于 2023-4-6 09:37:15

gjeoi 发表于 2023-4-4 19:37
freertos官方文档有详细注解。链接如下:https://www.freertos.org/a00126.html

这个官方的说明,我反复看了好几遍了。 它只是要求不能饿死了idle task。 有几个关键的要求没有说明。
1, 执行delete后,官方函数应当把任务句柄标记NULL的。 这个函数没有返回参数,用户无法知道是否正确执行了。
2, “任务分配的内存”需要自己删除。这里,不清楚指哪些内存? 任务函数中malloc的内存(在heap中)肯定要自己清除,但是任务中定义的局部变量(在stack中)呢?

gjeoi 发表于 2023-4-6 10:57:09

caicaptain2 发表于 2023-4-6 09:37
这个官方的说明,我反复看了好几遍了。 它只是要求不能饿死了idle task。 有几个关键的要求没有说明。
1 ...

1. 我的理解是 vtaskdelete 是对task挂起并打上tag。真正删除的动作实在idle里面(没去对照源码,可能有误。
    最好不要重复创建删除,换一种设计方式。如果一定要这样,我有一些想法但是没有验证过:比如删除之后查询任务的状态又或者是直接jump到task的开头

2. task stack 应该是在idle里面删除

Eason.XJ 发表于 2023-4-9 14:24:44

受教了,今天刚好用到,这么一说这个问题还真不能小瞧。

怎么又出Bug了 发表于 5 天前

你好,为什么我的 vTaskDelete 在任务三执行一次删除任务1的时候,就会把任务2一起删除,为什么会这样?

怎么又出Bug了 发表于 5 天前

本帖最后由 怎么又出Bug了 于 2024-5-11 13:24 编辑

void 任务1()
{
    code。
    TaskDelay(500);
}
void 任务2()
{
   code。
    taskDelay(500);
}

void 任务3()
{
   if(按键)
    {
         if(任务1句柄 != null)
          taskdelete(任务1)
          任务1句柄 = null;
   }
}
页: [1]
查看完整版本: FreeRTOS的vTaskDelete()踩坑指南