DSP 编译和烧录

工程编译

根据使用的操作系统不同,用户可以选择以下方式之一来编译 DSP 工程:

  • 方式一:命令行编译,适用于 Linux 系统

  • 方式二:Xplorer GUI 编译,适用于 Windows 或 Linux 系统

在 Linux 服务器上,运行 auto_build.sh 来编译默认项目。

cd project/auto_build/
chmod +x auto_build.sh
./auto_build.sh

Xplorer 会将 project_dsp 复制到新工作区 auto_ws 后进行编译。

  • 生成的 dsp_all.bindsp.bin 默认保存在 <SDK>/dsp/project/image 目录

  • 中间编译文件会保留在 auto_ws 目录

具体用法请参考 <SDK>/dsp/project/auto_build/readme.txt

自动编译脚本的配置文件是 project/auto_build/dsp_batch.xml。在该脚本中,用户可以修改配置项(HIFI5_PROD_1123_asic_wUPGHIFI5_PROD_1123_asic_UPG)。

备注

请将 Xtensa Tools 目录添加到系统 PATH 环境变量中。默认路径是 /opt/xtensa/XtDevTools/install/tools/RI-2021.8-linux/XtensaTools/bin

DSP 反汇编和 map 文件说明:

  • 默认情况下,生成 DSP 固件时不会生成对应的反汇编代码。如需通过反汇编调试代码,需在后处理脚本 <dsp_sdk>/project/img_utility/code_analyze.py 中将 ENABLE_Disassembler 设置为 1。生成反汇编会降低编译速度,建议仅在需要时启用。生成的 ASM 文件为 <dsp_sdk>/project/image/project_dsp.asm

  • 可以在 map 文件中查找函数或数据位置:

    • 命令行编译方式: <dsp_sdk>/auto_ws/proiect/dsp/bin/HIFI5_PROD_1123_asic_UPG/UPG/Release/project_dsp.map

    • Xplorer-GUI 编译方式: <dsp_sdk>/proiect/proiect_dsp/bin/HIFI5_PROD_1123_asic_UPG/Release/proiect_dsp.map

MCU 工程编译和固件烧录

用户可以通过以下两种方案加载 DSP 固件:

在此方案中, Flash 布局中只有一个名为 IMG_DSP 的区域用于下载 DSP 固件。 当 DSP 应用程序被修改时, 用户只需将名为 dsp_all.bin 的 DSP 固件重新下载到 IMG_DSP 中。因此,在设备处于 DSP 开发阶段时,建议使用此方案以便便捷高效地开发 DSP 应用程序。

要选择此方案,用户可以通过以下步骤禁用 DSP within APP image 的配置:

  1. 参考 配置 SDK (menuconfig) 进入 CONFIG DSP Enable 配置,取消勾选 DSP within APP image

    CONFIG DSP Enable --->
       [*] Enable DSP
       [ ]   DSP within APP image
    
  2. 重新编译项目。kr4_km4_app.bin 文件生成在 <mcu_sdk>\amebalite_gcc_project 中。

../../rst_dsp/dsp_build/figures/lite_download_dsp_image.png

注意

此方案不便于安全校验和 OTA 升级,因此建议仅在设备 DSP 开发阶段使用。量产时请使用另一个方法。

下载完成后复位开发板。正常启动后,可以通过 UART 工具可以看到 Hello DSP World 输出信息。

备注

Hello DSP World 日志可能会与 KM4/KR4 的输出混杂。可通过修改 DSP 端的打印信息来提高辨识度。

项目配置

添加项目文件夹或文件

SDK 使用虚拟文件夹来管理项目文件。使用虚拟文件夹时,从项目中删除文件不会影响磁盘上的原始文件,同时也不会将文件复制到项目文件夹中。 假设我们的应用文件 test1.ctest2.c 存放在名为 application 的文件夹中,现在将这些文件添加到当前项目:

../../rst_dsp/dsp_build/figures/add_files_to_current_project.svg
  1. 创建名为 application 的虚拟文件夹。右键点击 project_dsp,选择 New > Folder

    ../../rst_dsp/dsp_build/figures/new_folder_application.png
  2. 在文件夹名称中输入 application,勾选 Folder is not located in the file system,然后点击 Finish

    ../../rst_dsp/dsp_build/figures/folder_not_located_in_file_system.png
  3. 右键点击 application 文件夹,选择 Import

  4. 点击 General > File System > Next

    ../../rst_dsp/dsp_build/figures/import_resources_from_local_files.svg
  5. 在位置 1 浏览到文件夹路径,在位置 2 选择要包含的文件。点击 Advanced 并勾选位置 3 的选项。

    ../../rst_dsp/dsp_build/figures/import_resources_from_local_files_details.png

小心

添加项目文件时,请务必使用相对路径。如上图所示,点击 Create link locations relative to: 并设置为 PROJECT_LOC

目前我们强烈推荐使用 Xplorer GUI 修改项目配置。若无法使用 GUI, 可以直接编辑:file:<dsp sdk>/project/project_dsp/.project 文件来增删项目文件。比如以下操作:

  1. 添加新虚拟文件夹:

