GD32F130FXP6学习笔记十二:mdk定义一些变量上电不初始化

本文介绍如何在MDK中避免某些变量被默认初始化为0的方法,通过自定义内存块和使用特定属性来实现变量的非初始化状态,适用于希望减少启动时间和内存占用的嵌入式项目。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        用IAR的同学一定知道__no_init关键字,就是把一些变量放到no_zero段,MCU复位时候

不会初始化这些变量。查看了下mdk的C编译器说明文档,并没有专门的关键字,解决方法是

需要自己开辟一个UNINIT的内存块,再把不需要初始化的变量定义到这个内存块里面(内存块地址和

大小,需要手动修改,不够灵活)。

一、MDK四中属性


code :代码区

rodata :只读数据

rwdata :可读写数据

zidata :(用户)未初始化区(编译器会自己初始化为0)


我自己测试了下,如果是一个未初始化的变量,那么放到了rwdata区;如果是一个未初始化的数组,

则放到了zidata区。但是不管放到哪个区,编译器都会自己完成初始化0。


关于zidata说明:

The ANSI C specification states that static data that is not explicitly initialized, is to be initialized to zero. 

Therefore, by default, the compiler puts both zero-initialized and uninitialized data into the same ZI data 

section, which is populated with zeroes at runtime by the C library initialization code.



二、手动修改分散加载文件


如上图设置,单击Edit,手动编辑分散加载文件(语法请看上一篇)。

编辑后的:

LR_IROM1 0x08000000 0x00010000  {    ; load region size_region
  ER_IROM1 0x08000000 0x00010000  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
  }
  RW_IRAM1 0x20000000 0x00001C00  {  ; RW data
   .ANY (+RW +ZI)
  }
  NON_INITIALIZED  +0  UNINIT  0x00000400  {    ; NO_INIT   RW data
    * (no_init)
  }
}

三、使用说明

uint8_t     chBss   __attribute__((section("NO_INIT"),zero_init));
#pragma arm section zidata="NO_INIT"
uint8_t     chBssArray[10];

其中:

__attribute__((section("NO_INIT"),zero_init))和#pragma arm section zidata="NO_INIT"

是等价的。






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值