STMCU小助手
发布时间:2023-11-26 15:43
|
01前言 有些时候在我们的应用过程中要求变量有连续性,或者现场保留,例如 Bootloader 跳转,某种原因的复位过程中我们有些关键变量不能被初始化,在不同的编译环境下有不同的设置,本文就这个操作做总结,分别介绍使用 Keil,IAR 和 CubeIDE 的操作方法,本文中所用芯片为STM32G431RBT6。 . W% Z7 Z. o' b1 `4 n; R 02 IAR 实现变量不初始化方法% c; _& {1 Y, B# |9 t, B w IAR 实现相对简单,直接使用“__no_init”这个关键字即可,也就是在变量前面进行修饰: 8 g; S" |. j# H3 `
& E9 `0 l+ a" y; j% X) O 为了验证是否执行成功,可以考虑周期性让系统复位,看变量的变化,比如下面的示例程序让系统周期复位,会发现每次 Test_NoInit 数据都是在上次数据基础上增加 10,而不是被初始化后的数据增加 10。. M! ~' h( T! E ! n- I" V+ _- `' B' b6 }0 H$ g% Z
7 q7 {) J/ |7 G: k+ Q4 i7 d 03 Keil 实现变量不被初始化方法% V2 p& H: K* q; E- I% r Keil 中没有像 IAR 里面的这个关键字,而且会有版本的区别,下面分别介绍:1 A& F' X- ^, _" n" P" ` + B: o$ t6 I" j/ y4 }3 l
图1.Keil 不同编译版本 为了防止未初始化的变量被初始化为 0,要将未初始化的变量放在一个特殊段内,这个段满足是 ZI 数据段(.bss),它的执行域(region)具有 UNINIT 属性。 . a' w1 y2 e+ ^ 3.1. Arm® Compiler 5 的操作3 |- Q X; a" C4 Q3 x; [1 |/ } 修改工程的 linker file 文件,*.sct 文件. E; j' `. {. }4 E0 w* M$ ~ * [3 F* v% J2 E8 E0 T, m8 q
图2.修改默认 linker file 这边将 RAM 划分两个区间,其中 RW_IRAM2 就是我们要的变量不初始化区域,属性为UNINIT,定义一个 region 名字 NO_INIT.
2 k( [1 h$ l, c" N. q0 Y8 V: M4 Z 变量定义到这个 section,这边 AC5 要用到 zero_init 这个修饰。
4 [" U# K1 z) f# b. ^+ @ # }( @; q/ P: l5 N! { 3.2. Arm® Compiler 6 的操作 在 AC6 上面需要加入.bss 这个 ZI 定义,如下的 sct 文件修改:6 b" ^+ w" w6 s
3 B5 B3 X9 x9 T: v) R* U! r5 I, j 变量定义到 section 部分,AC5 和 AC6 也是有区别的,不再支持 zero_init 这个修饰,如下定义:1 t m, a" S |1 r( j9 B9 L 8 {* [2 s: v1 C1 L$ c 对于版本 AC5 和 AC6 具体区别可以参考 Keil 帮助文件中的描述:
图3.Keil 帮助文件关于 zero initialized % E/ g3 Z, N6 o+ i8 G/ y! X/ V6 X! K$ U% ? $ \ ~$ f. y& t, i% B 2 k' v, ~: ]9 \( E% m7 Q 04 CubeIDE 实现变量不初始化方法- @ F% O9 v- }/ _8 ? CubeIDE 的实现和 Keil 有类似的操作,需要修改 linker file 文件*.ld。首先对 RAM 进行划分,划分出不初始化的 RAM 区域:+ e1 p% E! K! Y2 i 8 ~9 g+ D; o- O
图4.划分 RAM 区域 增加区域描述,并且加入区域名字: + K R2 g( E9 L: O2 @- f# q' ^# z4 {& x* F
图5.区域描述,名字定义 : l( x+ z4 u8 r6 j3 s' c* {3 \$ k% v o$ p 定义变量到这个不初始化区域中:/ E r: w2 E3 T: h1 g7 S/ @ 0 A' L. a" R4 W" Q- P' M {
! `$ B0 E: X" I. p7 ^" V 另外,还提醒一点,有些 STM32 系列有专门针对特定 RAM 区复位后是否会被初始化的 Option 配置位。比方 STM32L4 系列,想让 SRAM2 变量不被初始化,得配置选项字节中的 SRAM2_RST位。如下图所示:6 G6 F, u' t) @; O. r 2 f0 f/ C' b! m! E0 Y9 L1 q( @
转载自: STM32单片机 如有侵权请联系删除7 l; J5 R/ }8 F ; u* F. B z8 P |
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 评测】人体行为识别
微信公众号
手机版