第二章:开发环境搭建——高通Hexagon SDK安装、ADSP Toolchain配置、模拟器环境搭建、目标板连接与调试设置

好,咱们直接进入正题。

开发环境搭建这件事,说难不难,说简单也不简单。我见过不少工程师,卡在最开始的安装配置上,一卡就是好几天。其实说白了,就是几个关键步骤没搞对。今天我把我的经验摊开来聊,你跟着走一遍,基本不会出问题。

2.1 高通Hexagon SDK安装

先讲SDK。高通Hexagon SDK,是咱们开发ADSP和传感器中枢的根基。没有它,后面什么都干不了。

下载与版本选择

我个人习惯,去高通开发者官网(createpoint.qti.qualcomm.com)下载。注意,你需要注册一个账号,这个账号会关联你的License。嗯,这里要注意:SDK版本要和你的目标芯片匹配。比如你用的是SM8450,那就选对应这个平台的SDK版本。我早期犯过一个错,拿SM8350的SDK去编译SM8450的镜像,结果一堆链接错误,折腾了两天才发现是版本不匹配。

安装步骤

  1. 下载完成后,得到一个类似 Hexagon_SDK_5.x.x.x_linux.run 的文件。
  2. 赋予执行权限:chmod +x Hexagon_SDK_5.x.x.x_linux.run
  3. 运行安装:./Hexagon_SDK_5.x.x.x_linux.run
  4. 安装过程中,会提示你选择安装路径。我建议放在 /opt/qualcomm/hexagon_sdk 下,方便后续管理。
  5. 安装完成后,检查一下环境变量。SDK自带的脚本会帮你设置,但有时候会漏掉。你可以手动添加:
export HEXAGON_SDK_ROOT=/opt/qualcomm/hexagon_sdk/5.x.x.x
export PATH=$PATH:$HEXAGON_SDK_ROOT/tools/HEXAGON_Tools/8.6.06/bin

验证安装

运行 hexagon-clang --version,如果能正常输出版本信息,说明SDK安装成功了。

小提示: 如果你用的是Windows,高通也提供了Windows版本的SDK。但我个人更推荐在Linux下开发,命令行操作更顺手,而且模拟器在Linux下跑得更稳。

2.2 ADSP Toolchain配置

Toolchain,说白了就是编译器、链接器、调试器这一整套工具。高通ADSP用的是Hexagon DSP专用的工具链,和ARM的GCC不太一样。

工具链路径

安装完SDK后,工具链默认在 $HEXAGON_SDK_ROOT/tools/HEXAGON_Tools/ 下。里面会有多个版本,比如 8.6.068.7.02 等。我建议用最新的稳定版,但别追太新,有时候新版本会有兼容性问题。

配置环境变量

除了上面提到的PATH,还需要设置几个关键变量:

export HEXAGON_TOOLS_VERSION=8.6.06
export HEXAGON_TOOLS_DIR=$HEXAGON_SDK_ROOT/tools/HEXAGON_Tools/$HEXAGON_TOOLS_VERSION
export PATH=$PATH:$HEXAGON_TOOLS_DIR/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$HEXAGON_TOOLS_DIR/lib

测试编译

写一个简单的Hello World程序,用Hexagon工具链编译:

#include <stdio.h>

int main() {
    printf("Hello from Hexagon DSP!\n");
    return 0;
}

编译命令:

hexagon-clang -o hello_hexagon hello.c

如果编译成功,会生成一个 hello_hexagon 的可执行文件。注意,这个文件不能在x86主机上直接运行,它需要在Hexagon模拟器或真机上跑。

注意: 我曾经遇到过一个问题——编译出来的二进制文件在模拟器上跑不起来,报错说“无法加载”。后来发现是工具链版本和模拟器版本不匹配。所以,工具链和模拟器一定要用同一个SDK包里的,不要混搭。

2.3 模拟器(Simulator)环境搭建

模拟器,是我们前期开发调试的利器。没有目标板的时候,全靠它来验证代码逻辑。

模拟器位置

