中科蓝讯蓝牙: 公共区(com区)空间不够一般优化方法

目录

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区还不够, 可以让原厂提供定制库文件, 节约公共区.


1. 蓝讯蓝牙方案, 程序分为 com区和bank区

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区)空间不够一般优化方法

示例中, com区超出了512BYTE,  一般几百byte的空间, 更改外部程序可以优化出来

2. 在优化前, 先了解530X RAM / FLASH空间是如何分配的. 

程序在编译链接时, 会根据ram.ld文件中的空间分配规则进行代码链接, 最终空间分配结果可以在 "Output\bin\map.txt"中查看.

中科蓝讯蓝牙: 公共区(com区)空间不够一般优化方法

这里的公共区, 实际上有两个:

comm: 一般用户公共区.

bcomm: 蓝牙专用公共区.

它们即可放代码, 也可以放数据

comm和bcomm功能上是等价的, 两个com区均是上电代码加载进来,并一直常驻于这片RAM中.  当一方有空另一方爆掉时,可以把爆掉一方的代码放移到有空的一方中.

3. 去掉COM区512 BYTE对齐, 查看实际爆多少Byte

中科蓝讯蓝牙: 公共区(com区)空间不够一般优化方法

此图中,  提示comm区代码爆掉了512 byte.

comm区是以512对齐存放的, 实际超过的代码可能没有512Byte

在ram.ld文件中, 可以把512对齐先干掉, 并重新编译, 查看具体爆掉多少byte. 注意最后要改回来.

中科蓝讯蓝牙: 公共区(com区)空间不够一般优化方法

 

中科蓝讯蓝牙: 公共区(com区)空间不够一般优化方法

这里可以看到, 实际只爆掉了128 byte.

4. 通过map.txt查看哪些代码占用了公共区.

由于公共区已爆掉, 无法生成正常的map.txt文件, 此时, 可以把comm区加大, 以便于生成map.txt文件, 查看占用公共区的代码.(注意修改完成后要还原以前公共区大小)

如下图中, 在ram.ld文件中, 把爆掉的comm区大小增加到35K, 此时编译可以正常生成map.txt文件.

中科蓝讯蓝牙: 公共区(com区)空间不够一般优化方法

查看map.txt文件, 可以看到哪些函数在公共区中:

在ld文件中, 用户公共区空间分配为 

comm(rx)        : org = __comm_vma,         len = __comm_ram_size  也就是

comm(rx)        : org = 0x20000,         len = 34K         // [0x20000, 0x28800]

在map.txt中, 从0x2000处, 可以具体查看哪些函数占用了公共区

中科蓝讯蓝牙: 公共区(com区)空间不够一般优化方法

 

5. 常用可以优化的公共区代码:

标准SDK中, 公共区代码实际上有冗余, 可以进行一些优化. 

6. 首先查看 config.h中, 把与实际使用无关宏disable掉.

如把不需要的按键去掉. 按键都在中断中扫描, 使用到了公共区.

中科蓝讯蓝牙: 公共区(com区)空间不够一般优化方法

红外是否需要, 或是否需要多个或只要一个?

 

是否需要双击或三击功能?

中科蓝讯蓝牙: 公共区(com区)空间不够一般优化方法

是否需要各种检测? 这些检测一般在公共区中.

中科蓝讯蓝牙: 公共区(com区)空间不够一般优化方法

一些功能模块, 也可能用到公共区, 也可以把相关宏disable掉.

如 BT_TWS_EN,  各种音频解码MUSIC_WMA_SUPPORT/MUSIC_APE_SUPPORT......

7. 查看map.txt文件, 找出可能用不到或代码编写有冗余的函数, 尝试优化. 

常见的如port_mute.c中,  mute去掉配置工具代码配置, 直接接高或拉低IO进行mute功能控制, 节约不少公共区代码.

中科蓝讯蓝牙: 公共区(com区)空间不够一般优化方法

类似port_mute.c中的配置工具使用到的公共区代码, 还有port_sd.c/port_line.c /port_mic.c等中的检测功能函数, 这些均可以按需要进行简洁的写法来优化.

8. 查看bcomm区中是否有空闲空间, 可以 把comm区中的部份代码放到bcomm区中.

 bcomm(rx)       : org = __bcomm_vma,        len = 8k    //0x18000 ~ 0x20000

在map.txt中, 可以看到bcomm中还有0xd2的空闲空间.

中科蓝讯蓝牙: 公共区(com区)空间不够一般优化方法

这里在map.txt找一段comm区中的 .com_text.karaok.rec 放入到bcomm区中.

中科蓝讯蓝牙: 公共区(com区)空间不够一般优化方法

ram.ld文件中这样更改, 编译后, 刚好解决comm区爆掉128byte的问题.

中科蓝讯蓝牙: 公共区(com区)空间不够一般优化方法

9. 如果以上方法均尝试后, com区还不够, 可以让原厂提供定制库文件, 节约公共区.

如蓝牙库中,  可以定制去掉AAC/TWS/BLE/TSCO/主从切换等等, 可以节约一些公共区出来.  

如532X中, 蓝牙库释放了多种库文件, 根据需要选用不同库文件, 以节约com区.

中科蓝讯蓝牙: 公共区(com区)空间不够一般优化方法

本章节完. thanks.