中科蓝讯蓝牙: 公共区(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区超出了512BYTE,  一般几百byte的空间, 更改外部程序可以优化出来

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

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

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

comm: 一般用户公共区.

bcomm: 蓝牙专用公共区.

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

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

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

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

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

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

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

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

由于公共区已爆掉, 无法生成正常的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处, 可以具体查看哪些函数占用了公共区

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

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

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

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

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

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

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

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

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

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

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

类似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的空闲空间.

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

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

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

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

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

本章节完. thanks.

### 中科蓝讯智能手表芯片方案 #### 芯片选型 中科蓝讯提供了多款适用于智能手表的芯片型号,其中最新的选型表《中科蓝讯芯片选型表2023》涵盖了多种高性能芯片,例如 AB212B、AB135C 和 AB2016A 等[^1]。这些芯片不仅具备低功耗特性,还能够满足智能手表对于性能和功能的需求。 #### 主流方案介绍 基于中科蓝讯 BT8958B2 的 Smart Watch 方案被广泛应用于智能手表领域。此方案支持多项核心功能,包括但不限于心率检测、计步统计、抬腕唤醒等健康监测功能;同时还支持表盘自定义切换、消息提醒推送、蓝牙通话以及本地音乐播放等功能[^2]。这使得搭载该芯片的手表能够在日常生活中为用户提供全方位的服务体验。 #### 应用场景扩展 除了基础的功能外,在智能家居设备方面,通过集成中科蓝讯蓝牙模块,还可以实现与家庭其他智能终端之间的联动操作,比如控制灯光亮度调节或者开关状态调整等等[^3]。这种跨平台互联互通的能力进一步增强了产品的实用价值。 #### 开发资料准备 为了更好地理解和应用上述提到的各种特性和优势,在实际开发过程中还需要深入学习一些关键技术文档。其中包括 `app.lst` 文件用于描述应用程序结构布局;`ram.ld` 则是用来配置内存分配情况;而 `map.txt` 提供了详细的链接映射信息以便于调试优化程序性能等问题[^4]。 ```python # 示例代码片段展示如何初始化一个简单的BLE服务 (假设使用Python模拟环境) import bluetooth def initialize_ble_service(): server_sock=bluetooth.BluetoothSocket( bluetooth.RFCOMM ) port = 1 server_sock.bind(("",port)) server_sock.listen(1) initialize_ble_service() print("Waiting for connection on RFCOMM channel %d" % port) ``` 以上就是关于中科蓝讯智能手表相关的信息概览及其背后所依托的技术支撑体系。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值