我们系统中现在的两个采集数据的板子处理器lpc2292,使用了zlg移植的ucos,两板程序只是数据采集和传输方法不同,但结构大致是一样的。 问题是其中的一个板子,我在TargetInit里统一配置中断为IRQ并全部禁能(VICIntEnClr=0xffffffff),接着按我们的需要配置VICVectCntlx和VICVectAddrx,但除了timer0也就是系统节拍中断外都没打开中断(即VICIntEnable相应位置1),这样应该排除了其他中断干扰的可能了吧。当程序跑起来,没有任何操作的情况下是在优先级最低的一个接收消息的任务内空循环,在AXD环境中运行一会后暂停运行,*全局变量OSIntNesting*变成了一个非0值,调试发现其值就是不断在0到0xff间变化,当timer0中断也不打开,程序空转,该值持续为0(关timer0中断而使能其他中断也是如此),基本可以断定是timer0中断造成的吧? 另一个板子程序结构相同情况下,timer0系统节拍就没有上述问题,当程序被暂停在任务内,OSIntNesting始终是0! 我在OSTimeTick()内单步,有几行程序运行时会看到OSIntNesting值被增大若干,两个板子均如此,不太清楚为何,但我又觉得在节拍函数里单步应该不能反映正常运行的问题!而正常运行就是上面说的,一个ok,一个OSIntNesting不停循环变化,导致os不能正常调度…… 对了,如果OSIntNesting不为0时停止并重新加载程序,timer0中断处理中有断点的话就会在初始化完系统模式堆栈(打开IRQ中断)后跳到断点,而不是正常的直接到main,说明没清中断?但两个板子timer0中断处理都是zlg的没动,明明有T0IR=1!
说得罗嗦了,只是希望能描述清楚点。这个问题十分困扰我,想请大家帮着分析一下,能给一个有效的调试方法也好啊。先谢谢 |