在开发过程中,采用了NXP的LPC1857芯片,并使用FreeRtos进行任务管理。
IAP方式:采用UBOOT+APP方式进行软件架构。
问题描述:
1. 出现堆栈溢出,造成程序飞。
2. 使用NVIC_SystemReset实现APP跳转到UBOOT时,连续多次跳转,容易出现MCU崩溃。
解决办法:
1. 堆栈溢出的问题。
-- 起因:对分配失败(malloc)的缓存进行了赋值。
-- 解决办法:修改程序,检查所有malloc分配缓存的处理。
2. APP跳转到UBOOT时,连续多次跳转,容易出现MCU崩溃的问题。这个比较麻烦,详细说明如下。
针对问题2的解决办法:
1. 采用NVIC_SystemReset无效。
__set_FAULTMASK(1);
NVIC_SystemReset();
2. 由于采用了FreeRtos,添加PSP和MSP初始化处理,无效。
__set_PSP(*(__IO uint32_t *)run_addr);
__set_CONTROL(0);
__set_MSP(*(__IO uint32_t *)run_addr);
__set_FAULTMASK(1);
NVIC_SystemReset();
3. core_cm3.h源码中,NVIC_SystemReset函数实现:
__DSB(); /* Ensure all outstanding memory accesses included
buffered write are completed before reset */
SCB->AIRCR = ((0x5FA << SCB_AIRCR_VECTKEY_Pos) |
(SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) |
SCB_AIRCR_SYSRESETREQ_Msk); /* Keep priority group unchanged */
__DSB(); /* Ensure completion of memory access */
通过分析源码,复位操作对应为:SYSRESETREQ
4. 《Cortex-M3权威指南》说明SYSRESETREQ由芯片厂商自定义:
5. 查询LPC1857的SYSRESETREQ可以看到:“The ARM Cortex-M3 SYSRESETREQ triggers a peripheral reset PERIPH_RST.”
6. 通过查看LPC1857的Reset output configuration,可以看到PERIPH_RST是一个不完全复位。其中不包括CREG_RST。
7. 为了安全,我们应该做的是CORE_RST,包括:PERIPH_RST + WWDT_RST + CREG_RST。
8. 但是,CORE_RST触发源,仅包括:上电复位 / 看门狗复位 / 外部复位脚(external_rest_pin)。
总结:(针对LPC1857芯片)
1. NVIC_SystemReset,仅为PERIPH_RST。
2. PERIPH_RST,对FreeRtos系统下的程序跳转操作,不安全。
3. 如需安全,则需要实现CORE_RST。从目前来看,只能通过看门狗超时实现。