当前位置: 首页 > article >正文

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)))


http://www.kler.cn/a/152471.html

相关文章:

  • Paraformer 语音识别原理
  • Android Audio实战——音频焦点监听(十)
  • 从薛定谔的猫——量子理论基础
  • 设计模式详解(二):抽象工厂——Abstract Factory
  • JavaEE——简单认识CSS
  • oracle impdp 导入元数据表空间异常增大的解决办法
  • 党建引领·和谐共建——赤岗街首届微型社区养老服务公益博览会开幕
  • (2)(2.2) Lightware SF45/B(350度)
  • 2的幂运算
  • IC修真院 | 芯片嵌入式课程重磅上线!
  • 中伟视界:AI盒子中的报警预录像功能能解决什么问题?实现原理是怎样的?
  • 关于微信小程序中如何实现数据可视化-echarts动态渲染
  • java21虚拟线程
  • Windows平台下的oracle 11G-11.2.0.4补丁升级操作指南
  • java对xml压缩
  • GPLT(有空就写)
  • Java之Stream的实用语法
  • 掌握区块链技术将推进2024年市场发展脚步
  • 在Rust中编写自动化测试
  • Go语言与Java:一场编程语言之争