STM32内核 UCOSII任务调度

[复制链接]
5250|17
 楼主| jiandandan168 发表于 2012-4-5 19:23 | 显示全部楼层 |阅读模式
我用的板子是STM32,程序已经连续运行多天,某天开始其中一个任务没有执行,其余任务运行正常。我的系统中自己定义的任务有5个,没有执行的是优先级最低的任务。前期一直正常,突然出现这种情况,最可能的原因可能是什么?有方向吗,盲目不知道怎么找问题?任务中有一个看门狗任务,看门狗任务也很正常,系统运行期间没有复位。
李富贵 发表于 2012-4-5 19:34 | 显示全部楼层
IAR插件说什么了吗?
 楼主| jiandandan168 发表于 2012-4-5 19:40 | 显示全部楼层
程序是烧录进去的,用IAR调试时显示的是没有问题,所以看不出什么,程序也是跑了一周才出现这个情况,都无从下手找原因,这方面问题有人说是指针错乱,但是造成的原因可能是什么?越界还是啥的,但是越界的时候一般会整个系统崩溃,导致看门狗复位,也不应该是只有一个任务运行不正常啊
 楼主| jiandandan168 发表于 2012-4-5 19:55 | 显示全部楼层
哪位大侠给点查找方向吧,谢谢了,迷茫不知道咋办了
李富贵 发表于 2012-4-5 20:12 | 显示全部楼层
李富贵 发表于 2012-4-5 20:18 | 显示全部楼层
ucos-2.86以及以前版本在cortex-m3上面有这个bug。
要改os_core.c里面OS_Sched和OS_IntExit两个函数。
注意OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];的位置。
只要把这句话提前一行就行了。


  1. void OS_Sched (void)
  2. {
  3. #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
  4. OS_CPU_SR cpu_sr = 0u;
  5. #endif



  6. OS_ENTER_CRITICAL();
  7. if (OSIntNesting == 0u) { /* Schedule only if all ISRs done and ... */
  8. if (OSLockNesting == 0u) { /* ... scheduler is not locked */
  9. OS_SchedNew();
  10. OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
  11. if (OSPrioHighRdy != OSPrioCur) { /* No Ctx Sw if current task is highest rdy */
  12. #if OS_TASK_PROFILE_EN > 0u
  13. OSTCBHighRdy->OSTCBCtxSwCtr++; /* Inc. # of context switches to this task */
  14. #endif
  15. OSCtxSwCtr++; /* Increment context switch counter */
  16. OS_TASK_SW(); /* Perform a context switch */
  17. }
  18. }
  19. }
  20. OS_EXIT_CRITICAL();
  21. }
 楼主| jiandandan168 发表于 2012-4-6 09:04 | 显示全部楼层
能给我解释一下这样改的原因吗,不明白,谢谢了
 楼主| jiandandan168 发表于 2012-4-6 16:01 | 显示全部楼层
我按照上面的方法试了,感觉还是有点问题,还有没有别的可能性啊
baiyunfei.k.f 发表于 2012-4-6 16:57 | 显示全部楼层
6# 李富贵
在cortex-M0上移植,有这个bug吗?
李富贵 发表于 2012-4-6 20:46 | 显示全部楼层
6# 李富贵  
在cortex-M0上移植,有这个bug吗?
baiyunfei.k.f 发表于 2012-4-6 16:57

在micrium网站上面下载2.90的source,里面有本《whatsnew-since200》的历史更改记录,提到了2.86的这个bug和修改方案。但是只说在M3会导致任务调度异常,其他CPU似乎不受影响。当时M0还没出来。
 楼主| jiandandan168 发表于 2012-4-9 15:58 | 显示全部楼层
我按照楼上的方法修改了ucos两处,可是还是有问题,优先级最低的任务还是出现问题了,还有没有别的原因啊,大侠们,摆脱了,愁死了
pentral0311 发表于 2012-4-9 16:36 | 显示全部楼层
可能是高优先级一直被调用,在某个地方进入了死去,没出来,导致低优先级一直得到时间片
337zhang 发表于 2012-4-9 20:41 | 显示全部楼层
感觉12楼分析的有道理,可以将优先级调高一点试试看
werewofe 发表于 2012-4-9 20:52 | 显示全部楼层
优先低的中断找不到合适的入口,没有等到进去较高的中断又进去
 楼主| jiandandan168 发表于 2012-4-10 08:56 | 显示全部楼层
14楼说的找不到合适入口,是指指针跑飞了吗,这个问题该怎么抓呢,一般是什么原因导致这个结果的
pluto55 发表于 2012-12-4 09:02 | 显示全部楼层
楼主找到原因了吗?顶一下
MOZATE 发表于 2012-12-4 10:07 | 显示全部楼层
没有问题,有问题都是 UCOS的问题。呵呵
21leio 发表于 2012-12-4 12:50 | 显示全部楼层
学习,谢谢!BTW硬件STM32没问题,有问题都是uCOS惹的祸
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

17

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部