DSP ABI 调用

调用约定

Xtensa 支持两种不同的应用程序二进制接口(ABI):​​Window ABI​​(Window register ABI)和 Call0 ABI​​,两者均包含调用约定。

  • Window ABI​​:函数调用和返回必须位于同一 1GB 对齐区域内。发生函数调用时,使用寄存器轮转的方式实现 CPU 寄存器切换,节约了保存、恢复 CPU 寄存器状态的时间。

  • Call0 ABI​​:函数调用和返回可在整个 4GB 区域内执行。发生函数调用时,将 CPU 寄存器状态保存在栈中。

SRAM 地址范围​为 0x2000_0000 ~ 0x2008_0000;PSRAM 起始地址​为 0x6000_0000,结束地址取决于 PSRAM 的类型。由于 SRAM 和 PSRAM 不在同一个 1GB 区域,所以 Window ABI 无法跨 SRAM、PSRAM 调用函数。

切换 Call0 ABI 与 ​Window ABI

不同 Configuration 对应不同的 ABI 类型,如果使用 Xplorer 管理工程,只需切换 Configuration 即可选择所需的 ABI。

  • HIFI5_PROD_1123_asic_UPG:对应 Call0 ABI

  • HIFI5_PROD_1123_asic_wUPG:对应 Window ABI

以下为 Call0 ABI 的配置示例:

../../_images/dspcfg_chosen_for_call0_abi.png

以下为 Window ABI 的配置示例:

../../_images/dspcfg_chosen_for_windowed_register_abi.png

Note

  • 如果你的工程使用了自定义的库,请确保根据所选 ABI 重新编译相应库文件。

  • 若使用 CMD 命令行(auto_build.sh )编译工程,自动编译脚本的 Configuration 配置文件为 project/auto_build /dsp_batch.xml (HIFI5_PROD_1123_asic_wUPG 或 HIFI5_PROD_1123_asic_UPG)。

按不同 ABI 配置库路径

在 ABI 之间切换时,如果每次都修改库搜索路径会很繁琐。可使用 $(TARGET_CONFIG) 环境变量来设置搜索路径: 在库路径下创建 HIFI5_PROD_1123_asic_UPGHIFI5_PROD_1123_asic_wUPG 两个文件夹,并将用不同 ABI 编译的库分别放在对应目录中。

例如,原来将库放在 lib/audio/prebuilts 路径下:

  1. 在该路径下新建 /lib/audio/prebuilts/HIFI5_PROD_1123_asic_UPG/lib/audio/prebuilts/HIFI5_PROD_1123_asic_wUPG 两个文件夹。

  2. Library Search Paths 设置为 ${workspace_loc}/.../lib/audio/prebuilts/$(TARGET_CONFIG)。环境变量 $(TARGET_CONFIG) 会随 ABI 变化自动切换,确保能加载到正确的预编译库。

    ../../_images/dspcfg_library_search_path.png