最近的设备出现了一个奇怪的现象,程序一直死在一个地方,但是看门狗却没有将其复位。单片机使用的是STM32F103,cortex-M3架构,经过调试发现只有一个任务在跑,其他任务均不运行,与ouravr论坛上现象几乎一样。
论坛地址:http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=3474569&bbs_page_no=22&bbs_id=1000
调试时发现在某种情况下. OSPendQ返回的指针是 (void *)0; 并且返回err == OS_ERR_NONE; 表明此时是从消息指针数组中读到了空指针.
但此时消息指针数组中确确实实没有空指针的元素.
更奇怪的是.
运行到这种情况下时(任务A Pend返回空指针).
当前任务块指针 OSTCBCur 确实是指向的任务A的任务控制块,但!! 但OSPrioCur/OSPrioHigh却等于任务B的优先级(比任务A高).!!!!
如果我没有理解错的话, 这种情况是绝对不可能发生的...随便运行到哪个任务. OSPrioCur应当就是当前任务的优先级.~ (任务B与任务A没有任何直接的关联)
操作系统版本:uCOS2.86
在此帖子中,有人提到ucos-ii 2.88 的release note中针对ucos 在cortex-m3的移植有改动描述,V2.87之前的代码有bug。
目前我们的系统是ucos-ii 2.86,我下载到ucos-ii 2.88的源代码和用户手册,看到官方确实完善了内核代码。
在手册中官方写到
OS_CORE.C:
OSIntExit() and OS_Sched() have changed slightly because of a boundary condition found with the Cortex-M3 port. Specifically, we needed to move the statement:
OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
Before testing for the priority.
经过修正后,程序运行正常,不再出现任务切换的问题。