硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1215|回复: 6
收起左侧

[FreeRTOS] FreeRTOS的vTaskDelete()踩坑指南

[复制链接]

334

主题

2032

回帖

3039

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3039
发表于 2023-4-4 11:39:57 | 显示全部楼层 |阅读模式

任务删除函数很少有人使用,网站也找不到可靠的案列,引发了一系列的问题。
由于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。








回复

使用道具 举报

8

主题

135

回帖

159

积分

初级会员

积分
159
发表于 2023-4-4 18:01:21 | 显示全部楼层
这个就和用malloc free差不多,可能多次free
回复

使用道具 举报

33

主题

203

回帖

302

积分

高级会员

积分
302
发表于 2023-4-4 18:11:19 | 显示全部楼层
esp32就是这样做的。
回复

使用道具 举报

3

主题

75

回帖

84

积分

初级会员

积分
84
发表于 2023-4-4 19:37:01 | 显示全部楼层
freertos官方文档有详细注解。链接如下:https://www.freertos.org/a00126.html
Snipaste_2023-04-04_19-36-14.png
回复

使用道具 举报

334

主题

2032

回帖

3039

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3039
 楼主| 发表于 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中)呢?
回复

使用道具 举报

3

主题

75

回帖

84

积分

初级会员

积分
84
发表于 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里面删除
回复

使用道具 举报

3

主题

21

回帖

30

积分

新手上路

积分
30
发表于 2023-4-9 14:24:44 | 显示全部楼层
受教了,今天刚好用到,这么一说这个问题还真不能小瞧。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-26 12:38 , Processed in 0.175268 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表