UCOSII进入HardFault_Handler()

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/LZPRO/article/details/86631154

最近在使用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()了。

猜你喜欢

转载自blog.csdn.net/LZPRO/article/details/86631154
今日推荐