STMCU小助手
发布时间:2023-11-26 15:43
|
01前言 有些时候在我们的应用过程中要求变量有连续性,或者现场保留,例如 Bootloader 跳转,某种原因的复位过程中我们有些关键变量不能被初始化,在不同的编译环境下有不同的设置,本文就这个操作做总结,分别介绍使用 Keil,IAR 和 CubeIDE 的操作方法,本文中所用芯片为STM32G431RBT6。 2 D3 T- e, Q( ] 02 IAR 实现变量不初始化方法4 K( d, G6 V' p IAR 实现相对简单,直接使用“__no_init”这个关键字即可,也就是在变量前面进行修饰: % ?$ Y Y; P9 h: B
为了验证是否执行成功,可以考虑周期性让系统复位,看变量的变化,比如下面的示例程序让系统周期复位,会发现每次 Test_NoInit 数据都是在上次数据基础上增加 10,而不是被初始化后的数据增加 10。 ( P- @9 j7 _" N* }2 E, w; Q
9 y. A6 Y& P- K# j; h. | 03 Keil 实现变量不被初始化方法, t4 M% q- x0 P- D: ?4 T Keil 中没有像 IAR 里面的这个关键字,而且会有版本的区别,下面分别介绍:
图1.Keil 不同编译版本 3 g; k& D; J0 A3 {, J为了防止未初始化的变量被初始化为 0,要将未初始化的变量放在一个特殊段内,这个段满足是 ZI 数据段(.bss),它的执行域(region)具有 UNINIT 属性。 3.1. Arm® Compiler 5 的操作# C7 R7 ~) C8 E 修改工程的 linker file 文件,*.sct 文件 2 N3 S6 |6 }3 W D! b* l 8 I7 S, T/ R( z. X4 h& `
图2.修改默认 linker file % ?1 a5 i( }4 N: t. F5 t3 o 这边将 RAM 划分两个区间,其中 RW_IRAM2 就是我们要的变量不初始化区域,属性为UNINIT,定义一个 region 名字 NO_INIT.
变量定义到这个 section,这边 AC5 要用到 zero_init 这个修饰。. x1 @* W- L1 x/ i, \" b, a s . {+ a- B% v0 U9 J! ?% p3 E+ l: B
( z" V) H" }% E E4 p 3.2. Arm® Compiler 6 的操作 在 AC6 上面需要加入.bss 这个 ZI 定义,如下的 sct 文件修改: 5 K- _) a) x6 F: `. a& ~! u
]" l( u4 B( @. E# |: w8 C 变量定义到 section 部分,AC5 和 AC6 也是有区别的,不再支持 zero_init 这个修饰,如下定义: 1 s. M6 F5 n; Z1 U 3 H" y0 Y: w3 _ 5 g# X& i) w/ Q2 R- u, y2 O 对于版本 AC5 和 AC6 具体区别可以参考 Keil 帮助文件中的描述:# N+ ]# E) ~$ Q5 f. s1 _ 5 w: x0 u, N3 L! [5 s. Q1 ~
图3.Keil 帮助文件关于 zero initialized - J" J/ m0 I" ~1 f$ [7 ~% {3 `7 [7 c4 y0 ` - t- g5 B% ~% L" e# Y) p 04 CubeIDE 实现变量不初始化方法 CubeIDE 的实现和 Keil 有类似的操作,需要修改 linker file 文件*.ld。首先对 RAM 进行划分,划分出不初始化的 RAM 区域: 7 Z6 u1 o0 \; S, J3 m
图4.划分 RAM 区域 + h3 w$ f8 J; U9 w增加区域描述,并且加入区域名字: 0 D% Y+ r k1 O9 J) v/ c* Y
图5.区域描述,名字定义 5 Z* \: F$ C; r0 ], u7 M f( D: r, G3 S" m# s* [ p: a E ( G! v9 m) [0 n1 H; h 定义变量到这个不初始化区域中:
, e& K$ N6 q- d- m& e/ d- j2 ] 另外,还提醒一点,有些 STM32 系列有专门针对特定 RAM 区复位后是否会被初始化的 Option 配置位。比方 STM32L4 系列,想让 SRAM2 变量不被初始化,得配置选项字节中的 SRAM2_RST位。如下图所示:3 X: b i( z+ S+ ^6 F* Q 9 A; A' u3 H5 R! V2 I ) }% b( _- b4 l: x
转载自: STM32单片机 如有侵权请联系删除9 y! N' d- k0 K+ m2 u3 J - J/ q6 z/ }' s. V |
STM32CubeCLT 1.22.0新版本发布
【下载问题解决】关于ST官网下载软件问题解决
【STM32H735G-DK测评】lvgl移植
【STM32H735G-DK 测评】STM32H735G-DK External Loder 编译和测试
《MCUBoot课程》学习笔记+从信任链原理到量产实践
STM32CubeIDE 2.2.0新版本发布
CubeMX生成CubeIDE工程代码乱码
STM32CubeIDE实时时钟(RTC)经验分享
实战经验 | ClassB功能安全认证代码与应用代码分区的实现要点
【STM32U3 评测】人体行为识别
微信公众号
手机版