你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于STM32的Keil、IAR、CubeIDE 中变量不被初始化方法

[复制链接]
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 实现变量不初始化方法
) H1 e1 Y- O, X/ VIAR 实现相对简单,直接使用“__no_init”这个关键字即可,也就是在变量前面进行修饰:- `' z6 g% K; n8 N: C  T

: G. ^. Z( D8 ^, N( o3 @4 v
5 v2 T% w9 x) g9 r3 b
微信图片_20231126153703.jpg
+ ^% C8 b, u$ s, K0 B% G" K

4 C: T9 x  b0 K, j4 a. v1 g  `为了验证是否执行成功,可以考虑周期性让系统复位,看变量的变化,比如下面的示例程序让系统周期复位,会发现每次 Test_NoInit 数据都是在上次数据基础上增加 10,而不是被初始化后的数据增加 10。* o6 p) S' V' F

, v, a, o7 F' ~- k
微信图片_20231126153700.jpg

; G/ ]# d9 @% Y
5 @3 z7 {# ~( T  F$ t

, _7 k3 n, L: r9 j* D3 m03 Keil 实现变量不被初始化方法3 }# J) B* l# h) C
Keil 中没有像 IAR 里面的这个关键字,而且会有版本的区别,下面分别介绍:
% j8 U- B: r# u# u0 ]! M: t1 d4 G/ Q+ h: v
微信图片_20231126153657.jpg

' q2 E+ ?& X: F7 T- M
图1.Keil 不同编译版本
+ a' z. ^' e( E- O  O/ t

7 ]6 V' z0 p2 M4 o5 u. g6 ^+ ]! e为了防止未初始化的变量被初始化为 0,要将未初始化的变量放在一个特殊段内,这个段满足是 ZI 数据段(.bss),它的执行域(region)具有 UNINIT 属性。
# T. Q9 z$ g0 Z1 l" I9 O  o8 S# C1 I8 Q; A
3.1. Arm® Compiler 5 的操作
  S, q# P9 O) x2 X/ j' G3 v' G2 Z/ F; y1 {* w修改工程的 linker file 文件,*.sct 文件4 ^6 F, _; m  P2 n
2 ?0 u/ o; G+ T! l, s! Q9 N; w

) |! j' E& R+ ]( P! O  y
微信图片_20231126153652.jpg
0 s5 i6 A2 Y7 o. v3 w- x6 ]
图2.修改默认 linker file
0 A1 `1 g. V; i& v$ ]9 f* d, t

; D# Z- r# {! p/ W8 ^" _这边将 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
微信图片_20231126153649.jpg
, V# o2 k9 |! r$ V

% J: ~' w3 U2 M2 x* ^$ @变量定义到这个 section,这边 AC5 要用到 zero_init 这个修饰。
1 n: y6 t/ S7 F6 |; r0 Y; E. c0 [2 R3 n3 v
, Z  j/ c8 w1 H* \" y4 ?
微信图片_20231126153639.jpg
( \7 M. [3 I0 z5 q$ m" |. M5 q8 h, J
3 K' I8 q8 c- a8 J

1 ]- O2 y4 \9 m7 N; a3 T3.2. Arm® Compiler 6 的操作2 a/ r1 [: G1 h  E! U3 V9 \
在 AC6 上面需要加入.bss 这个 ZI 定义,如下的 sct 文件修改:
, \7 o: D2 {8 H6 w, q; E  Q+ a3 I7 y/ R+ y) D( I

* E( m. V# n0 ]
微信图片_20231126153642.jpg
# L# I0 T2 n; V6 l
! z# Q! b9 I  s7 |

4 h# a$ S. \7 p4 L, Y7 B变量定义到 section 部分,AC5 和 AC6 也是有区别的,不再支持 zero_init 这个修饰,如下定义:- Y- m* \) Y1 Q! a, {# X! ]& T

1 m( _2 f1 y0 }* \$ s3 P2 Y2 u/ R9 \

8 a- |, N& ~  K! [" G3 @8 F) u
7 }4 J. p. k. w, f) ^

% u& x- O& {; [2 c对于版本 AC5 和 AC6 具体区别可以参考 Keil 帮助文件中的描述:2 B+ A$ ]; X7 x) ~3 H1 E5 }
  @( \" M( T+ ?. h0 G. ^' D

7 p1 z: h6 N6 p, x8 j) O
微信图片_20231126153635.jpg
' j4 o9 p4 e$ i! t! _: X: m. s
图3.Keil 帮助文件关于 zero initialized
* O4 @# @5 w7 ^2 O

* I5 ^: a4 l; Y# E

, g6 e. w7 U% t: b8 v
8 j- r. |# ^3 v

/ @; g! Y. I% B; B- I; g* 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

0 K, O$ H" O" w- l1 A9 j
% K) F* p' o+ h1 \
微信图片_20231126153632.jpg

' I1 q- h& U8 K: @' d' s/ n
图4.划分 RAM 区域
: M/ X" M8 s* x: o/ |' o7 q3 a
# F6 O5 T1 y7 Z% ^" Q# X

; |6 O- x# f7 h
增加区域描述,并且加入区域名字:
% v! B) f! e8 r9 v+ k2 @

$ I7 L& v# n  Z

& Z5 Z8 t# u. T3 q5 z  g
微信图片_20231126153629.jpg
) F4 w7 ~) Q0 p- _4 {
图5.区域描述,名字定义
! |# g* |. X, o( _$ m+ g+ B# b

" R9 f2 F  \& F' T

* }; z8 u' m! Z- e) ^3 p: o6 ~! G
$ ]3 \' B: q, W. @" v: ~. p定义变量到这个不初始化区域中:
# ^! x0 T( K" G; D- _, D# ?6 x6 a9 n6 U

9 J) p) \- P4 G$ y9 m
微信图片_20231126153625.jpg
7 G' ~+ h$ \; @# E0 {# g
$ C4 ?1 B) q( x  v* X0 l
另外,还提醒一点,有些 STM32 系列有专门针对特定 RAM 区复位后是否会被初始化的 Option 配置位。比方 STM32L4 系列,想让 SRAM2 变量不被初始化,得配置选项字节中的 SRAM2_RST位。如下图所示:, {! Z+ K* y0 l  S

5 k2 u+ s! u6 |- s7 f+ X
$ ?0 O9 V2 q) P6 z$ Z) a! K
微信图片_20231126153617.jpg

2 C4 c1 ^2 t4 t) |5 a0 b" _/ U) ~( f  I: ^
7 Q2 G2 t5 |+ C5 `' T" r' R
转载自: STM32单片机4 \) Z/ J' |! l* l6 ^1 I
如有侵权请联系删除
8 e) k6 a2 z( f0 H4 t. Y3 L& J5 f8 z! i
$ S5 n, t3 c3 `( r2 t& r
微信图片_20231126153645.jpg
赞 收藏 1 评论0 发布时间:2023-11-26 15:43

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版