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

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

[复制链接]
STMCU小助手 发布时间:2023-11-26 15:43
01前言
' \3 M8 G; Q) G$ o7 r有些时候在我们的应用过程中要求变量有连续性,或者现场保留,例如 Bootloader 跳转,某种原因的复位过程中我们有些关键变量不能被初始化,在不同的编译环境下有不同的设置,本文就这个操作做总结,分别介绍使用 Keil,IAR 和 CubeIDE 的操作方法,本文中所用芯片为STM32G431RBT6。
! l. f6 V# C' J* V7 i1 M7 Y. W% Z7 Z. o' b1 `4 n; R
02 IAR 实现变量不初始化方法% c; _& {1 Y, B# |9 t, B  w
IAR 实现相对简单,直接使用“__no_init”这个关键字即可,也就是在变量前面进行修饰:
% c- j1 o& q2 H2 Q7 i8 g; S" |. j# H3 `

  ?" ^- ?  T% ?5 z- @5 B$ p
微信图片_20231126153703.jpg
' l# }( u0 R$ R4 p# @
& 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
微信图片_20231126153700.jpg
0 T* l/ F6 G; L7 g
7 q7 {) J/ |7 G: k+ Q4 i7 d

# j/ U* ~# M0 f( J/ B03 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
微信图片_20231126153657.jpg
; ]. E- o6 H9 Q" \  a! K
图1.Keil 不同编译版本

, j7 S2 \7 g/ }( i- `' i5 {5 b0 O2 I
4 q; a6 @7 a0 @+ C4 `- D" K$ z( I1 W为了防止未初始化的变量被初始化为 0,要将未初始化的变量放在一个特殊段内,这个段满足是 ZI 数据段(.bss),它的执行域(region)具有 UNINIT 属性。
- J5 B2 N( a  j; k) g% ?" P. 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

$ ^4 W& ]3 C' d# t4 u2 E% O
微信图片_20231126153652.jpg
5 F; @; r- r* D: |
图2.修改默认 linker file

2 r  `7 U- Z# m/ r) O4 y2 t
- h. w4 P- d- R+ `7 L( K这边将 RAM 划分两个区间,其中 RW_IRAM2 就是我们要的变量不初始化区域,属性为UNINIT,定义一个 region 名字 NO_INIT.
4 B6 s8 B' v4 [% d
; C" ^9 ]9 B0 J* {9 f2 L* _

5 R) W* M) |" a% V: o" U
微信图片_20231126153649.jpg
# T8 p" I4 y% ?( `5 y
2 k( [1 h$ l, c" N. q0 Y8 V: M4 Z
变量定义到这个 section,这边 AC5 要用到 zero_init 这个修饰。
5 `2 R! k8 s) ]' n- d
" W. k) f; {% {' T

% {0 |5 c# b4 @6 r: H9 z) w! e
微信图片_20231126153639.jpg

3 J8 G& O: P( d7 P$ D- i- \  w4 [" U# K1 z) f# b. ^+ @
# }( @; q/ P: l5 N! {
3.2. Arm® Compiler 6 的操作
3 b  W$ u6 j# W7 N! q) F* J在 AC6 上面需要加入.bss 这个 ZI 定义,如下的 sct 文件修改:6 b" ^+ w" w6 s

6 b1 W* L( X" X

6 F2 G( y6 g+ Z+ q5 `$ X
微信图片_20231126153642.jpg

6 ?: F9 `: {( K4 Y9 `3 B5 B3 X9 x9 T: v) R* U! r5 I, j

& `0 Y. {0 ~( _8 P8 L) ]( W4 [变量定义到 section 部分,AC5 和 AC6 也是有区别的,不再支持 zero_init 这个修饰,如下定义:1 t  m, a" S  |1 r( j9 B9 L

. k( J/ k6 t5 T# {* W" h; V
8 {* [2 s: v1 C1 L$ c

: y0 j. ], s) h

7 G+ H. ~! B. g" r8 M5 q对于版本 AC5 和 AC6 具体区别可以参考 Keil 帮助文件中的描述:
* {' t+ w* @  {$ p: j2 F4 n
* Z, R- I. I3 G" z+ k- i

! n6 p/ n, H! b  H
微信图片_20231126153635.jpg

) Y/ Y; G& Z9 {$ a- m5 W& @& s
图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

( p/ i. ]% M7 O9 M# t% b3 ?
8 R9 ~; N+ Q& p! c: y

/ |  I6 u7 _8 \* ]5 t04 CubeIDE 实现变量不初始化方法- @  F% O9 v- }/ _8 ?
CubeIDE 的实现和 Keil 有类似的操作,需要修改 linker file 文件*.ld。首先对 RAM 进行划分,划分出不初始化的 RAM 区域:+ e1 p% E! K! Y2 i
8 ~9 g+ D; o- O

/ v" c+ [2 M1 m* _  _; a. q
微信图片_20231126153632.jpg
! F0 Z$ @+ }6 l; {4 S) l9 Q
图4.划分 RAM 区域

) c9 }' }% H6 d

' C+ Z! k9 X7 b5 O
3 f" N/ h- A5 r, ~. m8 V4 ~4 g
增加区域描述,并且加入区域名字:
+ K  R2 g( E9 L
: O2 @- f# q' ^# z4 {& x* F

+ W5 b5 D% \  q* @2 {  r& {
微信图片_20231126153629.jpg

9 M1 D# k' v+ ?- F% U6 D
图5.区域描述,名字定义
: l( x+ z4 u8 r6 j3 s

6 C! H& O) }! H2 k$ f& L0 U* s( T
* `- O* y; C: Z8 X  @
' c* {3 \$ k% v  o$ p
定义变量到这个不初始化区域中:/ E  r: w2 E3 T: h1 g7 S/ @
0 A' L. a" R4 W" Q- P' M  {

( P' ]. p5 O! N4 J! V3 v
微信图片_20231126153625.jpg

+ ]; V, F- A+ j- ~9 k; L! v! `$ B0 E: X" I. p7 ^" V
另外,还提醒一点,有些 STM32 系列有专门针对特定 RAM 区复位后是否会被初始化的 Option 配置位。比方 STM32L4 系列,想让 SRAM2 变量不被初始化,得配置选项字节中的 SRAM2_RST位。如下图所示:6 G6 F, u' t) @; O. r

1 p7 E/ H1 [: ~9 `' M  f
2 f0 f/ C' b! m! E0 Y9 L1 q( @
微信图片_20231126153617.jpg

0 w) T# }6 {$ k' E7 Z& u1 E
- X7 I* E, H5 U/ T6 J

4 V0 O/ {. K& {) _2 V6 C0 x$ m转载自: STM32单片机
" l) \9 E* \& g' T6 v; M3 M! i如有侵权请联系删除7 l; J5 R/ }8 F
; u* F. B  z8 P

5 F( O! }2 ]0 B+ u5 C4 U
微信图片_20231126153645.jpg
收藏 1 评论0 发布时间:2023-11-26 15:43

举报

0个回答

所属标签

相似技术帖

官网相关资源

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