Keil中变量不被初始化方法

6f9a6cfdc1524f80a15a0418d7b7e886.png

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

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

4d8d3d53852a6f9021eaf82a763c7c3c.png

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

1.Arm® Compiler 5的操作

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

cb2ede84ff147feb14933a59b8bff357.jpeg

这边将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

2. Arm® Compiler 6 的操作

在 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

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

7c54c4eb9f3ded7ecfebbbb8924c21f3.png

==========

往期回顾:

如何提高单片机的运算效率之FPU

蓝桥杯物联网教程汇总_240529

==========

ca65581958a0baf9e1bf737b436db867.png

f76130195b730f444bf99b70b45429b2.png

130cb075d3450eb53d6841362d4b98a5.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值