加上boot程序,FreeRTOS就跑不起来了

一、问题描述

        bootloader跳转到APP时,app执行完初始化程序后死机

二、分析问题

        第一步,执行app时死机死到哪里?通过DEBUG调试发现死到hardfault_handler()函数中,硬件错误,导致硬件错误的原因一般都是中断异常引起的。

        第二步,找到问题,然后分析什么原因导致硬件错误?一般bootloader跳转到APP时要关闭app中用到的中断,那么查看系统中用到的中断:串口中断、滴答定时器中断,所以,跳转之前要关闭这两个中断:_disable_irq()和systick。

三、解决问题

1.办法1

        关闭中断之后,跳转执行app正常。

void iap_load_app(u32 appxaddr)//

    SysTick->CTRL = 0X00;//禁止SysTick
    SysTick->LOAD = 0;
    SysTick->VAL = 0;
    __disable_irq();
    jump2app=(iapfun)*(vu32*)(appxaddr+4);        //用户代码区第二个字为程序开始地址(复位地址)        
    MSR_MSP(*(vu32*)appxaddr);                    //初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)
    jump2app();                                    //跳转到APP.
}

2.办法2

如下图,要打勾,不然就无法运行


四,结论

       1.bootloader跳转到app之前要关闭app中用到的中断,不然就会出现硬件错误导致死机;

       2.对app的内部机制要比较了解,比如:用到哪些中断、外设,这样遇到问题才能更好分析,不要停留在会用层面,一定要了解透彻,这样无论遇到什么问题,都能有一个正确的分析思路。