3、开发环境搭建:QNX SDP安装、Momentics IDE配置、QNX虚拟机创建

好,咱们正式开始动手了。这一章我带你把开发环境搭起来。说实话,很多初学者在QNX上栽跟头,不是代码写不对,而是环境没配好。我当年第一次接触QNX时,光装SDP就折腾了一整天——后来发现是路径里有中文空格,嗯,这种坑我帮你踩过了。

3.1 QNX SDP安装:别急着点下一步

QNX Software Development Platform(SDP)是整个开发套件的核心。它包含了编译器、链接器、调试器,还有最重要的——BSP(板级支持包)。

下载前你要确认三件事:

  • 版本匹配:你的目标硬件是什么架构?ARMv7还是AArch64?x86_64?我建议统一用7.1或8.0版本,太老的版本对虚拟化支持不好。
  • 许可证:QNX现在属于BlackBerry,个人学习可以用社区版。商业项目需要买授权。别问我怎么知道的——我曾经在客户现场被查过License,场面一度很尴尬。
  • 磁盘空间:完整安装大概需要15GB。别装到C盘,后面Momentics的workspace会生成大量中间文件。

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

  1. 双击qnx800-sdp-installer.exe(Windows)或运行./qnx800-sdp-installer.bin(Linux)。
  2. 选择安装路径。我个人习惯放在/opt/qnx800(Linux)或D:\qnx800(Windows)。
  3. 勾选你需要的BSP。如果你做虚拟化,至少选qnx-virtioqnx-hypervisor相关组件。
  4. 等待安装完成。大概10-15分钟,取决于你的网速和硬盘速度。

小技巧:安装完成后,检查一下环境变量。确保QNX_HOSTQNX_TARGET被正确设置。你可以打开终端输入echo $QNX_HOST(Linux/macOS)或echo %QNX_HOST%(Windows)来验证。

3.2 Momentics IDE配置:别被Eclipse吓到

Momentics IDE本质上是Eclipse加了一堆QNX插件。如果你用过Eclipse,那上手很快。如果你没用过……嗯,别怕,我带你走一遍关键配置。

首次启动配置:

  • Workspace路径:选一个空间充足的目录。我建议D:\workspace_qnx~/workspace_qnx。别用默认的C:\Users\xxx,后面编译时会产生大量临时文件。
  • QNX SDK路径:启动后,进入Window → Preferences → QNX → QNX SDKs,添加你刚才安装的SDP路径。比如/opt/qnx800
  • 编译器选择:在Project Properties → C/C++ Build → Settings → QNX C Compiler里,确认-V参数指向正确的架构。比如-Vgcc_ntoaarch64是ARM 64位。

注意:如果你在Windows上开发,但目标板是ARM Linux,记得在Project Properties里把Build Configuration改成Release。Debug配置默认会加-g-O0,导致生成的二进制文件巨大,在嵌入式设备上可能跑不起来。我吃过这个亏,一个Hello World编译出来2MB,吓我一跳。

3.3 QNX虚拟机创建:用QEMU模拟目标硬件

没有实体开发板怎么办?用QEMU。QNX官方提供了QEMU的BSP,可以直接在虚拟机里跑QNX系统。这对于学习虚拟化来说,简直是神器。

创建QNX虚拟机的步骤:

  1. 下载QEMU:推荐版本7.2以上。Windows用户可以从qemu.org下载安装包。Linux用户直接sudo apt install qemu-system-arm
  2. 准备QNX镜像:在SDP安装目录下,找到target/qnx8/aarch64le/boot/sysroot-bootable.img。这个文件就是QNX的启动镜像。
  3. 编写启动脚本:创建一个start_qnx.sh文件,内容如下:
#!/bin/bash
qemu-system-aarch64 \
  -M virt \
  -cpu cortex-a57 \
  -smp 4 \
  -m 2G \
  -kernel /opt/qnx800/target/qnx8/aarch64le/boot/sysroot-bootable.img \
  -append "root=/dev/ram0 console=ttyAMA0" \
  -netdev user,id=net0 \
  -device virtio-net-device,netdev=net0 \
  -nographic

参数说明:

  • -M virt:使用ARM虚拟平台,支持virtio设备。
  • -cpu cortex-a57:模拟ARMv8 64位处理器。
  • -smp 4:分配4个虚拟CPU核心。做虚拟化测试时,建议至少2核。
  • -m 2G:分配2GB内存。QNX本身很轻量,但如果你要跑多个虚拟机,内存要留足。
  • -nographic:不使用图形界面,纯终端输出。这样方便在SSH或CI环境中使用。

个人经验:我第一次启动QNX虚拟机时,等了30秒没反应,以为死机了。后来发现是QEMU的串口输出默认缓冲,加上-serial stdio参数就能实时看到启动日志了。另外,如果你在Windows上跑,记得用qemu-system-aarch64w.exe(带w的版本支持Windows原生窗口)。

3.4 验证环境:写个Hello World跑一跑

环境搭好了,总得验证一下。在Momentics里新建一个QNX C Project,选择QNX Executable,然后写个简单的程序:

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

int main(int argc, char *argv[]) {
    printf("Hello from QNX!\n");
    printf("Running on CPU %d\n", getcpu());
    return 0;
}

编译后,把生成的可执行文件通过scp传到QNX虚拟机里(或者用QEMU的-virtfs共享目录)。然后在QNX终端里运行:

# ./hello_qnx
Hello from QNX!
Running on CPU 0

看到这个输出,说明你的开发环境已经全部就绪了。接下来,我们就可以正式开始虚拟化实战了。

避坑指南:我曾经在QNX虚拟机上运行程序时,发现printf不输出。折腾了半天,原来是QNX的默认标准输出被重定向到了/dev/null。解决办法是在启动脚本的-append参数里加上console=ttyAMA0,或者在程序里用fprintf(stderr, ...)先看看错误输出。

好了,环境搭建就到这里。下一章我们开始真正进入虚拟化世界——创建第一个QNX虚拟机实例,并让它和宿主机通信。你想想看,一个嵌入式系统里同时跑着Linux和QNX,各自干自己擅长的事,是不是很酷?