STM32/GD32_分散加载

Q:如何将一个变量、某个源文件的函数在编译阶段就存储在用户指定的区域?

KEIL环境:.map后缀文件、.sct后缀文件

IAR环境:.map后缀文件、.icf后缀文件

【map文件】

对固件里面的变量、函数、常量等元素的存储空间进行分配的说明文件

STM32/GD32_分散加载_第1张图片

下面看几个变量的不同状态在map的存储说明:

全局的

STM32/GD32_分散加载_第2张图片

STM32/GD32_分散加载_第3张图片

 》可以看到,全局变量是否占用数据空间取决于后续是否使用这个变量。

局部的

STM32/GD32_分散加载_第4张图片

STM32/GD32_分散加载_第5张图片 

STM32/GD32_分散加载_第6张图片 

STM32/GD32_分散加载_第7张图片

STM32/GD32_分散加载_第8张图片

 》可以看到,对于局部变量,无论是否加static修饰,仅仅声明未被使用的变量不会占用数据空间

》被static修饰的局部变量且后续被使用才会占用空间,未被static修饰的局部变量就算后续被使用也不会占用数据空间

PS:keil对于未初始化的数组,元素个数<9时算RW-data,元素个数大于8的算ZI-data

 

STM32/GD32_分散加载_第9张图片 程序最终生成的固件空间大小取决于code、RO(只读数据)、RW(可读写数据)

一个完整的程序由代码和数据组成;

1、只定义未使用的全局或局部变量不占用存储空间。

2、被static修饰为全生命周期的局部变量也要后续使用才会占用空间。

3、未进行初始化的数组变量被算做ZI-Data部分

【sct/icf文件】

设置RAM、FALSH存储空间的起始地址和偏移量

将函数或变量添加到用户自定义区域(配合__attribute__ 编译特性使用)

》Keil界面,默认分配状态

STM32/GD32_分散加载_第10张图片

》IAR界面

STM32/GD32_分散加载_第11张图片

【__attribute__ 】

__attribute__((__packed__))

__attribute__((at(addr)))

STM32/GD32_分散加载_第12张图片

 STM32/GD32_分散加载_第13张图片

》可以看到,在指定的地址存储了用户需要提前存储的数据,加了packed关键字后存储空间明显缩小;对于结构体默认是以4字节对齐的方式调整

__attribute__((section("func_name")))

__attribute__((aligned(8))) 对齐方式

__attribute__((packed, aligned(8)))

你可能感兴趣的:(STM32/GD32,sct文件,stm32,gd32,分散加载)