是的,这个问题纠缠了我一个多月,我都要崩溃了放弃了。今天还是在互联网上找到了答案,太感谢发帖的人了。抑郁的情怀终于得到释放,啦啦啦~~
平台:STM32F207+uCOS II V2.85+LWIP
问题:网口接收到数据来中断时,通过OSSemPost告知任务进行处理。只要接网口,有网口数据接收,不管是否发送,运行一段时间后任务调度就会出问题。STM32F207自带网口有这个问题,扩展的DM9000也有这个问题,而且DM9000更容易出现。修改代码调试定位,有的时候十分钟出现,有的时候跑两个小时出现,有的时候跑一个晚上出现,或一个周末出现。出问题之后,只有一个任务在跑,再也调度不起来了。
跟踪发现OSPrioCur和OSTCBCur->OSTCBPrio不相等。但是这两个值都是在PendSV_Handler中赋值,赋值前后有中断保护。理论上两者不应该不等呀。一直定位定位,屏蔽这个屏蔽那个,以为好了,久了问题又来。最终没有办法,自己打了个补丁。在OS_Sched()和OSIntExit()里加上语句:if (OSPrioCur != OSTCBCur->OSTCBPrio) OSPrioCur = OSTCBCur->OSTCBPrio;
加上补丁后,运行起来倒是相安无事,只是我放不下心啊,担心是网口驱动引起的问题,像是个定时炸弹。今天在网上继续搜索,终于找到答案,泪奔啊!
原来是uCOS II本身的bug,V2.88以后的版本改正了这个任务调度的bug。
OSTCBHighRdy = OSTCBPrioTbl