2. 开发环境搭建:QNX Momentics IDE安装、QNX SDK配置、交叉编译工具链、目标机与宿主机通信

好,咱们直接进入正题。开发环境搭建这事儿,说难不难,说简单吧,我第一次搞的时候也踩了不少坑。尤其是QNX这套东西,跟Linux那套开发习惯差别挺大。你想想看,一个实时操作系统,它的工具链、调试方式、甚至文件系统都跟咱们平时用的不一样。

我个人习惯先把整个流程理清楚,再动手。说白了就四步:装IDE、配SDK、搞定交叉编译链、让目标机和宿主机说上话。咱们一个一个来。

2.1 QNX Momentics IDE 安装

Momentics IDE 是基于 Eclipse 的,但别把它当成普通 Eclipse 用。它集成了 QNX 特有的插件、调试器、性能分析工具。我记得第一次装的时候,直接去官网下了个安装包,结果发现少了几个关键组件。

注意: 不要用 Eclipse 的 Marketplace 去装 QNX 插件,那玩意儿版本对不上,容易出问题。一定要用 QNX 官方提供的完整安装包。

安装步骤其实很简单:

  • 从 QNX 官网下载 Momentics IDE 安装包(注意选对版本,7.0 和 8.0 差别不小)
  • 直接运行安装程序,一路 Next 就行
  • 安装路径不要有中文,不要有空格——这是老生常谈了,但我见过有人栽在这上面
  • 安装完成后,第一次启动会让你选择工作空间(workspace),我建议单独建一个目录,别跟其他项目混在一起

嗯,这里有个小技巧。安装完后,去 Help -> About Momentics IDE 看看版本号。如果版本号后面带了个 (c) 或者 (beta),那说明你装的可能不是稳定版。我在项目中吃过这个亏,beta 版的调试器有时候会莫名其妙断不下来。

2.2 QNX SDK 配置

SDK 配置是重头戏。很多人装完 IDE 就急着写代码,结果编译报一堆错——其实就是 SDK 没配好。

QNX 的 SDK 分两种:一种是针对特定硬件平台的 BSP(Board Support Package),另一种是通用的开发包。咱们做块设备驱动,一般需要 BSP 加上基础开发包。

核心思路: SDK 的本质就是告诉编译器「你的目标平台是什么,头文件在哪,库文件在哪」。

配置步骤:

  1. 在 IDE 中打开 Window -> Preferences -> QNX -> QNX SDK Locations
  2. 点击 Add,选择你下载好的 SDK 目录
  3. IDE 会自动扫描 SDK 中的平台信息,比如 x86_64、aarch64、ARMv7 这些
  4. 确认扫描结果中出现了你的目标平台

我曾经遇到过一个情况:SDK 扫描完了,但列表里只有 x86_64,没有 ARM 的。折腾了半天,发现是 SDK 包没解压完整。你想想看,一个压缩包几百兆,解压到一半报错,但 IDE 没提示——这种坑最烦人。

建议: 解压 SDK 后,先看看目录结构。正常情况下应该有 target、host、docs 这几个文件夹。如果少了 target/qnx7 这个目录,那肯定有问题。

2.3 交叉编译工具链

交叉编译,说白了就是在你的 PC 上编译出能在目标板上跑的程序。QNX 的工具链跟 GCC 一脉相承,但加了一些自己的东西。

常用的工具链命名规则是这样的:

目标平台 工具链前缀 示例
x86_64 x86_64-pc-qnx x86_64-pc-qnx-gcc
ARM 64-bit aarch64-unknown-qnx aarch64-unknown-qnx-gcc
ARM 32-bit arm-unknown-qnx arm-unknown-qnx-gcc

配置工具链其实不需要手动设置环境变量。Momentics IDE 会自动识别 SDK 里的工具链。你只需要在创建项目时选择正确的平台就行。

但我个人习惯在命令行里也配一套,方便写脚本批量编译。做法很简单:

# 在 ~/.bashrc 或 ~/.profile 中添加
export QNX_HOST=/opt/qnx710/host/linux/x86_64
export QNX_TARGET=/opt/qnx710/target/qnx7
export PATH=$QNX_HOST/usr/bin:$PATH

配完之后,试试在终端里敲 aarch64-unknown-qnx-gcc --version,如果能正常显示版本信息,那就说明工具链可用了。

注意: 不同版本的 QNX SDK,工具链的路径可能不一样。7.0 和 7.1 的 host 目录结构就有差异。我建议先看看 SDK 目录下 host/linux/x86_64/usr/bin 里有没有 gcc 文件,确认一下。

2.4 目标机与宿主机通信

环境搭好了,代码写好了,怎么跑起来?这就涉及到目标机和宿主机之间的通信了。QNX 提供了好几种方式,我挑最常用的两种说。

2.4.1 通过网络连接

这是最常用的方式。目标板跑起来后,会启动一个叫 qconn 的守护进程。宿主机上的 IDE 通过这个进程跟目标板通信。

配置步骤:

  1. 目标板上电,确保网络连通
  2. 在目标板终端里运行 qconn(一般 BSP 里已经自启动了)
  3. 在 IDE 中打开 Target Navigator 视图,点击 New Target
  4. 输入目标板的 IP 地址,端口默认是 8000
  5. 连接成功后,你会看到目标板的进程列表、文件系统、系统信息

我记得有一次,怎么都连不上目标板。查了半天,发现是防火墙把 8000 端口给拦了。你想想看,这种问题排查起来多浪费时间。

小技巧: 在宿主机上用 telnet <目标板IP> 8000 测试一下,如果能连上,说明网络没问题。如果连不上,先查防火墙。

2.4.2 通过串口连接

有些场景下没有网络,比如板子刚上电、网络驱动还没加载的时候。这时候就得靠串口了。

串口通信一般用 minicom 或者 putty。QNX 的串口默认是 115200 波特率、8 数据位、1 停止位、无校验。这个参数别搞错了,我见过有人设成 9600,结果全是乱码。

串口连接的好处是稳定,坏处是慢。传大文件就别想了,但调试内核驱动、看启动日志,串口完全够用。

2.4.3 文件传输

驱动编译好了,怎么传到目标板上?我常用的方式有两种:

  • 通过 IDE 的 Launch Configuration: 配置好之后,IDE 会自动把可执行文件传到目标板并运行
  • 手动用 scp 或 ftp: 如果目标板支持网络,直接用 scp 传文件,简单粗暴

我个人更倾向于第二种。为什么呢?因为有时候 IDE 的自动传输会卡住,尤其是文件比较大的时候。手动传虽然麻烦点,但心里有底。

总结一下: 开发环境搭建这事儿,一次配好,后面就省心了。我建议你配完之后,写个小驱动(比如 Hello World 级别的),编译、传输、运行一遍,确认整个链路是通的。这一步走通了,后面写块设备驱动才有底气。

嗯,下一章咱们就开始真正写驱动了。到时候你会用到今天配好的这套环境。所以别嫌麻烦,把基础打牢了。