模拟器在 $HEXAGON_SDK_ROOT/tools/HEXAGON_Tools/$HEXAGON_TOOLS_VERSION/ 下,名字叫 hexagon-sim。你可以在 bin 目录下找到它。

启动模拟器

最简单的启动方式:

hexagon-sim -m qurt hello_hexagon

这里 -m qurt 表示模拟QuRT操作系统环境。QuRT是高通DSP上的实时操作系统,咱们后面会详细讲。

模拟器调试模式

如果你需要调试,可以加上 -g 参数:

hexagon-sim -g -m qurt hello_hexagon

这样模拟器会启动一个GDB服务器,监听在端口1234上。然后你可以在另一个终端用 hexagon-gdb 连接上去调试。

模拟器配置文件

我个人习惯写一个模拟器启动脚本,把常用的参数放进去:

#!/bin/bash
hexagon-sim \
    -m qurt \
    -g \
    --timing \
    --memory=256M \
    $1

这样每次只需要 ./run_sim.sh hello_hexagon 就行了,省得敲一堆参数。

小技巧: 模拟器跑起来后,你可以用 Ctrl+C 中断它,然后输入 quit 退出。如果遇到模拟器卡死,别慌,用 kill -9 强制杀掉进程就行。

2.4 目标板连接与调试设置

模拟器终究是模拟器,有些硬件相关的问题,必须在真机上才能复现。所以,目标板的连接和调试设置,是必须掌握的技能。

硬件连接

目标板通常通过USB或者JTAG连接到主机。我用的比较多的是高通自家的 QRK (Qualcomm Reference Kit) 开发板。连接方式如下:

  1. 用USB线连接开发板的ADSP调试口到主机。
  2. 给开发板上电,确认指示灯亮起。
  3. 在主机上运行 lsusb,如果能看到一个 Qualcomm 开头的设备,说明连接成功。

ADSP调试工具

高通提供了一套调试工具,叫 QDSP6 Debugger。它可以通过JTAG或USB连接到目标板的ADSP核心。

启动调试器:

qdsp6-debugger -t usb -c 0

这里 -t usb 指定连接方式为USB,-c 0 表示连接第0个核心(ADSP通常只有一个核心)。

加载和运行程序

连接成功后,你可以加载编译好的DSP程序:

qdsp6-debugger> load hello_hexagon
qdsp6-debugger> run

如果一切正常,你会看到程序在目标板上跑起来了,输出信息会通过串口或者ADSP的日志通道打印出来。

避坑指南: 我曾经在连接目标板时,遇到“无法识别设备”的错误。折腾了半天,最后发现是USB线的问题——有些USB线只支持充电,不支持数据传输。所以,一定要用带数据传输功能的USB线。另外,开发板的驱动也要装好,不然主机识别不到。

日志查看

ADSP的日志,通常通过 adb logcat 或者 QXDM 工具查看。我个人习惯用 adb logcat -s ADSP 来过滤ADSP相关的日志,这样不会和其他模块的日志混在一起。

adb logcat -s ADSP

如果日志太多,可以加上 -v time 显示时间戳,方便定位问题。

2.5 环境验证:一个完整的测试流程

环境搭好了,怎么确认一切正常?我建议你跑一个完整的测试流程:

  1. 在主机上编写一个简单的DSP程序(比如点灯或者打印)。
  2. 用Hexagon工具链编译。
  3. 先在模拟器上跑一遍,确认逻辑正确。
  4. 再通过调试器加载到目标板上运行。
  5. 查看日志,确认输出符合预期。

如果以上步骤都能顺利通过,恭喜你,开发环境搭建成功了!

核心要点总结:
  • SDK版本必须与目标芯片匹配
  • 工具链和模拟器要用同一个SDK包
  • 模拟器是前期调试的好帮手,但最终验证必须上真机
  • 目标板连接时,注意USB线和驱动问题

嗯,环境搭建这部分就讲到这里。下一章,咱们开始写第一个真正的ADSP程序,到时候你会感受到DSP编程和普通ARM编程的差异。准备好了吗?