打印

STM32内核 UCOSII任务调度

[复制链接]
3994|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 | 只看该作者
哪位大侠给点查找方向吧,谢谢了,迷茫不知道咋办了

使用特权

评论回复
5
李富贵| | 2012-4-5 20:12 | 只看该作者
2.86?

使用特权

评论回复
6
李富贵| | 2012-4-5 20:18 | 只看该作者
ucos-2.86以及以前版本在cortex-m3上面有这个bug。
要改os_core.c里面OS_Sched和OS_IntExit两个函数。
注意OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];的位置。
只要把这句话提前一行就行了。


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



OS_ENTER_CRITICAL();
if (OSIntNesting == 0u) { /* Schedule only if all ISRs done and ... */
if (OSLockNesting == 0u) { /* ... scheduler is not locked */
OS_SchedNew();
OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
if (OSPrioHighRdy != OSPrioCur) { /* No Ctx Sw if current task is highest rdy */
#if OS_TASK_PROFILE_EN > 0u
OSTCBHighRdy->OSTCBCtxSwCtr++; /* Inc. # of context switches to this task */
#endif
OSCtxSwCtr++; /* Increment context switch counter */
OS_TASK_SW(); /* Perform a context switch */
}
}
}
OS_EXIT_CRITICAL();
}

使用特权

评论回复
7
jiandandan168|  楼主 | 2012-4-6 09:04 | 只看该作者
能给我解释一下这样改的原因吗,不明白,谢谢了

使用特权

评论回复
8
jiandandan168|  楼主 | 2012-4-6 16:01 | 只看该作者
我按照上面的方法试了,感觉还是有点问题,还有没有别的可能性啊

使用特权

评论回复
9
baiyunfei.k.f| | 2012-4-6 16:57 | 只看该作者
6# 李富贵
在cortex-M0上移植,有这个bug吗?

使用特权

评论回复
10
李富贵| | 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还没出来。

使用特权

评论回复
11
jiandandan168|  楼主 | 2012-4-9 15:58 | 只看该作者
我按照楼上的方法修改了ucos两处,可是还是有问题,优先级最低的任务还是出现问题了,还有没有别的原因啊,大侠们,摆脱了,愁死了

使用特权

评论回复
12
pentral0311| | 2012-4-9 16:36 | 只看该作者
可能是高优先级一直被调用,在某个地方进入了死去,没出来,导致低优先级一直得到时间片

使用特权

评论回复
13
337zhang| | 2012-4-9 20:41 | 只看该作者
感觉12楼分析的有道理,可以将优先级调高一点试试看

使用特权

评论回复
14
werewofe| | 2012-4-9 20:52 | 只看该作者
优先低的中断找不到合适的入口,没有等到进去较高的中断又进去

使用特权

评论回复
15
jiandandan168|  楼主 | 2012-4-10 08:56 | 只看该作者
14楼说的找不到合适入口,是指指针跑飞了吗,这个问题该怎么抓呢,一般是什么原因导致这个结果的

使用特权

评论回复
16
pluto55| | 2012-12-4 09:02 | 只看该作者
楼主找到原因了吗?顶一下

使用特权

评论回复
17
MOZATE| | 2012-12-4 10:07 | 只看该作者
没有问题,有问题都是 UCOS的问题。呵呵

使用特权

评论回复
18
21leio| | 2012-12-4 12:50 | 只看该作者
学习,谢谢!BTW硬件STM32没问题,有问题都是uCOS惹的祸

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

17

帖子

0

粉丝