[url=/u/]@[/url] yjmeishao
一、藏在.bss空间里的小秘密
在进行嵌入式开发过程中,编译输出目录文件一般都会生成.map文件,在开发过程中如果去检查下.map文件,说不定会有意外的收获
- 驱动代码里面数组变量有要求0x4000字节对齐的要求:

- 由于数组变量对齐的要求,需要在.bss段填充0x335C字节:

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

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

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

更新后的.bss所占用的空间大小从0x104666降低为0x101268(降低了13310字节空间)
二、.data和.bss的选择
首先看下链接脚本文件里面和.bss相关的内容 - 未初始化的数据

需要主要的是在.bss里面有提供_szero和_ezero
在看下启动汇编文件 - 如何初始化.bss的内容

在系统启动的时候,会根据.bss里面有提供_szero和_ezero的地址信息,将RAM从开始地址_szero到结束地址_ezero所对应的RAM空间内容都执行清零操作。
注意事项:
- 放在.bss区域的数组、用户定义的变量,可以在代码里面不用再执行清零的操作 - 例如下图代码中对trns_tbl这个数组的清零操作,实际中是可以屏蔽掉的

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


- 放在.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空间

