BES2600xx之Memory(一~六合集)

本章主要介绍BES平台逻辑地址映射以及内存的使用方法。

一、逻辑地址映射

        虽然这些内存的逻辑地址不同,但其中一些内存指向同一物理地址:BTH RAM 和 BTH RAMX/FRAMX指向同一物理地址,BTH FLASHBTH FLASH_NCBTH 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_SIZEAPP_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平台逻辑地址映射以及内存的使用方法的经验分享,多有不足,还望补充指正!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值