DSP 工程配置
概述
本节介绍 DSP 工程的配置方法,分为基础配置和高级配置两部分:
基础配置:编译 DSP 工程前必须完成的配置(添加文件、配置搜索路径)
高级配置:根据实际需求可选的性能优化配置
备注
本节内容基于 Xplorer GUI 操作界面。如需使用命令行修改项目配置,可直接编辑 <dsp_sdk>/project/project_dsp/.project 文件。
基础配置
基础配置包含编译前必须完成的项目设置:添加源代码文件和配置搜索路径。
添加项目文件夹或文件
SDK 使用虚拟文件夹来管理项目文件。使用虚拟文件夹时,从项目中删除文件不会影响磁盘上的原始文件,同时也不会将文件复制到项目文件夹中。
假设我们的应用文件 test1.c 和 test2.c 存放在名为 application 的文件夹中,现在将这些文件添加到当前项目:
右键点击 project_dsp,选择 ,在文件夹名称中输入
application,勾选 Folder is not located in the file system,点击 Finish。
右键单击
application文件夹,选择 Import,依次点击 。在位置 1 浏览到文件夹路径,在位置 2 选择要包含的文件,点击 Advanced 并勾选位置 3 的选项。
小心
添加项目文件时,请务必使用相对路径。如上图所示,勾选 Create link locations relative to: ,并设置为 PROJECT_LOC。
命令行配置方法:
若无法使用 Xplorer GUI(如 headless / SSH / AI-agent 环境),可以直接编辑 DSP 工程文件来完成配置。相关工程文件都在 <dsp_sdk>/project/project_dsp/ 下:
文件 |
管什么 |
何时手改 |
|---|---|---|
|
工程包含哪些 源文件( |
增 / 删 |
|
编译设置: |
换 LSP、加包含路径、加宏 / 库 |
小心
直接改工程文件格式敏感,且 Xplorer 下次打开工程时可能重排或覆盖手改内容。请尽量用 Xplorer GUI 完成这些改动;手改后务必用 auto_build.sh 跑一次编译验证。
SDK 默认只支持 Release target(见 project/auto_build/dsp_batch.xml 的 targetName),因此编译设置只改 .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= 虚拟文件夹(此时locationURI为virtual:/virtual)。<locationURI>:真实位置。PARENT-2-PROJECT_LOC表示从工程目录往上 2 级(project/project_dsp→heap/source),后接相对路径。
加文件:复制同一虚拟文件夹下已有的一条 <link>,改 <name> 与 <locationURI> 指向新文件即可。删文件:整块删掉对应的 <link>。
同一虚拟文件夹下的文件按 文件名字母序 排列,以便与 Xplorer 保存时产生的顺序一致。
2. 切换 LSP(运行位置 PSRAM / XIP / SRAM)
在 Release.bts 末尾的 <LinkerSupport> 一行,把 -mlsp= 的路径换成目标 LSP(中间目录与结尾两处都要换):
运行位置 |
|
|---|---|
PSRAM(默认) |
|
PSRAM,代码 XIP |
|
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.bin 与 dsp_all.bin 都被重新生成。若报缺 X display,安装 xvfb 即可(脚本会自动用 xvfb-run 包裹)。
添加搜索路径
配置头文件和库文件的搜索路径,确保编译器能够找到所需的依赖文件。
添加头文件搜索路径
进入 Build Properties:
在 标签页,点击右上角
Add按钮,然后输入路径。建议使用相对路径${workspace_loc},此地址为<dsp_sdk>/project。
点击
Apply和OK按钮,完成修改。
备注
尽量不要出现同名的头文件,若无法避免请使用不同的路径。
添加库文件搜索路径
在 Build Properties 中选择 Libraries 标签页:
点击右上角 Add 标志。然后输入路径。建议使用相对路径 ${workspace_loc},此地址为
<dsp_sdk>/project。建议使用$(TARGET_CONFIG)变量, 按不同 ABI 配置库路径 。
点击
Apply和OK按钮,完成修改。
高级配置
高级配置包含根据实际需求可选的性能优化设置。完成基础配置后,如需进一步优化编译结果,可参考以下内容。
编译优化
Co-processor、-O3 和 SIMD 编译选项可以大幅提高 DSP 硬件资源的利用率。高等级优化下编译器可能会调整代码执行顺序和 CPU 行为,因此这些选项并非适用于所有代码。 比如 FreeRTOS 源文件和其他 ISR 处理程序不能使用 Co-processor、SIMD 向量优化(-LNO:simd 和 -mcoproc)。
库链接顺序
链接静态库时,若多个静态库之间存在依赖关系,则需注意被依赖静态库的链接顺序,否则会出现 the symbol cannot be found 错误。
例如:liborder2.a 依赖于 liborder1.a,且最终可执行文件 test 依赖 liborder2.a,
那么链接选项应为: -lorder2 -lorder1,否则会报 liborder1.a 中的某些符号未定义。
例程编译
例程编译方法
DSP SDK 提供了多个基础例程,位于 <dsp_sdk>/example/ 目录下。编译例程的步骤如下:
参考 添加项目文件夹或文件 章节,将整个
<dsp_sdk>/example/example_xxx文件夹添加到工程中使用上述命令行编译或 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编译时强符号会覆盖弱符号,从而跳转到相应的示例代码