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

2019-04-13 14:04发布

        用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" 是等价的。