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

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

3天内不再提示

Keil中变量不被初始化方法

撞上电子 2024-08-30 11:47 次阅读

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

870eec1c-6682-11ef-89ff-92fbcf53809c.png

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

1.Arm Compiler 5的操作

修改工程的linkerfile文件,*.sct文件

873a8fde-6682-11ef-89ff-92fbcf53809c.png

这边将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 帮助文件中的描述:

8760cb2c-6682-11ef-89ff-92fbcf53809c.png

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

    关注

    68

    文章

    1211

    浏览量

    166659
  • 变量
    +关注

    关注

    0

    文章

    613

    浏览量

    28327
  • 初始化
    +关注

    关注

    0

    文章

    49

    浏览量

    11831
收藏 人收藏

    评论

    相关推荐

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

    在敲代码的时候,我们会给变量一个初始值,以防止因为编译器的原因造成变量初始值的不确定性。对于数值类型的变量往往
    发表于 09-23 11:50 2159次阅读

    C语言中未初始化的局部变量到底是多少

    C语言中,未初始化的局部变量到底是多少?
    发表于 10-21 14:42 1951次阅读

    【原创分享】变量初始化技巧

    由于在嵌入式系统必须考虑程序规模的问题,因此,对程序变量初始化也需要进行慎重的考虑。在C语言中,基本数据结构(字符型、整型)的初始化
    发表于 09-08 15:28

    变量初始化的基本原则

    一、变量初始化变量初始化的基本原则为:可综合代码完成内部变量
    发表于 01-19 07:07

    如何设置STM32单片机非初始化数据变量不被初始化

    一些产品,当系统复位后(非上电复位),可能要求保持住复位前RAM的数据,用来快速恢复现场,或者不至于因瞬间复位而重启现场设备。而keil mdk在默认情况下,任何形式的复位都会将RAM区的非初始化
    发表于 01-02 15:56 8263次阅读
    如何设置STM32单片机非<b class='flag-5'>初始化</b>数据<b class='flag-5'>变量</b><b class='flag-5'>不被</b>零<b class='flag-5'>初始化</b>

    你知道C之变量初始化的重要性?

    C之变量初始化的重要性
    发表于 05-15 16:46 969次阅读
    你知道C之<b class='flag-5'>变量</b><b class='flag-5'>初始化</b>的重要性?

    在51平台下初始化文件的引入导致全局变量无法初始化的问题如何解决

    本文档的主要内容详细介绍的是在51平台下初始化文件的引入导致全局变量无法初始化的问题如何解决。
    发表于 08-20 17:31 0次下载
    在51平台下<b class='flag-5'>初始化</b>文件的引入导致全局<b class='flag-5'>变量</b>无法<b class='flag-5'>初始化</b>的问题如何解决

    使用51单片机进行有关变量初始化问题资料讲解

    如果定义一个变量,不对这个变量进行初始化,其变量默认初值为0。虽然大部分正确,但也是在一定条件下,即所有程序中所有变量占用的字节之和要小于1
    发表于 08-13 17:32 0次下载
    使用51单片机进行有关<b class='flag-5'>变量</b>及<b class='flag-5'>初始化</b>问题资料讲解

    一种修饰符能使变量在处理器复位而不被初始化

    有一种修饰符能使变量在处理器复位而不被初始化
    的头像 发表于 03-14 15:01 3955次阅读
    一种修饰符能使<b class='flag-5'>变量</b>在处理器复位而<b class='flag-5'>不被</b><b class='flag-5'>初始化</b>

    EE-88:使用21xx编译器初始化C语言中的变量

    EE-88:使用21xx编译器初始化C语言中的变量
    发表于 05-19 21:08 1次下载
    EE-88:使用21xx编译器<b class='flag-5'>初始化</b>C语言中的<b class='flag-5'>变量</b>

    VHDL和Verilog数组定义、初始化、赋值方法

    方法:实际应用里,通常需要在上电复位过程变量进行初始化,如果数组个数少时,直接赋初始值即可,但是数组个数多时,可以用循环实现赋值,通常的
    的头像 发表于 09-23 14:20 1.1w次阅读

    dart语言的变量声明与初始化

    变量是每一们语言的基础,在Dart中所有变量都是对象,并且都有一个初始化的值null。
    的头像 发表于 12-08 16:47 1225次阅读

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

    关键词:不被初始化,编译环境 目录预览 1、前言 2、IAR 实现变量初始化方法 3、Keil
    的头像 发表于 11-24 18:05 3885次阅读

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

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

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

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