在开发过程中,采用了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 includedbuffered 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由芯片厂商自定义:

“这种复位则会波及整个芯片上的电路:它会使 CM3 处理器把送往系统复位发生器的请求线置为有效。但是系统复位发生器不是 CM3 的一部分,而是由芯片厂商实现,因此不同的芯片对此复位的响应也不同。因此,读者需要认真参阅该芯片规格书,明白当发生片内复位时,各外设和功能模块都会回到什么样的初始状态,或者有哪些功能模块不受影。 ”

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。从目前来看,只能通过看门狗超时实现。

NVIC_SystemReset,上电复位(BOD),看门狗复位的差异相关推荐

  1. STM32的复位方式:硬件复位、软件复位(看门狗复位和系统复位)

    STM32的复位方式:硬件复位.软件复位(看门狗复位和系统复位). 1.硬件复位: 硬件复位通过给NRST引脚输入低电平复位单片机. 2.看门狗复位: 独立看门狗和窗口看门狗. (1)独立看门狗 ST ...

  2. STM32,软复位,上电复位,看门狗复位对芯片IO状态的影响?

    这个问题比较重要. 有网友问: 大家好,我是做工业控制的,我想问一下STM32如何实现看门狗复位不初始化RAM区,因为是做控制的所以我们想实现CPU热复位后系统能接着原来的流程走,动作开出能不受看门狗 ...

  3. 如何判断设备是上电复位还是软复位(主动调用复位接口或者看门狗复位,W600)

    有客户要在一种场景中要知道复位原因,需要区别开芯片是上电复位还是看门狗复位.因为 w600的芯片没有类似的寄存器来存储这个复位原因,于是就想了个办法来实现它.经测试,是可行的. 大致原理就是在一块程序 ...

  4. 窗口看门狗的作用是什么?窗口看门狗复位分析

    一,窗口看门狗介绍 独立看门狗的喂狗范围 0-X(X由预分频器和重装载值决定,最大值为0xFFF) 独立看门狗相关介绍:传送门:独立看门狗 相比于独立看门狗,窗口看门狗限定了喂狗时间段(由喂狗上限和喂 ...

  5. stm32 看门狗 BKP(HAL库)

    (一)概述 stm32有两个看门狗:硬件看门狗(LSI 40KHz,时间精度不高)和窗口看门狗(APB1). (二)硬件看门狗实现代码 IWDG_HandleTypeDef hiwdg;// 硬件看门 ...

  6. STM32F10xx中独立看门狗(IWDG)和窗口看门狗(WWDG)介绍

    本文大部分内容只用到了键盘的3个按键-你懂的 . 简单总结,Markdown了解一下,推荐. 1.看门狗电路介绍 看门狗电路(watchdog timer),又称监控电路.百度百科解释的很详细: 在由 ...

  7. ARM 看门狗机制 [包括MTK] 【1】

    watchdog一般是一个硬件模块(其实可以当做是一个定时器),其作用是,在嵌入式操作系统中,很多应用情况是系统长期运行且无人看守,导致程序跑飞,所以难免怕万一出现系统死机,那就悲剧了,这时,watc ...

  8. STM32 待机模式与看门狗和谐相处

    由于在standby mode,看门狗仍然能继续工作,但是其他时钟都关闭了,没法喂狗,这样会导致mcu不停复位.网上找的方法如下:1. 开启RTC,定期喂狗后再次睡眠.该方法视乎可行,但是不够省电. ...

  9. java线程看门狗,ARM之看门狗~! - junjun - JavaEye技术网站 - 小陈的日志 - 网易...

    看门狗(watchdog)包括一个4分频的预分频器和一个32位的计数器,时钟通过预分频器输入定时器.定时器递减计数,递减的最小值为0XFF.如果设置一个小于0XFF的值,系统会将0XFF装入计数器,因 ...

最新文章

  1. 18个让程序员流泪的瞬间,已笑喷,哈哈哈哈哈哈!
  2. matlab 设置最大并行数_浅析线程池参数设置
  3. 8 张图,看你是否理解 Java
  4. Jenkins FTP 上传
  5. 分页控件 实战 Post篇
  6. ProxyChains
  7. dbunit java_java - 错误地抛出了Java DBUnit AmbiguousTableNameException - 堆栈内存溢出
  8. Bootstrap研究3-基础html元素
  9. js $.inArray
  10. 机器学习作业班_python实现支持向量机
  11. 怎样学好计算机——计算机达人成长之路(23)
  12. Python 数学建模算法与应用(持续更新)
  13. Win11中文包下载失败?Win11无法安装中文包语言包解决方法
  14. sed 替换字符串以变量形式
  15. Mac 上如何使用burpsuite(以谷歌浏览器为例)
  16. 视频教程-计算机二级(VB)-计算机等级考试
  17. “JSON parse error: Unexpected character (‘\“‘ (code 34)): was expecting comma to separate Object ent
  18. 计算机控制原理 实验,计算机控制原理实验-直流电机实验
  19. Java生成微信群组图标
  20. GateWay的介绍与使用

热门文章

  1. 关于微信小程序导入苹方字体问题
  2. Java对接ansible自动运维化平台
  3. Android高仿QQ及微信底部菜单的多种实现方式【附源码地址】
  4. python用蒙特卡洛法计算积分
  5. 数据库乐观锁和悲观锁例子和分析
  6. 浅谈面试中的乐观锁与悲观锁
  7. C语言课程训练系统题-二维数组cqupt
  8. PDF去除空白页py脚本
  9. 计算机网络(中科大郑烇)第四章笔记
  10. agv ti 毫米波雷达_ADAS防撞预警系统、激光雷达和毫米波雷达系统的优缺点