0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

实战经验 | Keil、IAR、CubeIDE 中变量不被初始化方法

STM32单片机 来源:未知 2023-11-24 18:05 次阅读


关键词:不被初始化,编译环境


目录预览

1、前言

2、IAR 实现变量不初始化方法

3、Keil 实现变量不被初始化方法

4、CubeIDE 实现变量不初始化方法


01

前言


有些时候在我们的应用过程中要求变量有连续性,或者现场保留,例如 Bootloader 跳转,某种原因的复位过程中我们有些关键变量不能被初始化,在不同的编译环境下有不同的设置,本文就这个操作做总结,分别介绍使用 Keil,IAR 和 CubeIDE 的操作方法,本文中所用芯片STM32G431RBT6。


02

IAR 实现变量不初始化方法


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



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



03

Keil 实现变量不被初始化方法


Keil 中没有像 IAR 里面的这个关键字,而且会有版本的区别,下面分别介绍:


图1.Keil 不同编译版本


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


3.1. Arm Compiler 5 的操作


修改工程的 linker file 文件,*.sct 文件


图2.修改默认 linker file


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



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



3.2. Arm Compiler 6 的操作


在 AC6 上面需要加入.bss 这个 ZI 定义,如下的 sct 文件修改:



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



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


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


04

CubeIDE 实现变量不初始化方法


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


图4.划分 RAM 区域


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


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



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



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



完整内容请点击“阅读原文”下载原文档。


原文标题:实战经验 | Keil、IAR、CubeIDE 中变量不被初始化方法

文章出处:【微信公众号:STM32单片机】欢迎添加关注!文章转载请注明出处。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6032

    文章

    44513

    浏览量

    632874
  • STM32
    +关注

    关注

    2266

    文章

    10870

    浏览量

    354759

原文标题:实战经验 | Keil、IAR、CubeIDE 中变量不被初始化方法

文章出处:【微信号:STM32_STM8_MCU,微信公众号:STM32单片机】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    基于旋转平移解耦框架的视觉惯性初始化方法

    精确和鲁棒的初始化对于视觉惯性里程计(VIO)至关重要,因为不良的初始化会严重降低姿态精度。
    的头像 发表于 11-01 10:16 202次阅读
    基于旋转平移解耦框架的视觉惯性<b class='flag-5'>初始化</b><b class='flag-5'>方法</b>

    TMS320C6000 McBSP初始化

    电子发烧友网站提供《TMS320C6000 McBSP初始化.pdf》资料免费下载
    发表于 10-26 10:10 0次下载
    TMS320C6000 McBSP<b class='flag-5'>初始化</b>

    Keil变量不被初始化方法

    有些时候在我们的应用过程要求变量有连续性,或者现场保留,例如Bootloader跳转,某种原因的复位过程我们有些关键变量不能被初始化,在
    的头像 发表于 08-30 11:47 525次阅读
    <b class='flag-5'>Keil</b><b class='flag-5'>中</b><b class='flag-5'>变量</b><b class='flag-5'>不被</b><b class='flag-5'>初始化</b><b class='flag-5'>方法</b>

    STM32F103RC变量初始化问题求解

    Test0变量的值一直是0x03,并且无法被初始化其他值。 例如:ArryTest[7]的地址为0x20000200,Test0 的地址为0x2000020e,则Test0 的值无法被修改,一直为0x03. 有哪位朋友遇到过这样的问题没有?
    发表于 04-10 07:35

    使用STM32CubeIDE初始化STM32407的SPI1(PB3)初始化失败的原因?怎么解决?

    使用STM32CubeIDE初始化STM32407的SPI1(PB3)初始化失败,有人知道原因吗?
    发表于 03-25 07:50

    字符型、指针型等变量等该如何初始化

     对于数值类型的变量往往初始化为0,但对于其他类型的变量,如字符型、指针型等变量等该如何初始化呢?
    的头像 发表于 03-18 11:02 1253次阅读

    MCU单片机GPIO初始化该按什么顺序配置?为什么初始化时有电平跳变?

    GPIO初始化时有时钟配置、模式配置、输出配置、复用配置,那么在编写初始化代码时,到底该按什么顺序执行呢?如果顺序不当那初始化过程可能会出现短暂的电平跳变。
    的头像 发表于 02-22 11:07 1427次阅读
    MCU单片机GPIO<b class='flag-5'>初始化</b>该按什么顺序配置?为什么<b class='flag-5'>初始化</b>时有电平跳变?

    rtc时钟如何在启动后会不被初始化为默认值?

    ? 2.我有一部分数据想保存在SRAM,软件复位或者看门狗复位都不会被初始化,类似于stm32的静态SRAM。这个我看是可以实现的,但是我找不到相应的例程。能够提供帮助? 3.如果以上两个问题,我这里
    发表于 02-21 06:08

    dataflash的静态变量初始化会变吗,怎么改变变量的值?

    dataflash的静态变量初始化会变吗,怎么改变变量的值? 若系统启动初始化时,不改变变量
    发表于 01-15 06:27

    使用SEGGER Embedded Studio编译器发现变量无法自动初始化

    使用SEGGER Embedded Studio编译器发现变量无法自动初始化, 例如声明静态变量static uint8_t i = 0;这种写法i成了静态变量,但没有
    发表于 01-11 14:21

    串口初始化一般是初始化哪些内容

    串口初始化是指在使用串口进行数据通信之前,对串口进行一系列的设置和配置,以确保串口能够正常工作。串口初始化的内容主要包括以下几个方面: 串口硬件设置:首先,需要确定要使用的串口是哪一个,通常计算机
    的头像 发表于 01-04 09:39 3051次阅读

    labview运行后如何初始化

    LabVIEW是一款强大的图形编程软件,在运行之前通常需要进行一些初始化操作。本文将详细介绍LabVIEW运行前的初始化过程,并提供了一些常用的初始化
    的头像 发表于 12-28 17:24 2480次阅读

    自动初始化机制原理详解

    自动初始化机制是指初始化函数不需要被显式调用,只需要在函数定义处通过宏定义的方式进行申明,就会在系统启动过程中被执行。这篇文章就来探索一下其中的奥秘, 简单理解其原理!
    的头像 发表于 12-16 09:33 963次阅读
    自动<b class='flag-5'>初始化</b>机制原理详解

    C语言编程时,各种类型的变量该如何初始化

    C语言编程时,各种类型的变量该如何初始化? 在C语言中,每个变量都需要在使用之前进行初始化初始化是为
    的头像 发表于 12-07 13:53 1126次阅读

    在ubuntu20.04如何初始化rosdep

    初始化rosdep 输入以下的命令,先对其初始化一下 sudo rosdep init 如果出现以下界面,那么恭喜你,你可以省下一些麻烦了,直接跳到第7步就行了: 如果出现了以下几种错误,也不要担心
    的头像 发表于 12-01 16:22 878次阅读
    在ubuntu20.04<b class='flag-5'>中</b>如何<b class='flag-5'>初始化</b>rosdep