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

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

[复制链接]
STMCU小助手 发布时间:2023-11-26 15:43
01前言. [4 |) d- k3 D
有些时候在我们的应用过程中要求变量有连续性,或者现场保留,例如 Bootloader 跳转,某种原因的复位过程中我们有些关键变量不能被初始化,在不同的编译环境下有不同的设置,本文就这个操作做总结,分别介绍使用 Keil,IAR 和 CubeIDE 的操作方法,本文中所用芯片为STM32G431RBT6。
, F7 J6 |" L& z3 \% \6 u# X( b* g1 o3 g4 w
02 IAR 实现变量不初始化方法+ `8 v; v" ?& @
IAR 实现相对简单,直接使用“__no_init”这个关键字即可,也就是在变量前面进行修饰:
3 O( }0 f* v: a! B) A0 e% d3 b$ F
* D) c+ z% f5 ~3 Z; i* p; f# ?
0 V5 f9 R$ {5 w1 T" B; Q+ n! }" S
微信图片_20231126153703.jpg
& D% y# X8 d6 B& z' V+ r" p& C
% t! a  }! ~' J) [. q
为了验证是否执行成功,可以考虑周期性让系统复位,看变量的变化,比如下面的示例程序让系统周期复位,会发现每次 Test_NoInit 数据都是在上次数据基础上增加 10,而不是被初始化后的数据增加 10。
- `6 r+ V9 Y; R8 ?- U8 a9 `" O7 t  V* l& ^- t
微信图片_20231126153700.jpg

/ u/ m( e, @* K7 H
0 Y7 D! d+ u. I4 Z; ^! n7 |4 \2 C9 a

  h- }! g1 |; U* U- K03 Keil 实现变量不被初始化方法
: y0 a% k9 x! Q8 GKeil 中没有像 IAR 里面的这个关键字,而且会有版本的区别,下面分别介绍:
- d" A! }: y4 R, r* q2 K
2 S+ }7 I" R/ s
微信图片_20231126153657.jpg
7 z  O' H% Q2 R* u; h
图1.Keil 不同编译版本
+ f& b* r- y/ m2 _, w: e

; v/ V2 F8 x' v( q, u7 E, C为了防止未初始化的变量被初始化为 0,要将未初始化的变量放在一个特殊段内,这个段满足是 ZI 数据段(.bss),它的执行域(region)具有 UNINIT 属性。/ i$ f% G3 P1 f2 J: i, D" M! M
7 U2 U6 k% b2 n
3.1. Arm® Compiler 5 的操作* r2 D8 E3 o: D8 ~& K
修改工程的 linker file 文件,*.sct 文件
8 E' T$ p" p7 B! x' u; ]; s, n& t8 \. z3 _: e4 P% h" R
. s) I" q6 E  y1 C: n
微信图片_20231126153652.jpg
+ P& |$ q1 p8 T/ Y3 T
图2.修改默认 linker file
: w8 j7 ~2 |! e! W8 g$ o
+ k( r5 s% M7 y) b
这边将 RAM 划分两个区间,其中 RW_IRAM2 就是我们要的变量不初始化区域,属性为UNINIT,定义一个 region 名字 NO_INIT.
+ D( E9 U5 v2 Y+ y9 ?& Z, E# _! ~4 K
0 c2 }( D$ S% A: g$ ^& ~
微信图片_20231126153649.jpg

: a7 k( I* M3 p( h7 B: p( h( G( H% ?* [3 U- h
变量定义到这个 section,这边 AC5 要用到 zero_init 这个修饰。
( Y( c. D7 y1 Y! P7 K0 v( R: P
' z+ L2 P0 `- q% y7 R7 }" h& Z
" n) M1 E  p% w; W/ {5 ^
微信图片_20231126153639.jpg

