电子产业一站式赋能平台

PCB联盟网

搜索
查看: 329|回复: 0
收起左侧

Keil中变量不被初始化方法

[复制链接]

397

主题

397

帖子

2463

积分

三级会员

Rank: 3Rank: 3

积分
2463
发表于 2024-8-15 21:00:00 | 显示全部楼层 |阅读模式

2y3bvnn5w1z64018364713.png

2y3bvnn5w1z64018364713.png

- [2 _& o/ P  P2 [9 R. Q* R+ O, M5 ^% F7 w: p8 A8 L2 ?5 _
有些时候在我们的应用过程中要求变量有连续性,或者现场保留,例如 Bootloader 跳转,某种原因的复位过程中我们有些关键变量不能被初始化,在不同的编译环境下有不同的设置,本文就这个操作做总结,分别介绍使用 Keil,IAR 和 CubeIDE 的操作方法,本文中所用芯片为:STM32G431RBT6。Keil 中没有这个关键字,而且会有版本的区别,下面分别介绍:) f4 Y. M7 T) @4 p9 Y

4xcr2hxwpdn64018364813.png

4xcr2hxwpdn64018364813.png
+ A" Y+ s# ]: e' `( i4 b. h
为了防止未初始化的变量被初始化为0,要将未初始化的变量放在一个特殊段内,这个段满足是ZI数据段(.bss),它的执行域(region)具有UNINIT属性。7 E6 j% i7 r# J9 }; B
1.Arm? Compiler 5的操作" T9 q$ F8 R; a6 K- G
修改工程的linkerfile文件,*.sct文件3 r6 J& S7 e0 c- }0 B% N# a# c7 Z

qclb2pr5s2c64018364913.jpg

qclb2pr5s2c64018364913.jpg
2 \, V) W5 k: t& q( E
这边将RAM划分两个区间,其中RW_IRAM2就是我们要的变量不初始化区域,属性为UNINIT,定义一个region名字NO_INIT.
  • ER_IROM1 0x08000000 0x00020000 { ; load address = execution address*.o (RESET, +First)*(InRoot$$Sections).ANY (+RO).ANY (+XO)}  RW_IRAM1 0x20000400 0x00007C00 {     ; RW data    .ANY (+RW +ZI)  }  RW_IRAM2 0x20000000 UNINIT 0x00000400   {    .ANY (NO_INIT)   }}变量定义到这个 section,这边 AC5 要用到 zero_init 这个修饰。
  • uint16_t Test_NoInit __attribute__((section("NO_INIT"),zero_init)); // Work for AC5  Q1 Z6 X, o* j) ?8 b
    2. Arm? Compiler 6 的操作, d* y6 ^: Y  V. X, |
    在 AC6 上面需要加入.bss 这个 ZI 定义,如下的 sct 文件修改:
  • RW_IRAM2 0x20000000 UNINIT 0x00000400 { .ANY (.bss.NO_INIT)}变量定义到 section 部分,AC5 和 AC6 也是有区别的,不再支持 zero_init 这个修饰,如下定义:
  • uint16_t Test_NoInit __attribute__((section(".bss.NO_INIT"))); // Work for AC6! ~: G3 l0 E  q& @+ x
    对于版本 AC5 和 AC6 具体区别可以参考 Keil 帮助文件中的描述:; G! o9 o/ p- e, P1 ]1 i

    ovbbsylafyx64018365013.png

    ovbbsylafyx64018365013.png

    0 f2 s# |! Z. o==========* J. E, b+ }8 `( K7 J
    往期回顾:如何提高单片机的运算效率之FPU- P- |' Q! c  l. {, ?4 M
    蓝桥杯物联网教程汇总_2405299 q# i9 L* Z* X$ ~4 z: [) Z
    ==========# C, }1 j5 m- v& c0 Z
    0 J! M0 J, b$ Q. Z

    3znmbgymv2c64018365113.png

    3znmbgymv2c64018365113.png
    " @* b0 K2 `  p* n

    7 s3 j  N/ Q) A9 k) m( i

    q3cig43ui2g64018365213.png

    q3cig43ui2g64018365213.png

    + s/ g/ g) A& o" o
    . p8 b& w8 v0 Y. B$ e& Y# T6 H

    krb1qjx3qbd64018365313.png

    krb1qjx3qbd64018365313.png
  • 回复

    使用道具 举报

    发表回复

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则


    联系客服 关注微信 下载APP 返回顶部 返回列表