DSP 工程配置

概述

本节介绍 DSP 工程的配置方法,分为基础配置和高级配置两部分:

  • 基础配置:编译 DSP 工程前必须完成的配置(添加文件、配置搜索路径)

  • 高级配置:根据实际需求可选的性能优化配置

备注

本节内容基于 Xplorer GUI 操作界面。如需使用命令行修改项目配置,可直接编辑 <dsp_sdk>/project/project_dsp/.project 文件。

基础配置

基础配置包含编译前必须完成的项目设置:添加源代码文件和配置搜索路径。

添加项目文件夹或文件

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

小心

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

命令行配置方法

若无法使用 Xplorer 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 按钮,完成修改。

备注

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

添加库文件搜索路径

  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
    

    备注

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

库链接顺序

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

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

../_images/library_order_in_build_properties.png

例程编译

例程编译方法

DSP SDK 提供了多个基础例程,位于 <dsp_sdk>/example/ 目录下。编译例程的步骤如下:

  1. 参考 添加项目文件夹或文件 章节,将整个 <dsp_sdk>/example/example_xxx 文件夹添加到工程中

  2. 使用上述命令行编译或 Xplorer GUI 编译方式编译工程

备注

关于 DSP SDK 基础例程的完整列表(example_gdma、example_idma、example_idma_nn 等),请参考: DSP SDK 简介 - 例程列表

例程编译机制说明

SDK 使用弱符号/强符号机制来切换不同的示例代码:

  • project/project_dsp/main.c 中定义了弱符号函数 app_example()

  • 每个示例文件夹下包含同名强符号函数 example_xxx/app_example.c

  • 编译时强符号会覆盖弱符号,从而跳转到相应的示例代码