[PIC32/SAM] 看懂.map输出文件里面的小秘密 #申请原创#

[复制链接]
191|0
yjmeishao 发表于 2025-11-10 18:48 | 显示全部楼层 |阅读模式
, , , , 输出, ma

[url=/u/]@[/url] yjmeishao

一、藏在.bss空间里的小秘密

在进行嵌入式开发过程中,编译输出目录文件一般都会生成.map文件,在开发过程中如果去检查下.map文件,说不定会有意外的收获

  • 驱动代码里面数组变量有要求0x4000字节对齐的要求
  • 由于数组变量对齐的要求,需要在.bss段填充0x335C字节

在bss段所填充的字节,在实际应用中没有得到使用,属于对处理器可使用RAM空间的浪费

  • 继续检查.map文件,查看.bss段具体内容


惊喜的地方是bss所在存储区域开始的位置是0x200b4000,开始的位置正好是0x4000对齐,正好能够满足驱动代码里面数组变量对齐的需求。

  • 对驱动里面数组变量的存储位置手动指定存储区域

手动将trns_tlb[]数组所在的存储区域强制性放到.sbss区域


更新后的.bss所占用的空间大小从0x104666降低为0x101268(降低了13310字节空间)

二、.data和.bss的选择

首先看下链接脚本文件里面和.bss相关的内容 - 未初始化的数据


需要主要的是在.bss里面有提供_szero和_ezero

在看下启动汇编文件 - 如何初始化.bss的内容


在系统启动的时候,会根据.bss里面有提供_szero和_ezero的地址信息,将RAM从开始地址_szero到结束地址_ezero所对应的RAM空间内容都执行清零操作。


注意事项:

  1. 放在.bss区域的数组、用户定义的变量,可以在代码里面不用再执行清零的操作 - 例如下图代码中对trns_tbl这个数组的清零操作,实际中是可以屏蔽掉的

  1. 放在.bss区域的数组、用户定义的变量,在编译输出的binary文件中并不占用实际空间
  2. 已经初始化的变量会放在.data区域并且会在编译输出的binary文件中占用存储空间(比如想对irq_desc这个数组进行显性化的赋初始值,irq_desc这个数组会放在.data区域并在输出的binary中占用空间)

  1. 放在.bss区域的数组、用户定义的变量,由于在启动过程中需要执行初始化操作,因此大的数组的存在会影响到系统的启动速度,因此需要做出权衡-比如想减少输出binary文件大小,大的数组尽可能放在.bss区域,想做更快速启动则可以考虑放在.data区域

三、合理利用处理器提供的RAM资源:

先看下链接脚本文件,定义了ddram、ddr_nocache和sram三个区域。ddram是一个通用的内存区域,ddr_nocache用于图形系统framebuffer缓存空间,而sram区域如果不特别注意的话,很容易被浪费掉,由于处理器对SRAM区域访问速度非常的快,而且SRAM区域的访问也会被cache缓存,因此合理利用好SRAM区域对我们应用性能的提升也非常有帮助。

手动将中断映射表放到.region_sram区域

输出的.map文件里面可以在.region_sram区域看到irq_desc[]数组已经被存放到SRAM空间

您需要登录后才可以回帖 登录 | 注册

本版积分规则

17

主题

114

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部