3、开发环境搭建:QNX Momentics IDE安装、交叉编译工具链配置、目标机与宿主机连接
好,咱们进入第三章。说实话,很多初学者觉得驱动开发最难的是写代码,但我个人经验告诉我——环境搭不好,后面全是坑。QNX的生态不像Linux那么“傻瓜式”,你得亲手把IDE、工具链、网络连接一个个搞定。这一章,我就带你走一遍完整流程。
3.1 QNX Momentics IDE安装
QNX Momentics IDE,说白了就是基于Eclipse的一套定制化开发环境。QNX官方把它和SDK打包在一起,你不需要单独下载IDE。
安装步骤:
- 获取安装包:从QNX官网或你的License服务器下载QNX Software Development Platform (SDP) 安装包。我建议下载最新LTS版本,比如7.1或8.0。
- 运行安装程序:在宿主机(通常是Windows或Linux)上执行安装脚本。Windows下是
setup.exe,Linux下是qnx-sdp-*.bin。 - 选择组件:安装过程中,记得勾选“Momentics IDE”和“Target Support”。如果你做PCIe驱动,还要选上“Board Support Package (BSP)”里对应你目标板的包。
- 配置工作空间:启动IDE后,它会让你选一个workspace目录。我个人习惯把workspace放在SSD上,编译速度快很多。
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\
里面会有qcc、q++、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 网络连接(推荐)
这是最方便的方式。前提是你的目标机和宿主机在同一个局域网内。
步骤:
- 目标机启动QNX:确保网络驱动已经加载,用
ifconfig查看IP地址。 - 宿主机配置:在Momentics IDE中,打开“Target Navigator”视图,右键添加新目标机。输入目标机的IP地址和用户名(默认是
root,无密码)。 - 测试连接:点击“Connect”,IDE会通过
qconn服务与目标机通信。如果成功,你会看到目标机的进程列表和文件系统。
qconn服务。这个服务默认在QNX启动时自动运行,如果没有,手动执行:qconn &。我遇到过目标机防火墙把端口8000(qconn默认端口)给封了的情况,记得检查一下。
3.4.2 串口连接(备选)
当网络不可用时(比如刚移植BSP,网卡驱动还没写好),串口就是救命稻草。
配置方法:
- 宿主机上使用
minicom(Linux)或PuTTY(Windows),波特率通常设为115200。 - 目标机通过串口线连接到宿主机。在QNX启动时,串口通常作为控制台输出。
- 传输文件:可以用
sz/rz(ZMODEM协议)或cp命令配合串口。但说实话,速度很慢,只适合传小文件。
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!
看到这个输出,说明你的开发环境已经全部打通了。嗯,这一步虽然简单,但非常重要——它验证了工具链、网络连接、目标机运行环境都没问题。
QNX_TARGET路径没配对。如果连接失败,先ping一下目标机IP,再检查qconn是否在运行。别问我为什么知道这些坑——都是血泪史啊。
好,环境搭建就到这里。下一章咱们正式进入PCIe驱动框架,我会带你从零开始写一个最简单的PCIe驱动。到时候你会发现,环境搭好了,后面的事情其实水到渠成。