在使用MCU时,通常大家默认MCU复位时RAM会被复位清零,那实际MCU复位时RAM是什么状态?如何让mcu复位时RAM保持不变呢?
MCU复位有电源复位、Standby复位、内核复位、看门狗复位、引脚复位等。

其中内部会有掉电动作的复位有电源复位和Standby复位,由于内部电路有掉电所以这些复位RAM是无法保持的,RAM会处于随机值状态,实际也不是0值。其他复位由于不掉电,本质上是不会直接复位RAM的。
那为什么一般执行了软件复位和看门狗复位后RAM会复位,没有初始化的变量值变成0呢?实际上是因为编译器自动生成的RAM初始化代码在MCU启动后进入main函数前完成的,这些函数我们通过查看编译后的map文件可以找到他们踪迹。

以Keil为例,编译后输出信息里会看到RW-DATA和ZI-DATA,其中ZI-DATA就是没有给定初始化值或初始化值给定为0的全局数据。
打开工程设置,在RAM/IRAM的Memory配置里有一个NOINIT的勾选,勾选后就可以配置为不初始化属性,编译器将不对这个区域的全局变量进行初始化赋值。

如果我们有希望复位后还能保持的RAM变量可以定义在配置了NOINIT的RAM区域中。
除了直接在工程配置里修改,如果自行编写链接文件,也可以添加NOINIT字段来进行配置。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
单片机
+关注
关注
6078文章
45581浏览量
673732 -
mcu
+关注
关注
147文章
19134浏览量
404050 -
嵌入式
+关注
关注
5209文章
20664浏览量
337115 -
RAM
+关注
关注
8文章
1401浏览量
121009
发布评论请先 登录
相关推荐
热点推荐
CH32V103复位如何保持变量?
CH32V103复位如何保持变量,只有上电才清零. 原来用stm32f103可以设置 __attribute__((unused, section(".noinit")))改用 CH32V103 后, 每次
发表于 06-15 06:13
ARM SOC芯片当其热复位时其系统内存RAM中的原数据是否继续保持不变
请教:ARM SOC芯片(如手机SOC芯片)系统,当其热复位时,其系统内存RAM中的原数据是否继续保持不变?并且可被热复位后新启动的程序继续
发表于 08-02 14:11
ARM SOC芯片系统当其热复位时,其系统内存RAM中的原数据是否继续保持不变?
请教:ARM SOC芯片(如手机SOC芯片)系统,当其热复位时,其系统内存RAM中的原数据是否继续保持不变?并且可被热复位后新启动的程序继续
发表于 09-06 11:19
如何设置STM32单片机非初始化数据变量不被零初始化
一些产品,当系统复位后(非上电复位),可能要求保持住复位前RAM中的数据,用来快速恢复现场,或者
发表于 01-02 15:56
•9159次阅读
华大MCU如何实现软件复位
产品在设计中某些状态下需要MCU进行复位,华大MCU包含了7个复位信号来源,每个复位信号都可以让 CPU 重新运行,绝大多数寄存器会被
发表于 10-12 11:24
•2596次阅读
MCU复位RAM会保持吗,如何实现复位时变量数据保持
评论