嵌入式内存深究(5):记忆的保留 —— No-Init 与黑匣子

通常我们被教导:复位(Reset)等于一切重来。但在工业级产品的设计中,我们往往需要“带着记忆重生”。这不仅是为了调试(知道刚才为什么死机),更是为了业务连续性(热启动快速恢复)。

1. 引言:复位了,RAM 里的数据还在吗?

这是一个经典的面试题,也是工程中的迷思。 答案是:物理上还在,逻辑上没了。

  • 物理层面: SRAM(静态随机存取存储器)只要电源不切断(VDD > 数据保持电压,通常是 1.0V 左右),里面的电子状态就能保持不变。无论是看门狗复位、软件复位、还是按下 RST 键,只要没断电,RAM 里的数据完好无损

  • 逻辑层面: 之所以我们在 main() 里看到变量都变 0 了,是因为我们在第三篇讲过的启动代码(Startup Code)太“勤快”了。它在启动过程中暴力清零了整个 BSS 段,甚至整个 RAM。

No-Init (No Initialization) 技术的本质,就是通过修改链接脚本和启动流程,圈出一块 RAM 区域,对着启动代码大喊一声:“这块地盘你别动!”


2. STM32G0 实战:与启动代码的博弈

在 STM32 (GCC环境) 上实现 No-Init,必须同时修改链接脚本 (.ld)C 代码,有时甚至要检查汇编启动文件

2.1 第一步:修改链接脚本 (.ld)

我们需要在 RAM 中开辟一个特殊的段。关键属性是 NOLOAD。这个属性告诉链接器:这个段在生成的 BIN/HEX 文件中不占空间(没有初值),且在程序加载时不需要处理。

/* STM32G0xxxx_FLASH.ld

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一路往蓝-Anbo

与其打赏不如转发

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值