2. 开发环境搭建:QNX Momentics IDE安装、目标机与宿主机配置、SSH连接与文件传输

好,咱们正式开始动手了。这一章我带你把开发环境搭起来。说实话,环境搭建这事儿,看着琐碎,但真要是哪个环节没弄对,后面调试能把你折腾到怀疑人生。我在项目里见过太多人,代码写得挺好,结果卡在环境上,一卡就是半天。

咱们的目标很明确:宿主机上装好IDE,目标机上跑起QNX系统,然后让它们俩能愉快地通信。说白了,就是让你的电脑能指挥开发板干活。

2.1 QNX Momentics IDE 安装

QNX Momentics IDE,是基于Eclipse的一套集成开发环境。嗯,别一听Eclipse就觉得老土,它针对QNX做了深度定制,调试、分析、部署一条龙,用起来很顺手。

第一步:获取安装包

你需要从QNX官网或者你公司的软件仓库里拿到安装包。通常是一个 .bin 文件,比如 qnxmomentics-700.bin。注意版本,我建议用7.0或7.1,这两个版本比较稳定,我在几个量产项目里用的都是它们。

第二步:执行安装

在宿主机(假设你用的是Ubuntu 20.04或22.04)上,打开终端,给安装文件加上执行权限:

chmod +x qnxmomentics-700.bin
sudo ./qnxmomentics-700.bin

这里为什么要加 sudo?因为IDE默认会安装到 /opt 目录下,普通用户没权限写。当然,你也可以指定安装到自己的目录,比如 ~/qnx,那就没必要用sudo了。我个人习惯装到 /opt,省得后面路径出问题。

第三步:配置环境变量

安装完成后,需要把QNX的工具链加到PATH里。编辑你的 ~/.bashrc,在末尾加上:

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

然后 source ~/.bashrc 让它生效。你可以敲一下 which qcc 验证一下,如果输出了路径,说明环境变量配好了。

小提示: 如果你用的是Windows作为宿主机,安装过程类似,只是路径分隔符要换成反斜杠。不过我个人强烈建议用Linux做宿主机,命令行操作、脚本编写都方便得多。

2.2 目标机与宿主机配置

目标机,就是你的开发板,比如Raspberry Pi 4、TI AM57x或者i.MX8系列。QNX在这些板子上都有现成的BSP(板级支持包)。

2.2.1 目标机网络配置

目标机和宿主机需要在同一个局域网内。最简单的方式:用一根网线把开发板和路由器连起来,或者直接连到电脑的网口上(需要设置静态IP)。

在目标机上,启动QNX系统后,用 ifconfig 查看网络状态:

ifconfig en0

如果没看到IP地址,你需要手动配置。编辑 /etc/rc.d/rc.local 或者直接命令行设置:

ifconfig en0 192.168.1.100 netmask 255.255.255.0 up
route add default 192.168.1.1

这里 192.168.1.100 是目标机的IP,192.168.1.1 是你的网关(路由器地址)。记得根据你自己的网络环境改一下。

注意: 目标机的IP地址最好固定下来。我曾经在一个项目里,因为DHCP分配的IP变了,导致IDE连不上目标机,排查了半天才发现是IP换了。从那以后,我所有开发板都设静态IP。

2.2.2 宿主机网络配置

宿主机这边,确保能和目标机ping通。在宿主机终端里:

ping 192.168.1.100

如果能收到回复,说明网络通了。如果ping不通,先检查网线,再检查防火墙。很多Linux发行版默认开了防火墙,你得放行ICMP或者干脆关掉:

sudo ufw disable

嗯,生产环境不建议关防火墙,但开发阶段为了方便,暂时关掉问题不大。

2.3 SSH连接与文件传输

QNX系统默认是开了SSH服务的。你想想看,如果没有SSH,每次往板子上传程序都要插拔SD卡,那得多痛苦。

2.3.1 建立SSH连接

在宿主机终端里:

ssh root@192.168.1.100

默认密码通常是空或者 root。第一次连接会提示你确认主机指纹,输入 yes 就行。

登录成功后,你会看到QNX的Shell提示符。这时候你可以执行各种命令,比如查看进程、启动应用、修改配置等等。

核心要点: SSH连接是宿主机与目标机之间最基础的通信方式。后面IDE调试、文件传输都依赖它。

2.3.2 使用scp传输文件

传文件最常用的工具是 scp。比如,把宿主机上的一个可执行文件传到目标机上:

scp ./my_app root@192.168.1.100:/tmp/

反过来,从目标机下载文件到宿主机:

scp root@192.168.1.100:/tmp/log.txt ./

这里有个小坑:scp默认使用的是SSH的22端口。如果你的目标机SSH端口改了,得用 -P 参数指定端口号。比如:

scp -P 2222 ./my_app root@192.168.1.100:/tmp/

2.3.3 使用rsync同步目录

如果你需要频繁更新文件,scp 就显得有点笨了。这时候 rsync 是更好的选择。它只传输变化的部分,速度很快。

rsync -avz --progress ./build/ root@192.168.1.100:/opt/app/

这条命令会把本地 build 目录下的所有文件同步到目标机的 /opt/app 目录下。-a 表示归档模式,保留文件属性;-v 显示详细信息;-z 传输时压缩。

我的习惯: 在项目里,我会写一个简单的shell脚本,把编译、打包、传输、重启目标机应用这几个步骤串起来。每次改完代码,跑一下脚本,几秒钟后新程序就在板子上跑起来了。效率提升很明显。

2.3.4 配置SSH免密登录

每次SSH或者scp都要输密码,也挺烦的。配置免密登录一劳永逸。

在宿主机上生成SSH密钥对:

ssh-keygen -t rsa -b 4096

一路回车,会在 ~/.ssh/ 目录下生成 id_rsa(私钥)和 id_rsa.pub(公钥)。然后把公钥传到目标机上:

ssh-copy-id root@192.168.1.100

之后你再SSH或者scp,就不用输密码了。嗯,这里要注意,私钥文件一定要保护好,别泄露出去。

2.4 在IDE中配置目标机连接

环境搭好了,咱们回到IDE里,把目标机配置进去。

打开QNX Momentics IDE,点击菜单栏 Window -> Preferences,然后找到 QNX -> QNX Target Navigator。在这里添加一个新的目标机:

  • Name: 随便起个名字,比如 MyBoard
  • Hostname/IP: 填目标机的IP地址,比如 192.168.1.100
  • Username: root
  • Password: 留空或者填 root

点击 Test Connection,如果看到绿色的提示,说明IDE和目标机成功握手了。

到这里,你的开发环境就基本就绪了。 你可以直接在IDE里编写代码、编译、然后一键部署到目标机上运行。后面章节我们会深入讲解如何创建工程、编写多核程序,以及如何利用IDE的调试工具进行性能分析。

最后说一句,环境搭建这一步,慢一点没关系。把基础打牢了,后面写代码、调bug的时候,你会感谢现在耐心的自己。