OpenEdv-开源电子网

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

ucosiii 一个任务异常不运行

[复制链接]

8

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
118
金钱
118
注册时间
2015-9-7
在线时间
8 小时
发表于 2018-5-9 09:45:47 | 显示全部楼层 |阅读模式
10金钱
1.系统有数个任务,开机运行正常,但是运行一段时间(偶发不确定具体时间,反正至少好几个小时~1天),有一个显示任务Dis_task不运行了,其他任务(优先级有比显示任务高的,也有低的)正常。2.显示任务Dis_task调用OSPendMulti()请求多个内核对象:一个是RTC中断发送的时间消息队列Dis_TASK_RTC;一个是按键扫描任务发送的按键消息队列Dis_TASK_KEY。注:串口任务 UART_DEAL_task没有使用。
3.在统计任务的钩子函数中print所有任务的任务控制块的相关成员变量和消息队列的使用情况:
//打印所有任务的相关信息(下边的代码与任务数量一样多)
         p = &(任务控制块);               
        printf("\r\n %s  \r\n",p->NamePtr);     //打印任务名称
        printf(" #CtxSw: %d  \r\n",p->CtxSwCtr);         //任务执行次数       
        printf(" #任务的CPU使用率: %.2f  \r\n",((float)p->CPUUsage)/100);  //任务CPU使用率
        printf("Core_Pageused/sum/free:%d/%d/%d usage:%d %% .任务状态:%d  \r\n",p->StkUsed,p->StkSize,        p->StkFree,(p->StkUsed*100)/p->StkSize,p->TaskState);  //打印堆栈使用情况


//CPU总使用率
printf("\r\n\r\n");
        printf("CPU总使用率:%f%%\r\n",(float) OSStatTaskCPUUsage / 100);     //CPU使用率
        printf(" CPU Speed: %ld MHz  \r\n",BSP_CPU_ClkFreq() / 1000000L);   //主频
        printf("\r\n\r\n"); //插入换行

//消息队列

        printf("总消息池剩余/已使用/最大使用量:%d/%d/%d \r\n",OSMsgPool.NbrFree,OSMsgPool.NbrUsed,OSMsgPool.NbrUsedMax);
        printf("RTC实时中断的消息池总量/已使用/最大使用量:%d/%d/%d \r\n",Dis_TASK_RTC.MsgQ.NbrEntriesSize,Dis_TASK_RTC.MsgQ.NbrEntries,Dis_TASK_RTC.MsgQ.NbrEntriesMax);
        printf("按键扫描任务的消息池总量/已使用/最大使用量:%d/%d/%d \r\n",Dis_TASK_KEY.MsgQ.NbrEntriesSize,Dis_TASK_KEY.MsgQ.NbrEntries,Dis_TASK_KEY.MsgQ.NbrEntriesMax);       


4.通过查看print打印的内容发现的现象:
4.1开机运行正常,运行一段时间(偶发不确定具体时间,反正至少好几个小时~1天)后,仅仅显示任务Dis_task不运行,就像不存在一样。其他任务都正常。由于显示任务Dis_task不运行了,但RTC中断不断的发送消息队列,当消息队列满了之后进入while死循环并打印“消息队列已满”。
4.2所有任务的堆栈都有很大余量,应该不是堆栈问题。

5.请求
希望给点bug排查的思路或手段。多谢!!!

/*****************正常打印情况***********************
串口任务 UART_DEAL_task  
#CtxSw: 62  
#任务的CPU使用率: 0.00  
Core_Pageused/sum/free:36/128/92 usage:28 %

显示任务 Dis_task  
#CtxSw: 49920  
#任务的CPU使用率: 1.43  
Core_Pageused/sum/free:74/128/54 usage:57 %

按键扫描任务 KEY task  
#CtxSw: 1231178  
#任务的CPU使用率: 0.30  
Core_Pageused/sum/free:32/128/96 usage:25 %

定时任务 uC/OS-III Timer Task  
#CtxSw: 133110  
#任务的CPU使用率: 0.11  
Core_Pageused/sum/free:54/128/74 usage:42 %

空闲任务 uC/OS-III Idle Task  
#CtxSw: 2223574  
#任务的CPU使用率: 88.02  
Core_Pageused/sum/free:18/128/110 usage:14 %

统计任务 uC/OS-III Stat Task  
#CtxSw: 237821  
#任务的CPU使用率: 9.23  
Core_Pageused/sum/free:129/256/127 usage:50 %

时钟节拍任务 uC/OS-III Tick Task  
#CtxSw: 2495831  
#任务的CPU使用率: 0.42  
Core_Pageused/sum/free:37/128/91 usage:28 %


CPU总使用率:16.290001%
CPU Speed: 72 MHz  


总消息池剩余/已使用/最大使用量:200/0/0
RTC实时中断的消息池总量/已使用/最大使用量:50/0/0
按键扫描任务的消息池总量/已使用/最大使用量:50/0/0

*****************************************************/


