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(如 headless / SSH / AI-agent 环境),可以直接编辑 DSP 工程文件来完成配置。相关工程文件都在 <dsp_sdk>/project/project_dsp/ 下:

文件

管什么

何时手改

.project

工程包含哪些 源文件linkedResources

增 / 删 .c / .h

.settings/targets/xtensa/Release.bts

编译设置:-mlsp= (LSP)、-I (包含路径)、-D (宏)、库 / 链接选项

换 LSP、加包含路径、加宏 / 库

小心

直接改工程文件格式敏感,且 Xplorer 下次打开工程时可能重排或覆盖手改内容。请尽量用 Xplorer GUI 完成这些改动;手改后务必用 auto_build.sh 跑一次编译验证。 SDK 默认只支持 Release target(见 project/auto_build/dsp_batch.xmltargetName),因此编译设置只改 .settings/targets/xtensa/Release.bts

1. 增删源文件(.project)

工程编译 哪些 源文件由 .project 里的 <link> 条目决定,而不是看目录里躺着哪些 .c

新建虚拟文件夹(type=2):

<link>
  <name>TestFolder</name>
  <type>2</type>
  <locationURI>virtual:/virtual</locationURI>
</link>

向虚拟文件夹添加一个源文件(type=1):

<link>
  <name>TestFolder/test_file.c</name>
  <type>1</type>
  <locationURI>PARENT-2-PROJECT_LOC/testfolder/test_file.c</locationURI>
</link>
  • <name>:在工程树中显示的路径(虚拟文件夹/文件名)。

  • <type>1 = 文件,2 = 虚拟文件夹(此时 locationURIvirtual:/virtual)。

  • <locationURI>:真实位置。PARENT-2-PROJECT_LOC 表示从工程目录往上 2 级(project/project_dspheap/source),后接相对路径。

加文件:复制同一虚拟文件夹下已有的一条 <link>,改 <name><locationURI> 指向新文件即可。删文件:整块删掉对应的 <link>。 同一虚拟文件夹下的文件按 文件名字母序 排列,以便与 Xplorer 保存时产生的顺序一致。

2. 切换 LSP(运行位置 PSRAM / XIP / SRAM)

Release.bts 末尾的 <LinkerSupport> 一行,把 -mlsp= 的路径换成目标 LSP(中间目录与结尾两处都要换):

运行位置

-mlsp= value 尾部

PSRAM(默认)

…/project/RTK_LSP/RI-2021.8/HIFI5_PROD_1123_asic_UPG/RTK_LSP

PSRAM,代码 XIP

…/project/RTK_LSP_XIP/RI-2021.8/HIFI5_PROD_1123_asic_UPG/RTK_LSP_XIP

SRAM

…/project/RTK_LSP_SRAM/RI-2021.8/HIFI5_PROD_1123_asic_UPG/RTK_LSP_SRAM

切换运行位置不只是改 -mlsp= —— 还需从 MCU 布局重新生成匹配的 LSP,并同步 DSP 的 MPU 表(三者必须描述同一形态)。完整流程参考 ABI 选择指南 以及 MCU 侧的布局同步说明。

3. 包含路径 / 宏 / 库(Release.bts)

  • 包含路径Includes 段(-I),加一条 <ListEntry>新路径</ListEntry>${workspace_loc} 指向工程在 workspace 中的位置,${workspace_loc}/../project/

  • Defines 段(-D),<ListEntry key="宏名" value="值"/>

  • Libraries 段(-l),如 <ListEntry>freertos</ListEntry>;库搜索路径在 LibrarySearchPath 段(-L),建议用 $(TARGET_CONFIG) 变量 按不同 ABI 配置库路径

改完必做:编译验证

cd <dsp_sdk>/project/auto_build && env -u DISPLAY sh auto_build.sh

成功的判定:../image/ 下的 dsp.bindsp_all.bin 都被重新生成。若报缺 X display,安装 xvfb 即可(脚本会自动用 xvfb-run 包裹)。

添加搜索路径

配置头文件和库文件的搜索路径,确保编译器能够找到所需的依赖文件。

添加头文件搜索路径

  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

库链接顺序

链接静态库时,若多个静态库之间存在依赖关系,则需注意被依赖静态库的链接顺序,否则会出现 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

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