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,可以直接编辑 <dsp_sdk>/project/project_dsp/.project 文件来增删项目文件:
添加新虚拟文件夹:
<link> <name>TestFolder</name> <type>2</type> <locationURI>virtual:/virtual</locationURI> </link>
向虚拟文件夹添加文件:
<link> <name>TestFolder/test_file.c</name> <type>1</type> <locationURI>PARENT-2-PROJECT_LOC/testfolder/test_file.c</locationURI> </link>
添加搜索路径
配置头文件和库文件的搜索路径,确保编译器能够找到所需的依赖文件。
添加头文件搜索路径
进入 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)。
缩减 DSP 固件体积
工程代码中可能存在未使用但被一同编译的函数。虽然这些函数未被调用,但它们往往会被链接到可执行文件中,从而浪费 Flash 和 RAM 空间。
为解决这个问题,可以增加以下编译和链接参数:
添加编译器
-function-sections、-fdata-sections和-Os选项。添加链接器
-Wl,-gc-sections选项。
此方法可能会遇到以下警告(可忽略):
ld: warning: The min-sizing binary cannot be generated if -gc-sections is specified.
此时,.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 中的某些符号未定义。
例程编译
例程编译方法
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编译时强符号会覆盖弱符号,从而跳转到相应的示例代码