STM32/GD32_分散加载

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

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

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

【map文件】

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

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

全局的

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

局部的

 

 

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

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

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

 

程序最终生成的固件空间大小取决于code、RO(只读数据)、RW(可读写数据)

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

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

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

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

【sct/icf文件】

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

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

》Keil界面,默认分配状态

》IAR界面

【__attribute__ 】

__attribute__((__packed__))

__attribute__((at(addr)))

 

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

__attribute__((section("func_name")))

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

__attribute__((packed, aligned(8)))

相关推荐

  1. gd32stm32的区别

    2023-12-05 15:42:07       25 阅读
  2. STM32/GD32——CAN协议

    2023-12-05 15:42:07       18 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-05 15:42:07       14 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-05 15:42:07       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-05 15:42:07       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-05 15:42:07       18 阅读

热门阅读

  1. PTA 7-229 sdut-C语言实验- 排序

    2023-12-05 15:42:07       31 阅读
  2. boost库---circular_buffer用法

    2023-12-05 15:42:07       38 阅读
  3. CentOS部署python Flask项目

    2023-12-05 15:42:07       40 阅读
  4. Vue封装组件 父子组件相互传值

    2023-12-05 15:42:07       34 阅读
  5. CSS进阶

    CSS进阶

    2023-12-05 15:42:07      28 阅读
  6. Kubernetes 使用插件扩展 kubectl

    2023-12-05 15:42:07       42 阅读
  7. Spark_spark shell退出方式

    2023-12-05 15:42:07       34 阅读