第2章:QNX开发环境搭建:QNX Momentics IDE安装、目标机与宿主机配置、SSH与网络调试

好,咱们直接进入正题。开发环境搭建这事儿,说难不难,说简单吧,我第一次搞的时候也踩了不少坑。你想想看,QNX是个实时操作系统,它的开发模式和Linux、Windows都不太一样——你得有一台宿主机(开发机)和一台目标机(跑QNX的板子),两边得能通信。说白了,就是“交叉开发”。

我个人习惯先把IDE装好,再配网络,最后调SSH。这个顺序比较顺,不容易出幺蛾子。咱们一步步来。

2.1 QNX Momentics IDE安装

QNX Momentics IDE是基于Eclipse的,所以用过Eclipse的朋友应该不陌生。但注意,它不是普通的Eclipse,里面集成了QNX的编译器、调试器、系统分析工具。我建议直接去BlackBerry的QNX官网下载,别用第三方渠道,版本对不上会很麻烦。

安装步骤(以QNX SDP 7.0为例):

  1. 下载QNX Software Development Platform (SDP) 7.0安装包,约2GB左右。
  2. 在宿主机(Windows或Linux)上运行安装程序。我一般选Linux,因为后续命令行操作更顺手。
  3. 安装过程中会提示选择组件——务必勾选“Momentics IDE”和“QNX Target Support”。其他像文档、示例代码也建议选上,省得后面再补。
  4. 安装完成后,启动IDE。第一次启动会要求设置工作空间(workspace),我习惯放在~/qnx_workspace

小技巧: 如果你在Windows上装,记得把QNX的bin目录加到系统PATH里。比如 C:\QNX700\host\win64\x86_64\usr\bin。不然命令行里敲qcc会找不到命令。我当年就因为这个卡了半小时。

2.2 目标机与宿主机配置

目标机就是你的嵌入式板子,比如BeagleBone Black、Raspberry Pi,或者你们公司的定制板。QNX支持ARM、x86、AArch64等架构。配置的核心就一句话:让宿主机能编译代码,让目标机能跑代码。

具体来说,分三步:

  • 第一步:确定目标机架构。 在IDE里新建一个QNX项目时,会要求选择目标机类型。比如我手头是ARM Cortex-A53的板子,就选aarch64le。选错了编译出来的二进制跑不了,别问我怎么知道的。
  • 第二步:配置目标机IP。 目标机启动后,用网线连到同一个局域网。在目标机的QNX shell里敲ifconfig查看IP地址。比如得到192.168.1.100
  • 第三步:宿主机上配好SSH。 这个下一节细说。

注意: 目标机上的QNX系统必须包含sshd服务。有些精简版镜像可能没带,需要自己编译进去。我曾经在客户现场发现目标机连不上,折腾半天才发现是镜像里没装SSH服务端……嗯,从那以后我每次烧录前都会检查ls /usr/sbin/sshd

2.3 SSH与网络调试

SSH是宿主机和目标机通信的桥梁。QNX的SSH实现和Linux基本一致,但有几个坑要注意。

2.3.1 宿主机端配置

在宿主机上,打开终端,生成SSH密钥(如果还没有的话):

ssh-keygen -t rsa -b 4096
# 一路回车,默认保存在 ~/.ssh/id_rsa

然后把公钥拷贝到目标机:

ssh-copy-id root@192.168.1.100
# 或者手动复制:cat ~/.ssh/id_rsa.pub | ssh root@192.168.1.100 "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

为什么要配密钥?因为调试过程中要频繁SSH登录,每次输密码太烦了。而且有些自动化脚本不支持交互式输入。

2.3.2 目标机端配置

在目标机上,确保SSH服务已启动:

sshd -D &   # 前台运行,方便看日志
# 或者用服务方式启动:sshd

检查端口是否监听:

netstat -an | grep 22
# 应该看到 LISTEN 状态

网络调试的关键命令:

  • ping 192.168.1.100 —— 先确认网络通不通。
  • ssh root@192.168.1.100 —— 登录目标机。
  • scp my_program root@192.168.1.100:/tmp/ —— 传文件到目标机。
  • qconn —— QNX特有的调试代理,IDE通过它连接目标机进行源码级调试。

2.3.3 在IDE中配置目标机连接

打开Momentics IDE,按以下步骤操作:

  1. 点击菜单 Window → Show View → Target Navigator
  2. 在Target Navigator面板中,右键 → New QNX Target
  3. 填写目标机名称(随便起,比如my_board)、IP地址(比如192.168.1.100)、用户名(一般是root)。
  4. 点击 Test Connection,如果显示绿色勾,说明连接成功。

连接成功后,你就可以在IDE里直接编译、上传、远程调试了。编译时选择Run As → QNX C/C++ Application,IDE会自动把二进制传到目标机并启动。

避坑指南: 我曾经遇到一个问题——IDE能ping通目标机,但就是连不上qconn。后来发现是目标机上的qconn服务没启动。解决办法:在目标机上手动执行qconn &,或者把它加到启动脚本里。另外,防火墙也可能拦掉qconn的8000端口,记得放行。

2.4 验证环境是否就绪

环境搭好之后,我习惯写一个简单的“Hello World”来验证:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
    printf("Hello from QNX! PID=%d\n", getpid());
    return 0;
}

在IDE里新建一个QNX C Project,把代码贴进去,编译,然后右键 Run As → QNX C/C++ Application。如果目标机的终端上打印出Hello from QNX! PID=xxx,恭喜你,环境搭建成功了。

如果没成功,别慌。按这个顺序排查:

  • 目标机能ping通吗?
  • SSH能登录吗?
  • qconn在目标机上运行吗?
  • IDE里的Target配置IP和端口对吗?

大部分问题都出在这四个环节里。我当年第一次搭环境,从下午搞到晚上,最后发现是网线没插紧……嗯,这种低级错误谁都会犯,别笑。

2.5 小结

这一章我们搞定了三件事:装了Momentics IDE,配好了宿主机和目标机,打通了SSH和网络调试。说白了,就是让开发机和板子能“说话”。后面章节的实战内容,全都依赖这个环境。所以,如果这一步没走通,先别急着往下看,把环境调稳了再说。

下一章,咱们聊聊QNX的进程和线程调度——这才是实时系统的核心。到时候我会拿一个实际项目中的调度问题来拆解,保证干货满满。