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

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

[复制链接]
STMCU小助手 发布时间:2023-11-26 15:43
01前言
5 Q5 Z8 S4 N" f5 ^3 s有些时候在我们的应用过程中要求变量有连续性,或者现场保留,例如 Bootloader 跳转,某种原因的复位过程中我们有些关键变量不能被初始化,在不同的编译环境下有不同的设置,本文就这个操作做总结,分别介绍使用 Keil,IAR 和 CubeIDE 的操作方法,本文中所用芯片为STM32G431RBT6。
4 l+ L8 T3 r! x2 n0 C8 u( d2 D3 T- e, Q( ]
02 IAR 实现变量不初始化方法4 K( d, G6 V' p
IAR 实现相对简单,直接使用“__no_init”这个关键字即可,也就是在变量前面进行修饰:
* s. M# C  M+ }7 b% ?$ Y  Y; P9 h: B

0 O2 f, e+ Z) B! B) h
微信图片_20231126153703.jpg

$ W5 D" A. I; e2 p( u! }9 N& v& [
5 @; [, K6 S# }3 C; g7 e为了验证是否执行成功,可以考虑周期性让系统复位,看变量的变化,比如下面的示例程序让系统周期复位,会发现每次 Test_NoInit 数据都是在上次数据基础上增加 10,而不是被初始化后的数据增加 10。
& k4 |% B7 o/ i, d. o4 H( P- @9 j7 _" N* }2 E, w; Q
微信图片_20231126153700.jpg

4 p8 S% T7 @. I6 Q. U0 M9 y. A6 Y& P- K# j; h. |

$ X" \4 \. d: w7 D4 z$ t: G03 Keil 实现变量不被初始化方法, t4 M% q- x0 P- D: ?4 T
Keil 中没有像 IAR 里面的这个关键字,而且会有版本的区别,下面分别介绍:
' ]# V  V/ J( D# R0 g; z5 B. u! J
8 k# j! H* [9 M2 [9 I2 b
微信图片_20231126153657.jpg
: L+ p5 ]. P7 N7 b# }5 U! `# {
图1.Keil 不同编译版本
3 g; k& D; J0 A3 {, J

, x3 @; Z+ Q( [0 N. o为了防止未初始化的变量被初始化为 0,要将未初始化的变量放在一个特殊段内,这个段满足是 ZI 数据段(.bss),它的执行域(region)具有 UNINIT 属性。
# |& [- S% n# \9 A7 {( c9 ^
' `: W2 O3 B; N. p2 f$ v, p+ P3.1. Arm® Compiler 5 的操作# C7 R7 ~) C8 E
修改工程的 linker file 文件,*.sct 文件
5 D* e& ]9 F& Y0 J) d; ~$ S' u2 N3 S6 |6 }3 W  D! b* l
8 I7 S, T/ R( z. X4 h& `
微信图片_20231126153652.jpg

! |2 V3 h( b, S* v1 C4 L. @7 Y5 M# v7 y
图2.修改默认 linker file

4 G% d9 w: j$ B% ?1 a5 i( }4 N: t. F5 t3 o
这边将 RAM 划分两个区间,其中 RW_IRAM2 就是我们要的变量不初始化区域,属性为UNINIT,定义一个 region 名字 NO_INIT.
: n% N+ Q3 P" N' x8 @
* E5 g  [4 H5 z. ^: U1 }

& y. i6 N7 g' }' N* y& r
微信图片_20231126153649.jpg
7 `6 ~9 J3 \. X% c' C2 u

; Q4 r/ `* R( e, I变量定义到这个 section,这边 AC5 要用到 zero_init 这个修饰。. x1 @* W- L1 x/ i, \" b, a  s
. {+ a- B% v0 U9 J! ?% p3 E+ l: B

  U: c' Z' d! g% ]3 l
微信图片_20231126153639.jpg

( D  U8 l; M1 ~6 E7 e  P) q
  l- y- |0 y- b& Y# D+ [
( z" V) H" }% E  E4 p
3.2. Arm® Compiler 6 的操作
1 ]+ a% q1 T8 O在 AC6 上面需要加入.bss 这个 ZI 定义,如下的 sct 文件修改:
: \$ L) F1 _+ u0 J8 `
% b5 r4 A/ n7 G% d6 f7 f( ?4 X
5 K- _) a) x6 F: `. a& ~! u
微信图片_20231126153642.jpg
; e9 M- j& j# j7 Q! o
  ]" l( u4 B( @. E# |: w8 C

" w+ r1 ]: P$ \% S) z, U# d# N: x  [变量定义到 section 部分,AC5 和 AC6 也是有区别的,不再支持 zero_init 这个修饰,如下定义:
, a& _- Z& F7 l9 U1 s. M6 F5 n; Z1 U
3 H" y0 Y: w3 _
5 g# X& i) w/ Q2 R- u, y2 O

" a4 f/ Q; I: U6 ]; u对于版本 AC5 和 AC6 具体区别可以参考 Keil 帮助文件中的描述:# N+ ]# E) ~$ Q5 f. s1 _
5 w: x0 u, N3 L! [5 s. Q1 ~

/ d, \. D5 Z7 o8 s' ^. r
微信图片_20231126153635.jpg
5 j/ E8 [' h2 ]. l  r
图3.Keil 帮助文件关于 zero initialized
- J" J/ m0 I" ~1 f$ [7 ~
% {3 `7 [7 c4 y0 `

- R$ G$ I$ f2 n
3 x3 V, c$ Y) P. c* B

3 A, F4 T0 R0 s
4 Z' }! ?2 Y2 z$ n
- t- g5 B% ~% L" e# Y) p
04 CubeIDE 实现变量不初始化方法
) f1 G; @+ o' _* \CubeIDE 的实现和 Keil 有类似的操作,需要修改 linker file 文件*.ld。首先对 RAM 进行划分,划分出不初始化的 RAM 区域:
% _/ s$ @2 ?3 S
1 J; D% R- i! h, h$ ?# r
7 Z6 u1 o0 \; S, J3 m
微信图片_20231126153632.jpg

3 m, F, X  R0 g. H4 ?, S
图4.划分 RAM 区域
+ h3 w$ f8 J; U9 w

; `- K6 {6 ~# z

0 U$ I3 R  `- C) O" p3 t
增加区域描述,并且加入区域名字:
0 D% Y+ r  k1 O9 J) v/ c* Y

' x% E0 I  k( t0 i* m

* X' k6 |8 m! ^) ~: U) Y8 t; I7 X
微信图片_20231126153629.jpg

* s6 U1 `! R5 A0 K8 y
图5.区域描述,名字定义
5 Z* \: F$ C; r0 ], u7 M  f( D
: r, G3 S" m# s* [  p: a  E

2 F* c9 l# `& J# C( G! v9 m) [0 n1 H; h
定义变量到这个不初始化区域中:
4 u& y" B1 D  E6 e/ W$ q% a1 F% M
2 \' k) s4 x1 R# V$ Y

2 g/ e% J* }% w% F1 m
微信图片_20231126153625.jpg
& H4 C. l; \9 k( P# h2 [
, e& K$ N6 q- d- m& e/ d- j2 ]
另外,还提醒一点,有些 STM32 系列有专门针对特定 RAM 区复位后是否会被初始化的 Option 配置位。比方 STM32L4 系列,想让 SRAM2 变量不被初始化,得配置选项字节中的 SRAM2_RST位。如下图所示:3 X: b  i( z+ S+ ^6 F* Q
9 A; A' u3 H5 R! V2 I
) }% b( _- b4 l: x
微信图片_20231126153617.jpg

' r8 t6 I3 E/ V
$ r) r8 X3 L6 g/ j) @

7 W) A8 W- H- S% m4 f转载自: STM32单片机
1 ]- @0 h, u2 _( M7 O2 z! T) V如有侵权请联系删除9 y! N' d- k0 K+ m2 u3 J

, y' C+ `! d0 y$ y- J/ q6 z/ }' s. V
微信图片_20231126153645.jpg
收藏 1 评论0 发布时间:2023-11-26 15:43

举报

0个回答

所属标签

相似技术帖

官网相关资源

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