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

好,咱们直接进入正题。开发环境搭建这事儿,说难不难,说简单吧,我第一次搞的时候也踩了不少坑。尤其是QNX这套东西,跟Linux桌面开发完全是两码事。你想想看,你的代码是在PC上写的,但最终要跑到一个ARM或x86的嵌入式板子上,中间这一整套工具链、连接方式,任何一个环节出问题,后面都白搭。

我个人习惯是先把大框架理清楚,再动手。咱们这章就按这个思路来:先装IDE,再配SDP,然后搞定交叉编译,最后把目标机和宿主机连起来。

2.1 QNX Momentics IDE安装

Momentics IDE,说白了就是QNX官方基于Eclipse定制的一个集成开发环境。我当年第一次打开它的时候,心里想:这不就是个Eclipse换皮吗?后来用深了才发现,它里面集成了太多QNX特有的东西——比如系统分析器、内核调试器、进程管理器这些,都是普通Eclipse没有的。

安装步骤其实很简单:

  1. 从QNX官网或你购买的SDP安装包中,找到qnxmomentics--linux.x86_64.bin(Linux版)或对应的Windows安装包。
  2. 给这个文件加上执行权限:chmod +x qnxmomentics-*.bin
  3. 直接运行:./qnxmomentics-*.bin
  4. 跟着图形化安装向导走,选择安装路径。我建议别用默认路径,太深了,后面找文件麻烦。我一般放在/opt/qnx下面。
  5. 安装完成后,启动IDE,它会自动检测系统中已安装的SDP。
注意: 我曾经遇到过一个问题——安装时选了中文界面,结果后面调试时某些插件菜单显示乱码。后来我学乖了,一律用英文界面。QNX的国际化做得一般,英文版最稳。

2.2 QNX SDP配置

SDP(Software Development Platform)是QNX的灵魂。它包含了编译器、链接器、头文件、库文件,还有最重要的——BSP(板级支持包)。没有SDP,你的IDE就是个空壳子。

配置SDP的要点:

  • 版本匹配: Momentics IDE和SDP的版本必须严格对应。比如QNX 7.0的IDE配7.0的SDP,别混用。我见过有人拿7.0的IDE去加载6.6的SDP,结果编译出来的程序在目标机上跑不起来,折腾了两天才发现是版本问题。
  • 环境变量: 安装完SDP后,一定要设置QNX_HOSTQNX_TARGET这两个环境变量。前者指向宿主机的工具链路径,后者指向目标机的系统文件路径。
# 在 ~/.bashrc 中添加
export QNX_HOST=/opt/qnx/qnx700/host/linux/x86_64
export QNX_TARGET=/opt/qnx/qnx700/target/qnx7
export PATH=$PATH:$QNX_HOST/usr/bin

设置完记得source ~/.bashrc,或者重新登录一下。嗯,这一步很容易被忽略,但少了它,后面交叉编译时你会收到一堆"command not found"的错误。

2.3 交叉编译工具链

交叉编译,说白了就是在一台机器上编译出能在另一台不同架构的机器上运行的程序。咱们PC通常是x86_64,但嵌入式板子可能是ARM Cortex-A系列,或者老一点的ARMv7。

QNX的交叉编译工具链在$QNX_HOST/usr/bin下面。你进去看看,会看到一堆以架构命名的工具:

  • aarch64-unknown-nto-qnx7.0.0-gcc —— 64位ARM
  • arm-unknown-nto-qnx7.0.0eabi-gcc —— 32位ARM
  • x86_64-unknown-nto-qnx7.0.0-gcc —— x86_64

怎么用? 有两种方式:

  1. 命令行直接调用: 比如编译一个简单的hello.c:
aarch64-unknown-nto-qnx7.0.0-gcc -o hello hello.c
  1. 在Momentics IDE中配置: 新建一个QNX C/C++项目,选择对应的BSP和架构,IDE会自动帮你配置好编译器。我个人更推荐这种方式,因为IDE会帮你管理编译选项、链接脚本这些细节,不容易出错。
小技巧: 如果你不确定目标板子的架构,可以在板子上跑一下 uname -a 或者 cat /proc/cpuinfo。我在项目中就遇到过,明明板子是ARMv8的,但客户给的BSP却是ARMv7的,结果编译出来的程序一跑就Segmentation fault。

2.4 目标机与宿主机连接

环境搭好了,代码也编译了,怎么把它弄到板子上跑?这就涉及到目标机和宿主机的连接了。QNX支持好几种方式,我挑最常用的两种说。

2.4.1 串口连接

串口是最基础的方式,适合调试早期、网络还没起来的时候。QNX的串口终端通常用minicomscreen来连接。

# 假设串口设备是 /dev/ttyUSB0,波特率115200
screen /dev/ttyUSB0 115200

连上之后,你会看到QNX的启动日志,以及一个#提示符。这时候你就可以用mountls这些命令看看板子的文件系统了。

传文件怎么办? 串口传文件很慢,但可以用sz/rz协议。不过说实话,我只有在万不得已时才用串口传文件,太慢了。一个几兆的程序要传好几分钟。

2.4.2 网络连接(推荐)

网络连接才是正经的开发方式。QNX支持NFS、FTP、TFTP,还有最常用的——通过qconn服务进行远程调试。

步骤:

  1. 在目标机上启动qconn服务:
# 在QNX终端中
qconn &
  1. 在宿主机上,打开Momentics IDE,配置目标机连接:
  • Window → Show View → Target Navigator
  • 右键 → New QNX Target
  • 输入目标机的IP地址(比如192.168.1.100)
  • 端口默认是8000,不用改
  1. 连接成功后,你会在Target Navigator中看到目标机的进程列表、文件系统,甚至可以直接在上面启动调试。
核心要点: 网络连接的关键是qconn服务必须在目标机上运行,而且防火墙不能阻挡8000端口。我遇到过最坑的一次,是客户现场的网络管理员把8000端口封了,我排查了半天才发现是网络策略的问题。

2.5 验证环境是否搭建成功

所有步骤都做完了,怎么确认环境是好的?我一般会写一个最简单的程序来验证:

#include <stdio.h>
#include <sys/neutrino.h>

int main(int argc, char *argv[]) {
    printf("Hello from QNX! PID: %d\n", getpid());
    printf("Running on %d cores\n", _syspage_ptr->num_cpu);
    return 0;
}

在IDE中编译,然后通过网络传到目标机上运行。如果能看到正确的输出,说明你的开发环境已经全部打通了。

如果程序跑不起来,别慌。先检查三件事:

  • 编译架构对不对?(ARM还是x86?32位还是64位?)
  • 目标机上的qconn在不在跑?
  • 网络能不能ping通?

这三步排查完,90%的问题都能解决。剩下的10%,嗯,那可能就是玄学了——我遇到过目标机的NAND Flash有坏块,导致程序加载到一半就挂了。这种问题就只能靠经验和耐心了。

好,环境搭建就讲到这里。下一章咱们开始真正写代码,从第一个QNX进程讲起。