<link>
  <name>TestFolder</name>
  <type>2</type>
  <locationURI>virtual:/virtual</locationURI>
</link>
  1. 向虚拟文件夹添加文件:

<link>
  <name>TestFolder/test_file.c</name>
  <type>1</type>
  <locationURI>PARENT-2-PROJECT_LOC/testfolder/test_file.c</locationURI>
</link>

添加搜索路径

添加头文件搜索路径

  1. 进入 Build Properties:

    ../../rst_dsp/dsp_build/figures/add_include_path.png
  2. Include Paths 标签页,点击右上角 Add 标志。然后输入路径。建议使用相对路径 ${workspace_loc},此地址为 <dsp_sdk>/project

    ../../rst_dsp/dsp_build/figures/add_include_path2.png
  3. 点击 OK 和 Applay。

备注

尽量不要出现同名的头文件。若无法避免请使用不同的路径。

添加库文件搜索路径

  1. 在 Build Properties 中选择 Libraries 标签页:

    ../../rst_dsp/dsp_build/figures/add_include_path.png
  2. 点击右上角 Add 标志。然后输入路径。建议使用相对路径 ${workspace_loc},此地址为 <dsp_sdk>/project。建议使用$(TARGET_CONFIG)变量, 按不同 ABI 配置库路径

    ../../rst_dsp/dsp_build/figures/add_include_path2.png
  3. 点击 OK 和 Applay。

编译选项

Co-processor、-O3 and SIMD 编译选项可以大幅提高 DSP 硬件资源的利用率。 但这些选项并非适用于所有代码。使用-O3 选项时,编译器可能会显著调整执行顺序。 这些优化选项通常是安全的,但存在使用限制:RTOS 源文件和其他 ISR 处理程序不能使用 Co-processor、SIMD 向量优化(-LNO:simd and -mcoproc)。

../../rst_dsp/dsp_build/figures/optimizing_dsp_code_considerations.png

缩减 DSP 固件体积

工程代码中可能存在未使用但被一同编译的函数。虽然这些函数未被调用,但它们往往会被链接到可执行文件中,从而浪费 Flash 和 RAM 空间。为解决这个问题可以增加以下编译和链接参数:

  1. 在编译器中添加 -ffunction-sections-Os 选项:

    ../../rst_dsp/dsp_build/figures/create_separate_function_sections.png
    ../../rst_dsp/dsp_build/figures/optimization_for_size.png
  2. 添加链接器选项 -Wl,-gc-sections

    ../../rst_dsp/dsp_build/figures/additional_compiler_options_for_linker.png

    此方法可能会遇到以下警告(可忽略):

    ld: warning: The min-sizing binary cannot be generated if -gc-sections is specified.
    
  3. 此时,.command.ipc_table 段的内容因未被显式调用而无法加载到固件中。需在链接脚本 RTK_LSP/ldscripts/elf32xtensa.x 中为这两个段添加 KEEP 属性:

    .ipc_table : ALIGN(4)
    {
    _ipc_table_start = ABSOLUTE(.);
    KEEP(*(.ipc_table))
    . = ALIGN (4);
    _ipc_table_end = ABSOLUTE(.);
    } >psram0_seg :psram0_phdr
    .command : ALIGN(4)
    {
    _command_start = ABSOLUTE(.);
    KEEP(*(.command))
    . = ALIGN (4);
    _command_end = ABSOLUTE(.);
    } >psram0_seg :psram0_phdr
    

    备注

    该链接脚本在每次修改 LSP 后会被自动覆盖,需重新手动修改新生成的脚本。

库链接顺序

链接静态库时,若多个静态库之间存在依赖关系,则需注意被依赖静态库的链接顺序。否则会出现 the symbol cannot be found 错误。

例如:liborder2.a 依赖于 liborder1.a,且最终可执行文件 test 依赖 liborder2.a。 那么链接选项应为: -lorder2 -lorder1,否则会报 liborder1.a 中的某些符号未定义。

../../rst_dsp/dsp_build/figures/library_order_in_build_properties.png

Realtek 提供的库

Realtek 提供的库提供了 Window ABI 和 Call0 ABI 两种。两种 ABI 的区别可以 参考此处

libaudio_base.a 和 librpc_hal.a

路径: dsp/lib/audio/prebuilts/$(TARGET_CONFIG)

  • libaudio_base.a:MCU 与 DSP 间的 RPC 框架,用于数据和信号同步。

  • librpc_hal.a:硬件适配层,支持不同 RPC 平台。

libxa_nnlib.a 和 libhifi5_dsp.a

  • libxa_nnlib.a:HiFi 5 神经网络库,路径为 dsp/lib/xa_nnlib/v1.7.0/bin/$(TARGET_CONFIG)/Release

  • libhifi5_dsp.a:NatureDSP 信号处理库,路径为 dsp/lib/lib_hifi5/project/hifi5_library/bin/$(TARGET_CONFIG)/Release