/******************异常时************************

**********************************/

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

使用道具 举报

8

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
118
金钱
118
注册时间
2015-9-7
在线时间
8 小时
 楼主| 发表于 2018-5-9 15:31:25 | 显示全部楼层
又进行了一些测试,发现:RTC的消息不停的在发布,直到满。而这期间显示任务一直处于就绪状态。好像显示任务“看不到”发布的消息。并且显示任务处于就绪状态一直得不到执行,好像任务调度把这个任务给“忘记了”一样,而显示任务优先级低的任务都在执行。总之一句话,好像显示任务消失了一样。
好奇怪~~~
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165353
金钱
165353
注册时间
2010-12-1
在线时间
2108 小时
发表于 2018-5-10 01:46:07 | 显示全部楼层
BD
回复

使用道具 举报

6

主题

119

帖子

0

精华

高级会员

Rank: 4

积分
712
金钱
712
注册时间
2015-11-26
在线时间
139 小时
发表于 2018-5-10 12:15:22 | 显示全部楼层
roarghy 发表于 2018-5-9 15:31
又进行了一些测试,发现:RTC的消息不停的在发布,直到满。而这期间显示任务一直处于就绪状态。好像显示任 ...

你用的是不是原子大哥的移植好的模板?
回复

使用道具 举报

8

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
118
金钱
118
注册时间
2015-9-7
在线时间
8 小时
 楼主| 发表于 2018-5-10 12:48:30 | 显示全部楼层
hanzixi_angel 发表于 2018-5-10 12:15
你用的是不是原子大哥的移植好的模板?

是正点原子103的板子,然后我改了改用在了105上的
回复

使用道具 举报

8

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
118
金钱
118
注册时间
2015-9-7
在线时间
8 小时
 楼主| 发表于 2018-5-10 12:57:52 | 显示全部楼层
本帖最后由 roarghy 于 2018-5-10 12:59 编辑

目前进展:在其他任务中添加语句:发现未处理的消息过多时把显示任务挂起在解挂。这方法可纠正显示任务不运行的问题。但是没治本。

在发生异常的情况下,查看显示任务的TCB的成员变量,发现其处于就绪状态且没有等待任何内核对象,这个状态只有在运行显示任务的时候才可能出现。推断应该是任务调度执行显示任务,在显示任务执行期间偶然发生了“什么事情”导致本任务出现异常的。通过将其挂起再解挂的方法“纠正”了这个异常。

下一步我打算好好看看显示任务内部,逐块排查最终找到原因。但这个显示任务的代码量好大好大~~~~
回复

使用道具 举报

25

主题

683

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1350
金钱
1350
注册时间
2012-4-25
在线时间
195 小时
发表于 2018-5-10 16:44:16 | 显示全部楼层
没看到源码部分,不好判断问题,以我看来你这是出现任务间死锁了。尝试办法,删除其他多余任务,只保留一个收发。
1-1
回复

使用道具 举报

25

主题

683

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1350
金钱
1350
注册时间
2012-4-25
在线时间
195 小时
发表于 2018-5-10 16:47:52 | 显示全部楼层
相对来说Frtos 好用,如果对 UCOS不是很熟悉的新手,经常陌名BUG问题。特别是这个信号,邮箱。UCOS 不像Frtos 有专门用于中断中的ISR 信号操作,所以在UCOS中最好不要在中断进行信号量操作,
1-1
回复

使用道具 举报

6

主题

119

帖子

0

精华

高级会员

Rank: 4

积分
712
金钱
712
注册时间
2015-11-26
在线时间
139 小时
发表于 2018-5-11 11:19:32 | 显示全部楼层
roarghy 发表于 2018-5-10 12:57
目前进展:在其他任务中添加语句:发现未处理的消息过多时把显示任务挂起在解挂。这方法可纠正显示任务不运 ...

建议你给成Free RTOS  这个好用  结合stm32cubemx  开发起来还是很快的  如果你坚持使用ucos  建议你重新移植一下
回复

使用道具 举报

1

主题

3

帖子

0

精华

初级会员

Rank: 2

积分
87
金钱
87
注册时间
2015-10-20
在线时间
19 小时
发表于 2019-3-18 14:25:34 | 显示全部楼层
我也出现了同样的情况。
请求消息队列的任务某一个时刻后持续就绪,调度次数不再增加。
回复

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2019-6-5
在线时间
7 小时
发表于 2020-10-29 16:36:12 | 显示全部楼层
我也遇到了,其中一个任务突然消失了;
我这边应该是内存的原因,因为刚好改了一些数据包的长度之后就出现这种现象;用回之前的老版本程序就没问题;

具体原因还不知道,继续查看分析;
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-25 11:31

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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