2. Hexagon DSP 开发环境搭建:从零开始,跑通第一个例程
好,咱们正式开始动手了。这一章我带你搭环境。别小看这一步,我见过太多人卡在 SDK 安装或者模拟器配置上,一卡就是半天。咱们的目标很明确:装好 Hexagon SDK,搞懂 QuRT 是个啥,最后能在模拟器上跑起来,也能连上真机。
2.1 Hexagon SDK 安装:版本选择与避坑指南
Hexagon SDK 是 Qualcomm 官方提供的 DSP 开发套件。它里面包含了编译器、调试器、库文件、示例代码,还有咱们后面要用的 QuRT 系统。我个人习惯把 SDK 装在一个路径不含中文和空格的目录下,省得后面出些莫名其妙的问题。
版本怎么选?
我建议你直接用最新的长期支持版(LTS)。比如我现在用的是 Hexagon SDK 5.x 系列。新版本对 Hexagon V73、V75 架构支持更好,降噪算法里常用的 HVX 向量指令也优化得更彻底。你想想看,要是用个老版本,连个新指令集都不支持,那还优化个啥?
| SDK 版本 | 支持架构 | 适用场景 |
|---|---|---|
| 4.x | V60, V62, V65 | 老旧平台,兼容性优先 |
| 5.x (推荐) | V65, V66, V73, V75 | 主流平台,支持 HVX 深度优化 |
| 6.x (预览版) | V75, V80 | 前沿特性,但稳定性待验证 |
安装步骤(以 Linux 环境为例):
- 从 Qualcomm 开发者官网下载
Qualcomm_Hexagon_SDK_Linux_x.x.x.run。 - 赋予执行权限:
chmod +x Qualcomm_Hexagon_SDK_Linux_*.run - 运行安装:
./Qualcomm_Hexagon_SDK_Linux_*.run - 选择安装路径,比如
/opt/Qualcomm/Hexagon_SDK/5.x.x - 等待安装完成,检查
setup_sdk_env.sh脚本是否存在。
/home 下带空格的目录,比如 /home/my hexagon sdk/。编译时 Makefile 会解析路径,空格会导致链接器找不到库文件。我当时排查了整整一个下午,最后发现是路径空格的问题。
装完之后,记得 source 一下环境变量:
source /opt/Qualcomm/Hexagon_SDK/5.x.x/setup_sdk_env.sh
你可以把它加到 .bashrc 里,省得每次开终端都要手动执行。
2.2 QuRT 实时操作系统简介:DSP 上的“小管家”
QuRT,全称是 Qualcomm Real-Time Operating System。说白了,它就是跑在 Hexagon DSP 上的一个小型实时操作系统。你想想看,DSP 本身是个裸核,你要在上面跑任务、管理内存、处理中断,总不能全靠自己手写吧?QuRT 就是干这个的。
QuRT 的核心能力:
- 任务调度: 支持优先级抢占式调度。咱们做实时降噪,音频处理任务的优先级必须最高,不能让别的任务抢了它的 CPU 时间。
- 内存管理: 提供动态内存分配和共享内存机制。DSP 和 CPU 之间通过共享内存交换音频数据,QuRT 负责保证数据一致性。
- 中断处理: 音频数据到达时,DSP 需要立刻响应。QuRT 的中断延迟非常低,一般在几微秒级别。
- IPC(进程间通信): DSP 和 CPU 之间通过消息队列或信号量通信。咱们后面讲降噪优化时,会频繁用到这个机制。
我记得第一次接触 QuRT 时,觉得它跟 FreeRTOS 有点像,但更轻量,也更专一。它没有文件系统,没有网络协议栈,就是一门心思为 DSP 上的实时任务服务。
qurt_thread_create() 跟 pthread_create() 参数结构几乎一样。
2.3 模拟器与真机调试环境配置
环境搭好了,系统也了解了,接下来就是让代码跑起来。咱们有两种方式:模拟器和真机。我建议你前期在模拟器上验证算法逻辑,等基本调通了再上真机。为什么?模拟器上可以单步调试,可以看寄存器,可以打日志,效率高得多。
2.3.1 模拟器环境配置
Hexagon SDK 自带了一个指令集模拟器,叫 hexagon-sim。它模拟了 Hexagon DSP 的完整指令集,包括 HVX 向量单元。你可以在上面运行 QuRT 应用,就跟在真机上一样。
启动模拟器的典型命令:
hexagon-sim -mv75 --qurt --pmu_stats my_dsp_app.elf
-mv75:指定模拟 V75 架构。--qurt:加载 QuRT 运行时库。--pmu_stats:输出性能计数器统计信息,这对优化降噪算法非常有用。
调试模式启动:
hexagon-sim -mv75 --qurt --gdb_port 1234 my_dsp_app.elf
然后在另一个终端启动 GDB:
hexagon-gdb my_dsp_app.elf
(gdb) target remote :1234
(gdb) continue
嗯,这里要注意:模拟器上的时间跟真实硬件不一样。模拟器跑 1 秒的音频数据,实际可能花 10 秒。所以性能数据只能做相对参考,最终还是要以真机为准。
2.3.2 真机调试环境配置
真机调试比模拟器复杂一些,但数据更真实。你需要一台 rooted 的 Android 手机,或者一个开发板(比如 Qualcomm 的 CDK)。
真机调试步骤:
- 将编译好的 DSP 可执行文件(
.elf)和共享库(.so)通过 adb push 到手机。 - 在手机上启动
adsprpcd服务(Qualcomm 的 DSP 远程过程调用守护进程)。 - 在 PC 上使用
hexagon-gdb连接手机上的 DSP 调试端口。
一个典型的真机调试命令序列:
adb push my_dsp_app.elf /data/local/tmp/
adb shell chmod +x /data/local/tmp/my_dsp_app.elf
adb shell /data/local/tmp/my_dsp_app.elf &
然后在 PC 上:
hexagon-gdb my_dsp_app.elf
(gdb) target remote :5600
(gdb) continue
adb forward 做端口转发:adb forward tcp:5600 tcp:5600。我第一次调真机时,GDB 一直连不上,折腾了半天才发现是端口没转发。
2.4 本章知识结构图
下面这张图把咱们这一章的核心内容串起来了。你可以把它当作一个路线图,随时回来对照。
2.5 验证环境:跑通第一个 Hello World
环境搭好了,咱们跑个最简单的程序验证一下。SDK 里自带了很多示例,咱们用 examples/audio/capi_v2 下的一个简单例程。
编译并运行:
cd /opt/Qualcomm/Hexagon_SDK/5.x.x/examples/audio/capi_v2
make tree V=hexagon_ReleaseG
hexagon-sim -mv75 --qurt build/hexagon_ReleaseG/example_capi_v2.elf
如果看到终端输出类似 Hello from Hexagon DSP! 或者一些初始化日志,恭喜你,环境搭建成功了!
setup_sdk_env.sh 是否 source 成功。可以用 echo $HEXAGON_SDK_ROOT 验证环境变量是否生效。