DSP 编译和烧录

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)。

Note

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

  • auto_build.sh 脚本会自动清空并重新导入项目,否则本地 Xplorer 的项目修改无法同步。因此该脚本每次都是全量编译,当前只有 GUI 才支持增量编译。

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. 参考 <FreeRTOS SDK 使用指南> 配置 menuconfig 进入 CONFIG Link Option 配置。

    DSP 使能后默认将 SRAM 空间给 DSP 使用,因此 IMG2 Data 和 Heap 需要使用 PSRAM 。MCU 的 code 一般选择 XiP,如果有性能要求也可以将 code 加载进 PSRAM。

    /* select SRAM */
    CONFIG Link Option ---> IMG2 Data and Heap in SRAM or PSRAM?
       ( ) SRAM
       (X) PSRAM
    
  2. 进入 CONFIG DSP Enable 配置,取消勾选 DSP within APP image

    CONFIG DSP Enable --->
       [*] Enable DSP
       [ ] DSP within APP image
    
  3. 重新编译项目。

    kr4_km4_app.bin 文件生成在 <mcu_sdk>\amebalite_gcc_project 中。

    ../../_images/lite_download_dsp_image.png

Note

此方案不便于安全校验和 OTA 升级,因此建议仅在设备 DSP 开发阶段使用。量产时请把 DSP 固件合并到 MCU 的应用固件中。

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

Tip

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

项目配置

添加项目文件夹或文件

SDK 使用虚拟文件夹来管理项目文件。使用虚拟文件夹时,从项目中删除文件不会影响磁盘上的原始文件,同时也不会将文件复制到项目文件夹中。

假设我们的应用文件 test1.ctest2.c 存放在名为 application 的文件夹中,现在将这些文件添加到当前项目:

../../_images/add_files_to_current_project.svg
  1. 右键点击 project_dsp,选择 New > Folder,在文件夹名称中输入 application,勾选 Folder is not located in the file system,点击 Finish

    ../../_images/dsp02_new_folder.png
  2. 右键单击 application 文件夹,选择 Import,依次点击 General > File System > Next

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

    ../../_images/import_resources_from_local_files_details.png

Caution

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

目前我们强烈推荐使用 Xplorer GUI 修改项目配置。若无法使用 GUI, 可以直接编辑 <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:

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

    ../../_images/add_include_path2.png
  3. 点击 ApplyOK 按钮,完成修改。

Note

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

添加库文件搜索路径

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

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

    ../../_images/add_include_path2.png
  3. 点击 ApplyOK 按钮,完成修改。

编译优化

Co-processor、-O3 和 SIMD 编译选项可以大幅提高 DSP 硬件资源的利用率。高等级优化下编译器可能会调整代码执行顺序和 CPU 行为,因此这些选项并非适用于所有代码。 比如 FreeRTOS 源文件和其他 ISR 处理程序不能使用 Co-processor、SIMD 向量优化(-LNO:simd-mcoproc)。

../../_images/optimizing_dsp_code_considerations.png

缩减 DSP 固件体积

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

为解决这个问题,可以增加以下编译和链接参数:

  1. 添加编译器 -function-sections-fdata-sections-Os 选项。

  2. 添加链接器 -Wl,-gc-sections 选项。

    ../../_images/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
    

    Note

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

库链接顺序

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

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

../../_images/library_order_in_build_properties.png