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

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

[复制链接]
STMCU小助手 发布时间:2023-11-26 15:43
01前言
有些时候在我们的应用过程中要求变量有连续性,或者现场保留,例如 Bootloader 跳转,某种原因的复位过程中我们有些关键变量不能被初始化,在不同的编译环境下有不同的设置,本文就这个操作做总结,分别介绍使用 Keil,IAR 和 CubeIDE 的操作方法,本文中所用芯片为STM32G431RBT6。

02 IAR 实现变量不初始化方法
IAR 实现相对简单,直接使用“__no_init”这个关键字即可,也就是在变量前面进行修饰:


微信图片_20231126153703.jpg


为了验证是否执行成功,可以考虑周期性让系统复位,看变量的变化,比如下面的示例程序让系统周期复位,会发现每次 Test_NoInit 数据都是在上次数据基础上增加 10,而不是被初始化后的数据增加 10。

微信图片_20231126153700.jpg



03 Keil 实现变量不被初始化方法
Keil 中没有像 IAR 里面的这个关键字,而且会有版本的区别,下面分别介绍:

微信图片_20231126153657.jpg

图1.Keil 不同编译版本


为了防止未初始化的变量被初始化为 0,要将未初始化的变量放在一个特殊段内,这个段满足是 ZI 数据段(.bss),它的执行域(region)具有 UNINIT 属性。

3.1. Arm® Compiler 5 的操作
修改工程的 linker file 文件,*.sct 文件


微信图片_20231126153652.jpg

图2.修改默认 linker file


这边将 RAM 划分两个区间,其中 RW_IRAM2 就是我们要的变量不初始化区域,属性为UNINIT,定义一个 region 名字 NO_INIT.


微信图片_20231126153649.jpg


变量定义到这个 section,这边 AC5 要用到 zero_init 这个修饰。


微信图片_20231126153639.jpg



3.2. Arm® Compiler 6 的操作
在 AC6 上面需要加入.bss 这个 ZI 定义,如下的 sct 文件修改:


微信图片_20231126153642.jpg



变量定义到 section 部分,AC5 和 AC6 也是有区别的,不再支持 zero_init 这个修饰,如下定义:




对于版本 AC5 和 AC6 具体区别可以参考 Keil 帮助文件中的描述:


微信图片_20231126153635.jpg

图3.Keil 帮助文件关于 zero initialized







04 CubeIDE 实现变量不初始化方法
CubeIDE 的实现和 Keil 有类似的操作,需要修改 linker file 文件*.ld。首先对 RAM 进行划分,划分出不初始化的 RAM 区域:


微信图片_20231126153632.jpg

图4.划分 RAM 区域



增加区域描述,并且加入区域名字:



微信图片_20231126153629.jpg

图5.区域描述,名字定义




定义变量到这个不初始化区域中:


微信图片_20231126153625.jpg


另外,还提醒一点,有些 STM32 系列有专门针对特定 RAM 区复位后是否会被初始化的 Option 配置位。比方 STM32L4 系列,想让 SRAM2 变量不被初始化,得配置选项字节中的 SRAM2_RST位。如下图所示:


微信图片_20231126153617.jpg



转载自: STM32单片机
如有侵权请联系删除


微信图片_20231126153645.jpg
收藏 1 评论0 发布时间:2023-11-26 15:43

举报

0个回答

所属标签

相似分享

官网相关资源

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