OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4090|回复: 9

FreeRTOS实验疑问

[复制链接]

69

主题

289

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
1294
金钱
1294
注册时间
2013-3-14
在线时间
62 小时
发表于 2017-11-19 22:41:17 | 显示全部楼层 |阅读模式
本人做FreeRTOS任务创建删除实验时,遇到一个问题。代码如下:
//task1任务函数
void task1_task(void *pvParameters)
{
        u8 task1_num = 0;

        POINT_COLOR = BLACK;

        LCD_DrawRectangle(5,110,115,314);//画一个矩形
        LCD_DrawLine(5,130,115,130);//画线

        POINT_COLOR = BLUE;

        LCD_ShowString(6,111,110,16,16,"Task1 Run:000");

        while(1)
        {
                task1_num++;//任务执行1次加1
                LED0 = !LED0;

                printf("任务1已经执行:%d次\r\n",task1_num);

                if(task1_num == 5)
                {
                        vTaskDelete(Task2Task_Handler);//任务1执行5次后删除任务2
                        printf("任务1删除了任务2!\r\n");
                }

                LCD_Fill(6,131,114,313,lcd_discolor[task1_num%14]);//填充区域
                LCD_ShowxNum(86,111,task1_num,3,16,0x80);//显示任务执行次数
                vTaskDelay(1000);
        }
}


当TASK1执行了5次以后,删除了任务2,但是当task1_num到255时,第二次等于5时,系统死机了。
LCD显示:Task1 Run:004,打印信息如下:
任务1已经执行:255次
任务1已经执行:0次
任务1已经执行:1次
任务1已经执行:2次
任务1已经执行:3次
任务1已经执行:4次
任务1已经执行:5次


也就是说,一个任务删除两次,就会死在那里吗?


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2017-11-20 10:03:32 | 显示全部楼层
一个任务删除两次就会出问题,例程的bug,在删除任务的时候跑判断任务句柄是否无效,无效的时候再删除!也就是判断Task2Task_Handler是否等于NULL,不等于的时候才能删除
回复 支持 反对

使用道具 举报

69

主题

289

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
1294
金钱
1294
注册时间
2013-3-14
在线时间
62 小时
 楼主| 发表于 2017-11-20 21:00:20 | 显示全部楼层
zuozhongkai 发表于 2017-11-20 10:03
一个任务删除两次就会出问题,例程的bug,在删除任务的时候跑判断任务句柄是否无效,无效的时候再删除!也 ...

嗯嗯,谢谢!!!
回复 支持 反对

使用道具 举报

69

主题

289

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
1294
金钱
1294
注册时间
2013-3-14
在线时间
62 小时
 楼主| 发表于 2017-11-20 21:20:16 | 显示全部楼层

                if(task1_num == 10)
                {
                        if(Task2Task_Handler != NULL)
                        {
                                vTaskDelete(Task2Task_Handler);//任务1执行30次后恢复任务2
                                printf("任务1恢复了任务2!\r\n");
                        }
                }       

还是会死机啊。
回复 支持 反对

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2017-11-20 21:44:50 | 显示全部楼层
liuyongliuyong 发表于 2017-11-20 21:20
if(task1_num == 10)
                {
                        if(Task2Task_Handler != NULL)

第一次删除以后让Task2Task_Handler等于NULL试试。
开往春天的手扶拖拉机
回复 支持 反对

使用道具 举报

头像被屏蔽

88

主题

231

帖子

2

精华

高级会员

Rank: 4

积分
844
金钱
844
注册时间
2013-4-11
在线时间
40 小时
发表于 2017-11-20 22:17:12 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

69

主题

289

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
1294
金钱
1294
注册时间
2013-3-14
在线时间
62 小时
 楼主| 发表于 2017-11-22 20:51:47 | 显示全部楼层
nonplus 发表于 2017-11-20 22:17
看vTaskDelete函数,传进来的句柄并没对其操作,只是通过它进行判断

你要手工=NULL

好的,我试试哈。
回复 支持 反对

使用道具 举报

69

主题

289

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
1294
金钱
1294
注册时间
2013-3-14
在线时间
62 小时
 楼主| 发表于 2017-11-22 20:59:56 | 显示全部楼层

已经OK,谢谢!
回复 支持 反对

使用道具 举报

8

主题

569

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2363
金钱
2363
注册时间
2015-5-8
在线时间
320 小时
发表于 2017-11-22 21:01:55 | 显示全部楼层
学习了
回复 支持 反对

使用道具 举报

4

主题

24

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
340
金钱
340
注册时间
2017-12-6
在线时间
50 小时
发表于 2017-12-20 10:36:07 | 显示全部楼层
学习了,和释放内存一样,释放后要置为NULL
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 22:48

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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