有些时候在我们的应用过程中要求变量有连续性,或者现场保留,例如 Bootloader 跳转,某种原因的复位过程中我们有些关键变量不能被初始化,在不同的编译环境下有不同的设置,本文就这个操作做总结,分别介绍使用 Keil,IAR 和 CubeIDE 的操作方法,本文中所用芯片为:STM32G431RBT6。Keil 中没有这个关键字,而且会有版本的区别,下面分别介绍:
为了防止未初始化的变量被初始化为0,要将未初始化的变量放在一个特殊段内,这个段满足是ZI数据段(.bss),它的执行域(region)具有UNINIT属性。
修改工程的linkerfile文件,*.sct文件
这边将RAM划分两个区间,其中RW_IRAM2就是我们要的变量不初始化区域,属性为UNINIT,定义一个region名字NO_INIT.
ER_IROM10x080000000x00020000{;loadaddress=executionaddress*.o(RESET,+First)*(InRoot$$Sections).ANY(+RO).ANY(+XO)} RW_IRAM10x200004000x00007C00{ ;RWdata .ANY(+RW+ZI) } RW_IRAM20x20000000UNINIT0x00000400 { .ANY(NO_INIT) }}
变量定义到这个 section,这边 AC5 要用到 zero_init 这个修饰。
uint16_tTest_NoInit__attribute__((section("NO_INIT"),zero_init));//WorkforAC5
2. Arm Compiler 6 的操作
在 AC6 上面需要加入.bss 这个 ZI 定义,如下的 sct 文件修改:
RW_IRAM20x20000000UNINIT0x00000400{ .ANY (.bss.NO_INIT)}
变量定义到 section 部分,AC5 和 AC6 也是有区别的,不再支持 zero_init 这个修饰,如下定义:
uint16_tTest_NoInit__attribute__((section(".bss.NO_INIT")));//WorkforAC6
对于版本 AC5 和 AC6 具体区别可以参考 Keil 帮助文件中的描述:
-
keil
+关注
关注
68文章
1211浏览量
166659 -
变量
+关注
关注
0文章
613浏览量
28327 -
初始化
+关注
关注
0文章
49浏览量
11831
发布评论请先 登录
相关推荐
评论