目录
1. 蓝讯蓝牙方案, 程序分为 com区和bank区
2. 在优化前, 先了解530X RAM / FLASH空间是如何分配的.
3. 去掉COM区512 BYTE对齐, 查看实际爆多少Byte
4. 通过map.txt查看哪些代码占用了公共区.
5. 常用可以优化的公共区代码:
6. 首先查看 config.h中, 把与实际使用无关宏disable掉.
7. 查看map.txt文件, 找出可能用不到或代码编写有冗余的函数, 尝试优化.
8. 查看bcomm区中是否有空闲空间, 可以 把comm区中的部份代码放到bcomm区中.
9. 如果以上方法均尝试后, com区还不够, 可以让原厂提供定制库文件, 节约公共区.
com区(公共区): 芯片在进入main函数之前, 程序会先把com区程序从Flash加载到芯片内部Ram. 在程序的整个生命周期内, com区程序会一直保留在RAM中. CPU执行com区代码会很快.
bank区(也称为flash区): 程序根据需要不断把Flash(bank程序存储区)中的代码动态替换(加载)到 RAM中的bank程序运行区运行. 由于芯片与Flash之间通过spi进行通信, bank区代码执行速度相对比较慢.
所以对于时效性要求比较高的函数, 如:中断函数及其子函数等, 需要放到com区, 这就带来了com区不足的问题. 此文主要看看如省com区.
下面以530X 开KARAOK+TWS为例, 编译工程后, 发现com区不足, log提示如下
示例中, com区超出了512BYTE, 一般几百byte的空间, 更改外部程序可以优化出来
程序在编译链接时, 会根据ram.ld文件中的空间分配规则进行代码链接, 最终空间分配结果可以在 "Output\bin\map.txt"中查看.
这里的公共区, 实际上有两个:
comm: 一般用户公共区.
bcomm: 蓝牙专用公共区.
它们即可放代码, 也可以放数据
comm和bcomm功能上是等价的, 两个com区均是上电代码加载进来,并一直常驻于这片RAM中. 当一方有空另一方爆掉时,可以把爆掉一方的代码放移到有空的一方中.
此图中, 提示comm区代码爆掉了512 byte.
comm区是以512对齐存放的, 实际超过的代码可能没有512Byte
在ram.ld文件中, 可以把512对齐先干掉, 并重新编译, 查看具体爆掉多少byte. 注意最后要改回来.
这里可以看到, 实际只爆掉了128 byte.
由于公共区已爆掉, 无法生成正常的map.txt文件, 此时, 可以把comm区加大, 以便于生成map.txt文件, 查看占用公共区的代码.(注意修改完成后要还原以前公共区大小)
如下图中, 在ram.ld文件中, 把爆掉的comm区大小增加到35K, 此时编译可以正常生成map.txt文件.
查看map.txt文件, 可以看到哪些函数在公共区中:
在ld文件中, 用户公共区空间分配为
comm(rx) : org = __comm_vma, len = __comm_ram_size 也就是
comm(rx) : org = 0x20000, len = 34K // [0x20000, 0x28800]
在map.txt中, 从0x2000处, 可以具体查看哪些函数占用了公共区
标准SDK中, 公共区代码实际上有冗余, 可以进行一些优化.
如把不需要的按键去掉. 按键都在中断中扫描, 使用到了公共区.
红外是否需要, 或是否需要多个或只要一个?
是否需要双击或三击功能?
是否需要各种检测? 这些检测一般在公共区中.
一些功能模块, 也可能用到公共区, 也可以把相关宏disable掉.
如 BT_TWS_EN, 各种音频解码MUSIC_WMA_SUPPORT/MUSIC_APE_SUPPORT......
常见的如port_mute.c中, mute去掉配置工具代码配置, 直接接高或拉低IO进行mute功能控制, 节约不少公共区代码.
类似port_mute.c中的配置工具使用到的公共区代码, 还有port_sd.c/port_line.c /port_mic.c等中的检测功能函数, 这些均可以按需要进行简洁的写法来优化.
bcomm(rx) : org = __bcomm_vma, len = 8k //0x18000 ~ 0x20000
在map.txt中, 可以看到bcomm中还有0xd2的空闲空间.
这里在map.txt找一段comm区中的 .com_text.karaok.rec 放入到bcomm区中.
ram.ld文件中这样更改, 编译后, 刚好解决comm区爆掉128byte的问题.
如蓝牙库中, 可以定制去掉AAC/TWS/BLE/TSCO/主从切换等等, 可以节约一些公共区出来.
如532X中, 蓝牙库释放了多种库文件, 根据需要选用不同库文件, 以节约com区.
本章节完. thanks.