本章主要介绍BES平台逻辑地址映射以及内存的使用方法。
一、逻辑地址映射
虽然这些内存的逻辑地址不同,但其中一些内存指向同一物理地址:BTH RAM 和 BTH RAMX/FRAMX指向同一物理地址,BTH FLASH、BTH FLASH_NC和BTH FLASHX也指向另一物理地址。
名称中带X的内存称为ITCM(Instruction Tightly Memory,指令紧耦合内存),不带X的表示DTCM(Data Tightly Memory,数据紧耦合内存)。顾名思义,前者用于存放指令,后者用于存放数据。
二、Flash映射
共有以下四大Flash区域:
1.扩展引导加载程序
- 扩展引导加载程序(Secondary Bootloader),有时也被称为SBL,负责更新App
-
FLASH_OTA_BOOT_INFO_T存放于0x1000,用于通知SBL应该映射、跳转到哪一个image区域。
2.A/B分区
- 双拷贝区包括通过OTA更新的app映像文件、提示音和用户二进制文件;
- A区和B区具有相同的大小,且每个子区域具有相同的偏移地址;
- 由于BES QSPI控制器支持Flash 物理地址—→逻辑地址 的映射。
采用A/B分区的主要作用:
- 无缝更新:AB分区允许系统在后台下载和安装更新,而不影响当前运行的系统。这意味着更新过程对用户来说是透明的。
- 故障恢复:如果新更新失败或存在问题,系统可以轻松地回滚到以前的稳定版本。这是因为旧的系统版本仍然保存在另一个分区中。
- 减少停机时间:由于更新过程不会中断当前操作,因此可以显著减少系统的停机时间。
- 增强的安全性:这种机制可以防止因更新失败或被恶意软件攻击而导致的系统损坏。
3.变量区
- 用于存储在整个软件生命周期内不断变化的信息。例如配对信息、音量等。
4.NV区
- 该区域经过产线之后便不会再修改。
- 工厂区通常位于最后一个4KB Flash区域,以便于BES下载工具对nv区的信息进行编程:BT mac地址、BT名称、BLE mac地址、BLE名称等。
- ANC音频配置区用于存储经过产线调校的ANC配置和ANC相关校准值
三、音频缓冲区
所有空闲RAM都可以用作音频缓冲区。音频缓冲区分为普通音频缓冲区和音频采集缓冲区,分别对应两个宏:APP_AUDIO_BUFFER_SIZE和APP_CAPTURE_AUDIO_BUFFER_SIZE。前一个是音频缓冲区的大小,后一个是音频采集缓冲区的大小。
音频缓冲区的范围从空闲RAM空间的顶部到top + APP_AUDIO_BUFFER_SIZE;而音频采集缓冲区的范围从tail - APP_CAPTURE_AUDIO_BUFFER_SIZE到空闲RAM空间的尾部tail,确保它们彼此不重叠。
1.音频缓冲区分配(以播放音乐为例)
(1)初始化具有特定大小的内存池
app_audio_mempool_init_with_specific_size(APP_AUDIO_BUFFER_SIZE);
(2)获取分配给音频缓冲区的内存地址
app_audio_mempool_get_buff(&bt_audio_buff, stream_cfg.data_size);
2.音频采集缓冲区分配(以语音唤醒为例)
(1)初始化音频采集内存池
app_capture_audio_mempool_init();
(2)获取分配给音频采集缓冲区的内存地址
app_capture_audio_mempool_get_buff(&buf,APP_CAPTURE_AUDIO_BUFFER_SIZE);
3.同时存在编、解码需求
(1)初始化
app_audio_mempool_init();
(2)获取内存地址
app_audio_mempool_get_buff(&bt_audio_buff, stream_cfg.data_size);
四、链接脚本中的内存使用
在BES的项目中,链接脚本是从模板文件生成的。例如,在BES2600IHC项目中,模板文件名为best1000.lds.S,位于scripts\link\ best1000.lds.S中。从模板文件生成的链接脚本名为_best1000.lds,位于out\best1305_odm\_best1000.lds中。
- 模板文件best1000.lds.S
- 编译生成的_best1000.lds
五、自定义区域
可以在链接脚本文件中定义特定区域并在代码中进行使用,例如:
1.定义一段区域
- KEEP(*(.custom_handler_table)) 表示保存自定义的名为.custom_handler_table的代码段
- . = ALIGN(4)表示按4字节对齐
2.代码中调用
如下所示,通过定义CUSTOM_COMMAND_TO_ADD接口将不同命令的配置信息(如命令码、处理函数、超时时间等)自动收集到特定内存区域,便于系统统一管理。
编译器属性
__attribute__
used
:强制编译器保留该变量,即使未被显式引用,避免优化删除。
section(".custom_handler_table")
:将变量放置在名为.custom_handler_table
的自定义内存段中。链接时,所有同类变量会集中在此段,形成隐式数组。
六、裁剪RAM大小
在out\best1305_odm\best1305_odm.map文件中搜索__free_,其中左侧列的数值表示内存余量,右侧“=”后的第一个值则表示内存空间总量。
例如,若需要修改Fast RAM大小,可通过在target.mk文件中修改FAST_XRAM_SECTION_SIZE ,但注意不要超过可用内存的上限。
以上就是BES平台BES平台逻辑地址映射以及内存的使用方法的经验分享,多有不足,还望补充指正!!!