2. Hexagon DSP 开发环境搭建:从零开始,跑通第一个例程

好,咱们正式开始动手了。这一章我带你搭环境。别小看这一步,我见过太多人卡在 SDK 安装或者模拟器配置上,一卡就是半天。咱们的目标很明确:装好 Hexagon SDK,搞懂 QuRT 是个啥,最后能在模拟器上跑起来,也能连上真机。

本章核心目标: 完成 Hexagon DSP 开发环境的完整搭建,掌握 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 环境为例):

  1. 从 Qualcomm 开发者官网下载 Qualcomm_Hexagon_SDK_Linux_x.x.x.run。
  2. 赋予执行权限:chmod +x Qualcomm_Hexagon_SDK_Linux_*.run
  3. 运行安装:./Qualcomm_Hexagon_SDK_Linux_*.run
  4. 选择安装路径,比如 /opt/Qualcomm/Hexagon_SDK/5.x.x
  5. 等待安装完成,检查 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 的 API 风格跟 POSIX 很像。如果你熟悉 pthread,上手 QuRT 的任务创建和同步会非常快。比如 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)。

真机调试步骤:

  1. 将编译好的 DSP 可执行文件(.elf)和共享库(.so)通过 adb push 到手机。
  2. 在手机上启动 adsprpcd 服务(Qualcomm 的 DSP 远程过程调用守护进程)。
  3. 在 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
我曾经踩过的坑: 真机调试时,DSP 的调试端口(默认 5600)可能被防火墙挡住。记得在 PC 上开放这个端口,或者直接用 adb forward 做端口转发:adb forward tcp:5600 tcp:5600。我第一次调真机时,GDB 一直连不上,折腾了半天才发现是端口没转发。

2.4 本章知识结构图

下面这张图把咱们这一章的核心内容串起来了。你可以把它当作一个路线图,随时回来对照。

Hexagon DSP 开发环境搭建知识结构 Hexagon DSP 开发环境搭建 Hexagon SDK 安装 QuRT 实时操作系统 调试环境配置 版本选择 环境变量配置 任务调度 IPC 通信 模拟器调试 真机调试 前期在模拟器上验证算法逻辑,调通后再上真机进行性能调优 安装 SDK 理解 QuRT 跑通例程 开发流程:从环境搭建到第一个可运行的 DSP 程序

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 验证环境变量是否生效。