最近在使用UCOSII的时候,程序会跑飞,停在HardFault_Handler函数里的死循环while(1)中,百度了一下通常有一下原因:
1.数组越界
2.内存溢出,访问越界
3.堆栈溢出,程序跑飞
4.中断处理错误
经反复核对,依然没有发现问题,后来又百度到UCOSII有的版本确实有bug,本人使用的v2.86版本确实有问题
os_core.c文件中的任务调度函数OS_Sched(),一下是修改后的正确代码
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();
}
虽然修改成功了,但是问题还是没有解决,程序依然在任务调度函数OS_Sched()中的 OS_TASK_SW()进入HardFault_Handler(),最后经测试,本人在中断函数中使用了delay延时函数,delay延时函数使用的是SysTick定时器,把中断中的延时函数delay注释掉就不会进入HardFault_Handler()了。