当前位置: 代码迷 >> 单片机 >> ucosii 入空闲任务后就进了HardFault_Handler
  详细解决方案

ucosii 入空闲任务后就进了HardFault_Handler

热度:212   发布时间:2016-04-28 14:51:51.0
ucosii 进空闲任务后就进了HardFault_Handler
本帖最后由 ysmz4 于 2014-10-11 15:07:26 编辑
有2个任务:modbus从机(prio=4),led闪烁(没有delay,用i++来延时)(prio=8),modbus从机任务被挂起,直到接收中断或TMR的信号量来到。
ucosii空闲任务hook(同led闪烁任务的内容):
void  App_TaskIdleHook (void)
{
int i;
LED1_Init(); 
for(;;)
{
i = 0;
LED1_ON();            此处断点A
while(i<65535)  
i++;
i = 0;
LED1_OFF();           此处断点B
while(i<65535)
i++;
}
}
问题来了:
现在情况是:
modbus被挂起后,直接进入了空闲任务而不是LED闪烁任务,不知道是否和user mode、SVC有关,我查了一下.s没有看到这些mode。请问为什么不进LED任务?
接下来进入了空闲任务,设断点单步可以执行,看到灯一亮一灭(断点位置看上面的程序),但是再往下走就显示硬件中断错(从断点B向下走的时候),为什么?


根本问题是:什么时候用信号量将freemodbus任务挂起解挂?
我现在的做法是,凡是接收中断 / TMR post(EV_READY/EV_FRAME_RECEIVED/...)的时候,后面就跟一句OSSemPost (MboxTimeDly);,在embpoll之前OSSemPend()。
现在出现的两个错误让我根本查不出问题在哪(是sem post的时间有问题,还是。。)。。。
------解决思路----------------------
我一个同事最近也遇到这样类似的问题,一直进空闲任务,其他任务都不跑了,但我检查他代码逻辑,应该不会出现这种问题,后来发现时用的UCOS2的那个版本有bug,导致系统的任务调度器不能调度其他任务运行,运行一会就会进HardFault。

你的UCOS2版本是多少,是不是选了那个有问题的低版本。