3、开发环境搭建:QNX Momentics IDE安装、交叉编译工具链配置、目标机与宿主机连接

好,咱们进入第三章。说实话,很多初学者觉得驱动开发最难的是写代码,但我个人经验告诉我——环境搭不好,后面全是坑。QNX的生态不像Linux那么“傻瓜式”,你得亲手把IDE、工具链、网络连接一个个搞定。这一章,我就带你走一遍完整流程。

3.1 QNX Momentics IDE安装

QNX Momentics IDE,说白了就是基于Eclipse的一套定制化开发环境。QNX官方把它和SDK打包在一起,你不需要单独下载IDE。

安装步骤:

  1. 获取安装包:从QNX官网或你的License服务器下载QNX Software Development Platform (SDP) 安装包。我建议下载最新LTS版本,比如7.1或8.0。
  2. 运行安装程序:在宿主机(通常是Windows或Linux)上执行安装脚本。Windows下是setup.exe,Linux下是qnx-sdp-*.bin
  3. 选择组件:安装过程中,记得勾选“Momentics IDE”和“Target Support”。如果你做PCIe驱动,还要选上“Board Support Package (BSP)”里对应你目标板的包。
  4. 配置工作空间:启动IDE后,它会让你选一个workspace目录。我个人习惯把workspace放在SSD上,编译速度快很多。
小提示: 如果你在Linux上安装,记得先装好Java Runtime Environment (JRE) 8或11。我遇到过好几次因为Java版本不对,IDE直接打不开的情况。

3.2 交叉编译工具链配置

QNX的驱动代码是在宿主机上编译,然后丢到目标机上跑的。这就涉及到交叉编译。你想想看,你的PC是x86架构,但目标板可能是ARM或AArch64,编译器必须能生成目标机的机器码。

工具链路径:

安装完SDP后,工具链默认在:

# 以QNX 7.1为例
/opt/qnx710/host/linux/x86_64/usr/bin/
# 或者Windows下
C:\QNX710\host\win64\x86_64\usr\bin\

里面会有qccq++ntoarmv7-gcc等命令。嗯,这里要注意:不要直接用系统自带的gcc,必须用QNX的qcc,它会自动链接QNX的C库和内核头文件。

配置环境变量:

我建议你把工具链加到PATH里,省得每次都要写全路径。在~/.bashrc里加一行:

export QNX_HOST=/opt/qnx710/host/linux/x86_64
export QNX_TARGET=/opt/qnx710/target/qnx7
export PATH=$QNX_HOST/usr/bin:$PATH

然后source ~/.bashrc生效。验证一下:

qcc --version
# 输出类似:QNX C Compiler (QNX SDP 7.1) 8.3.0
避坑指南: 我曾经在配置环境变量时,不小心把QNX_TARGET指向了错误的架构目录(比如把armv7的target给了aarch64的板子)。结果编译出来的驱动一加载就崩溃,查了两天才发现是路径配错了。所以,一定要确认你的目标机架构,比如aarch64le还是armv7

3.3 目标机与宿主机连接

环境搭好了,怎么把代码传到目标机上跑?QNX提供了几种连接方式,我重点讲最常用的两种:网络连接串口连接

3.4.1 网络连接(推荐)

这是最方便的方式。前提是你的目标机和宿主机在同一个局域网内。

步骤:

  1. 目标机启动QNX:确保网络驱动已经加载,用ifconfig查看IP地址。
  2. 宿主机配置:在Momentics IDE中,打开“Target Navigator”视图,右键添加新目标机。输入目标机的IP地址和用户名(默认是root,无密码)。
  3. 测试连接:点击“Connect”,IDE会通过qconn服务与目标机通信。如果成功,你会看到目标机的进程列表和文件系统。
核心要点: 目标机上必须运行qconn服务。这个服务默认在QNX启动时自动运行,如果没有,手动执行:qconn &。我遇到过目标机防火墙把端口8000(qconn默认端口)给封了的情况,记得检查一下。

3.4.2 串口连接(备选)

当网络不可用时(比如刚移植BSP,网卡驱动还没写好),串口就是救命稻草。

配置方法:

  • 宿主机上使用minicom(Linux)或PuTTY(Windows),波特率通常设为115200。
  • 目标机通过串口线连接到宿主机。在QNX启动时,串口通常作为控制台输出。
  • 传输文件:可以用sz/rz(ZMODEM协议)或cp命令配合串口。但说实话,速度很慢,只适合传小文件。
我的经验: 串口主要用于调试早期启动阶段。一旦网络通了,我立刻切换到网络连接。因为用串口传一个10MB的驱动镜像,可能要等5分钟,而网络只要几秒钟。

3.4 验证环境是否就绪

最后,写一个简单的“Hello World”驱动来验证整个链路。虽然咱们还没讲驱动框架,但你可以先编译一个用户态程序测试工具链:

# hello.c
#include <stdio.h>
int main() {
    printf("Hello from QNX!\n");
    return 0;
}

编译命令:

qcc -Vgcc_ntoaarch64le hello.c -o hello

把生成的hello文件通过scp传到目标机:

scp hello root@192.168.1.100:/tmp/

在目标机上执行:

/tmp/hello
# 输出:Hello from QNX!

看到这个输出,说明你的开发环境已经全部打通了。嗯,这一步虽然简单,但非常重要——它验证了工具链、网络连接、目标机运行环境都没问题。

再次提醒: 如果编译报错“cannot find -lc”,说明你的QNX_TARGET路径没配对。如果连接失败,先ping一下目标机IP,再检查qconn是否在运行。别问我为什么知道这些坑——都是血泪史啊。

好,环境搭建就到这里。下一章咱们正式进入PCIe驱动框架,我会带你从零开始写一个最简单的PCIe驱动。到时候你会发现,环境搭好了,后面的事情其实水到渠成。