/ d  J2 s5 L: O, Z$ a  `; h- o
  O3 z% J3 ]* V

7 I% Z7 F  g0 g3.2. Arm® Compiler 6 的操作5 b1 q+ \( W$ Y4 W7 e: e
在 AC6 上面需要加入.bss 这个 ZI 定义,如下的 sct 文件修改:) N/ _$ H6 L' z6 e! ^- h

( r# o( N3 j5 P# w( N, D

7 v+ u, n- ^$ C. B8 b
微信图片_20231126153642.jpg

( o7 e+ t+ D& l4 \/ M0 a
7 x# u; \2 o0 W8 A& q% n
' S- J0 A5 k0 Z$ f
变量定义到 section 部分,AC5 和 AC6 也是有区别的,不再支持 zero_init 这个修饰,如下定义:
& C, W- m# Z7 a8 h$ T. w
  z+ g) H! v0 }* A) U: e
8 B- i# O$ ^3 l# Q' w- R

4 {1 N  B* k; V' ^

1 \8 w4 A# i  f9 [, F对于版本 AC5 和 AC6 具体区别可以参考 Keil 帮助文件中的描述:
# k0 G  k( z2 b6 s. x/ h1 ]+ p: Y6 \8 `- q' D) g- D* _  e- U

# s! w/ o; X, K1 |& c
微信图片_20231126153635.jpg
; K9 \, l9 Z! q( x3 w4 N
图3.Keil 帮助文件关于 zero initialized

& a8 [7 `2 O# V% J( \; F
% ^9 Z3 e0 b7 S; \. D  l
9 T& r3 K  q5 L# O. z. m
' d5 @9 o( A& p) x+ N
5 ~) ^# Q' t! ]* P
9 \( F4 G% f1 j% s

9 |/ ?$ R" P/ ^04 CubeIDE 实现变量不初始化方法
& U2 w. M; `0 |CubeIDE 的实现和 Keil 有类似的操作,需要修改 linker file 文件*.ld。首先对 RAM 进行划分,划分出不初始化的 RAM 区域:: ?8 w% s) u7 V7 [1 m+ u

! @) |" Y! G/ M4 m2 v1 n

2 {- e/ ?# \# [
微信图片_20231126153632.jpg

+ d# Z7 t1 k: H2 F+ i
图4.划分 RAM 区域

* U9 Z; U  l: }1 P1 M1 r
# B9 c& S: }+ x$ N) i, J
6 Q" g- n7 T( m; Z) X7 N
增加区域描述,并且加入区域名字:
. f; h4 \. x/ h
8 k/ x' U! Q0 k+ F9 J- a

1 M% J/ P' g0 f  r( p! f
微信图片_20231126153629.jpg
% Q  h; ?- `' Z4 k' A
图5.区域描述,名字定义
" o; K7 I. m  D# i, _+ y( f
4 {7 F" v4 p) D( _$ T

; }5 ~9 \$ F( o! S4 l1 N( t6 Q
8 U/ h0 [$ o( I2 |定义变量到这个不初始化区域中:
) A9 E! q, P+ l  }% r. H+ U
/ X: x6 W3 Y6 a+ s

5 i# e( @( ^1 y( a4 u0 j0 S
微信图片_20231126153625.jpg
% d7 M7 ^0 c2 o
3 [* q2 j1 A. B; q4 Z
另外,还提醒一点,有些 STM32 系列有专门针对特定 RAM 区复位后是否会被初始化的 Option 配置位。比方 STM32L4 系列,想让 SRAM2 变量不被初始化,得配置选项字节中的 SRAM2_RST位。如下图所示:
- q- ^7 Y! k+ m& ~" y9 ^- l$ `+ F, r6 l; Z5 W. @  w, L

8 R) t7 _. u- K0 `# ]3 k6 V
微信图片_20231126153617.jpg
  ]' X! A* O' V9 O
$ w9 [7 x# C3 V( `6 X
) r- J2 t# `( V0 D
转载自: STM32单片机. d6 t3 F/ ~' j) D: Y- H9 c
如有侵权请联系删除
% E- [/ N, O/ z! t! v; ]" q4 l" w. X) q- j5 n. L! q  W% @3 T: z
2 e2 V3 `) e- t. N0 `: u: q/ B
微信图片_20231126153645.jpg
收藏 1 评论0 发布时间:2023-11-26 15:43

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版