通常我们被教导:复位(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

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



