STMCU小助手
发布时间:2023-11-26 15:43
|
01前言9 P5 N a5 C3 F3 x7 n( a) F$ b 有些时候在我们的应用过程中要求变量有连续性,或者现场保留,例如 Bootloader 跳转,某种原因的复位过程中我们有些关键变量不能被初始化,在不同的编译环境下有不同的设置,本文就这个操作做总结,分别介绍使用 Keil,IAR 和 CubeIDE 的操作方法,本文中所用芯片为STM32G431RBT6。$ z. W/ J8 U B) q' a4 W 0 L1 B7 d: G; S, Z& c) z 02 IAR 实现变量不初始化方法 IAR 实现相对简单,直接使用“__no_init”这个关键字即可,也就是在变量前面进行修饰:- `' z6 g% K; n8 N: C T 5 v2 T% w9 x) g9 r3 b
为了验证是否执行成功,可以考虑周期性让系统复位,看变量的变化,比如下面的示例程序让系统周期复位,会发现每次 Test_NoInit 数据都是在上次数据基础上增加 10,而不是被初始化后的数据增加 10。* o6 p) S' V' F
03 Keil 实现变量不被初始化方法3 }# J) B* l# h) C Keil 中没有像 IAR 里面的这个关键字,而且会有版本的区别,下面分别介绍: ! M: t1 d4 G/ Q+ h: v
图1.Keil 不同编译版本 + a' z. ^' e( E- O O/ t为了防止未初始化的变量被初始化为 0,要将未初始化的变量放在一个特殊段内,这个段满足是 ZI 数据段(.bss),它的执行域(region)具有 UNINIT 属性。 o8 S# C1 I8 Q; A 3.1. Arm® Compiler 5 的操作 修改工程的 linker file 文件,*.sct 文件4 ^6 F, _; m P2 n 2 ?0 u/ o; G+ T! l, s! Q9 N; w
图2.修改默认 linker file 0 A1 `1 g. V; i& v$ ]9 f* d, t这边将 RAM 划分两个区间,其中 RW_IRAM2 就是我们要的变量不初始化区域,属性为UNINIT,定义一个 region 名字 NO_INIT.7 i3 v! M# Q: h6 P) n - d4 k7 t/ C6 F6 @# Q5 Z. V6 n ' e* \4 |6 H9 [0 `% g& N
变量定义到这个 section,这边 AC5 要用到 zero_init 这个修饰。 0 Y; E. c0 [2 R3 n3 v , Z j/ c8 w1 H* \" y4 ?
3 K' I8 q8 c- a8 J 3.2. Arm® Compiler 6 的操作2 a/ r1 [: G1 h E! U3 V9 \ 在 AC6 上面需要加入.bss 这个 ZI 定义,如下的 sct 文件修改: 3 I7 y/ R+ y) D( I
! z# Q! b9 I s7 | 变量定义到 section 部分,AC5 和 AC6 也是有区别的,不再支持 zero_init 这个修饰,如下定义:- Y- m* \) Y1 Q! a, {# X! ]& T 对于版本 AC5 和 AC6 具体区别可以参考 Keil 帮助文件中的描述:2 B+ A$ ]; X7 x) ~3 H1 E5 } @( \" M( T+ ?. h0 G. ^' D
图3.Keil 帮助文件关于 zero initialized * O4 @# @5 w7 ^2 O* o( w# @. M: \3 a! u2 X * C) m1 I; p* \' S, t 04 CubeIDE 实现变量不初始化方法% @2 _1 g: V3 H3 f CubeIDE 的实现和 Keil 有类似的操作,需要修改 linker file 文件*.ld。首先对 RAM 进行划分,划分出不初始化的 RAM 区域:* |4 T8 v P- }; A8 V$ N1 |/ \* E % K) F* p' o+ h1 \
图4.划分 RAM 区域 : M/ X" M8 s* x: o/ |' o7 q3 a# F6 O5 T1 y7 Z% ^" Q# X 增加区域描述,并且加入区域名字: % v! B) f! e8 r9 v+ k2 @
图5.区域描述,名字定义 ! |# g* |. X, o( _$ m+ g+ B# b定义变量到这个不初始化区域中: - _, D# ?6 x6 a9 n6 U
$ C4 ?1 B) q( x v* X0 l 另外,还提醒一点,有些 STM32 系列有专门针对特定 RAM 区复位后是否会被初始化的 Option 配置位。比方 STM32L4 系列,想让 SRAM2 变量不被初始化,得配置选项字节中的 SRAM2_RST位。如下图所示:, {! Z+ K* y0 l S $ ?0 O9 V2 q) P6 z$ Z) a! K
5 a0 b" _/ U) ~( f I: ^ 7 Q2 G2 t5 |+ C5 `' T" r' R 转载自: STM32单片机4 \) Z/ J' |! l* l6 ^1 I 如有侵权请联系删除 3 L& J5 f8 z! i $ S5 n, t3 c3 `( r2 t& r |
STM32Cube嵌入式软件更新(2026年8月)
【STM32H5 评测】基础硬件加密与随机数性能 - STM32H5E5实测硬件AES加解密、HASH运算、TRNG真随机数输出速率与稳定性
【STM32H5 评测】NUCLEO-H5E5ZJ 使用 TrustZone 安全分区系统实践测试
【STM32H5 评测】CPU核心性能 - STM32H5E5跑 RTOS,观察任务切换速度、中断响应快慢
【STM32H5 评测】内存读写性能 - STM32H5E5实测Flash,SRAM读写速度,用DMA搬运大块数据
【NUCLEO-C562RE】OLED 显示
保姆级教程:CMake 工程导入 STM32CubeIDE 步骤
STM32CubeCLT 1.22.0新版本发布
【下载问题解决】关于ST官网下载软件问题解决
【STM32H735G-DK测评】lvgl移植
微信公众号
手机版