
01前言. [4 |) d- k3 D 有些时候在我们的应用过程中要求变量有连续性,或者现场保留,例如 Bootloader 跳转,某种原因的复位过程中我们有些关键变量不能被初始化,在不同的编译环境下有不同的设置,本文就这个操作做总结,分别介绍使用 Keil,IAR 和 CubeIDE 的操作方法,本文中所用芯片为STM32G431RBT6。 # X( b* g1 o3 g4 w 02 IAR 实现变量不初始化方法+ `8 v; v" ?& @ IAR 实现相对简单,直接使用“__no_init”这个关键字即可,也就是在变量前面进行修饰: 0 V5 f9 R$ {5 w1 T" B; Q+ n! }" S ![]() % t! a }! ~' J) [. q 为了验证是否执行成功,可以考虑周期性让系统复位,看变量的变化,比如下面的示例程序让系统周期复位,会发现每次 Test_NoInit 数据都是在上次数据基础上增加 10,而不是被初始化后的数据增加 10。 9 `" O7 t V* l& ^- t ![]() 03 Keil 实现变量不被初始化方法 Keil 中没有像 IAR 里面的这个关键字,而且会有版本的区别,下面分别介绍: ![]() 图1.Keil 不同编译版本 + f& b* r- y/ m2 _, w: e为了防止未初始化的变量被初始化为 0,要将未初始化的变量放在一个特殊段内,这个段满足是 ZI 数据段(.bss),它的执行域(region)具有 UNINIT 属性。/ i$ f% G3 P1 f2 J: i, D" M! M 7 U2 U6 k% b2 n 3.1. Arm® Compiler 5 的操作* r2 D8 E3 o: D8 ~& K 修改工程的 linker file 文件,*.sct 文件 ; ]; s, n& t8 \. z3 _: e4 P% h" R . s) I" q6 E y1 C: n ![]() 图2.修改默认 linker file : w8 j7 ~2 |! e! W8 g$ o+ k( r5 s% M7 y) b 这边将 RAM 划分两个区间,其中 RW_IRAM2 就是我们要的变量不初始化区域,属性为UNINIT,定义一个 region 名字 NO_INIT. 9 ?& Z, E# _! ~4 K 0 c2 }( D$ S% A: g$ ^& ~ ![]() ( h7 B: p( h( G( H% ?* [3 U- h 变量定义到这个 section,这边 AC5 要用到 zero_init 这个修饰。 " n) M1 E p% w; W/ {5 ^ ![]() 3.2. Arm® Compiler 6 的操作5 b1 q+ \( W$ Y4 W7 e: e 在 AC6 上面需要加入.bss 这个 ZI 定义,如下的 sct 文件修改:) N/ _$ H6 L' z6 e! ^- h ![]() ' S- J0 A5 k0 Z$ f 变量定义到 section 部分,AC5 和 AC6 也是有区别的,不再支持 zero_init 这个修饰,如下定义: 8 B- i# O$ ^3 l# Q' w- R 对于版本 AC5 和 AC6 具体区别可以参考 Keil 帮助文件中的描述: 8 `- q' D) g- D* _ e- U ![]() 图3.Keil 帮助文件关于 zero initialized 9 T& r3 K q5 L# O. z. m ' d5 @9 o( A& p) x+ N 5 ~) ^# Q' t! ]* P 9 \( F4 G% f1 j% s 04 CubeIDE 实现变量不初始化方法 CubeIDE 的实现和 Keil 有类似的操作,需要修改 linker file 文件*.ld。首先对 RAM 进行划分,划分出不初始化的 RAM 区域:: ?8 w% s) u7 V7 [1 m+ u ![]() 图4.划分 RAM 区域 # B9 c& S: }+ x$ N) i, J 6 Q" g- n7 T( m; Z) X7 N增加区域描述,并且加入区域名字: . f; h4 \. x/ h8 k/ x' U! Q0 k+ F9 J- a ![]() 图5.区域描述,名字定义 " o; K7 I. m D# i, _+ y( f4 {7 F" v4 p) D( _$ T 定义变量到这个不初始化区域中: ![]() 3 [* q2 j1 A. B; q4 Z 另外,还提醒一点,有些 STM32 系列有专门针对特定 RAM 区复位后是否会被初始化的 Option 配置位。比方 STM32L4 系列,想让 SRAM2 变量不被初始化,得配置选项字节中的 SRAM2_RST位。如下图所示: , r6 l; Z5 W. @ w, L ![]() $ w9 [7 x# C3 V( `6 X ) r- J2 t# `( V0 D 转载自: STM32单片机. d6 t3 F/ ~' j) D: Y- H9 c 如有侵权请联系删除 " w. X) q- j5 n. L! q W% @3 T: z 2 e2 V3 `) e- t. N0 `: u: q/ B |
【2025·STM32峰会】GUI解决方案实训分享1-对LVGL咖啡机例程的牛刀小试以及问题排查
新版STM32Cube for Visual Studio Code开发体验
【STM32N6570-DK评测】摄像头video encoder
实战经验 | STM32CubeIDE实用技巧之工程联调
【STM32H745I-DISCO】基于TouchGFX的工业控制器界面设计
【下载问题解决】关于ST官网下载软件问题解决
【STM32N6570-DK评测】开发环境及LED debug
实战经验 | 基于STM32CubeIDE下载TouchGFX GUI应用的出错分析
实战经验 | 如何修改STM32Cube固件包的存储位置
兔哥的杂谈【002】——如何性价比更高地去编译STM32