第2章:BSP开发环境搭建

说实话,环境搭建这事儿,看着简单,但坑是真不少。我见过太多人卡在这一步,折腾一整天连个Hello World都跑不起来。今天我就把这些年踩过的坑、总结的经验,一次性说清楚。

2.1 QNX Momentics IDE安装

QNX Momentics IDE,说白了就是基于Eclipse的一套集成开发环境。你如果用过Eclipse,上手会很快。但要注意,它不是普通的Eclipse,而是QNX专门定制过的。

安装步骤:

  1. 从QNX官网下载Momentics IDE安装包(注意选对版本,我建议用7.0或7.1)
  2. 运行安装程序,选择安装路径(千万别用中文路径,我吃过这个亏)
  3. 选择组件时,建议全选,省得后面缺东西再补
  4. 等待安装完成,大概10-15分钟
注意:安装路径不要有空格和中文。我曾经在一个项目里,因为路径带了中文,结果编译死活过不去,查了两天才发现是路径问题。

2.2 QNX SDK配置

SDK配置这块,很多人容易搞混。其实QNX的SDK分两种:一种是Host SDK(跑在开发机上),一种是Target SDK(跑在目标板上)。

配置Host SDK:

# 设置环境变量
export QNX_HOST=/opt/qnx710/host/linux/x86_64
export QNX_TARGET=/opt/qnx710/target/qnx7
export PATH=$QNX_HOST/usr/bin:$PATH

# 验证配置
qcc --version

配置Target SDK:

我个人习惯把Target SDK放在目标板的文件系统里。这样调试的时候,可以直接在目标板上运行测试程序。

组件 路径 说明
内核头文件 $QNX_TARGET/usr/include 编译驱动必备
库文件 $QNX_TARGET/usr/lib 链接时使用
工具链 $QNX_HOST/usr/bin 交叉编译工具
小技巧:建议把环境变量写到~/.bashrc里,这样每次打开终端就不用重新设了。我刚开始做BSP时,经常忘了设环境变量,编译报错才想起来。

2.3 交叉编译工具链搭建

交叉编译,说白了就是在你的PC上编译出能在ARM或x86目标板上运行的程序。QNX用的是自家的qcc编译器,它其实是对gcc的一层封装。

验证工具链:

# 查看支持的架构
qcc -V

# 编译一个简单的测试程序
qcc -Vgcc_ntoaarch64le -o hello hello.c

# 查看生成的文件类型
file hello
# 输出应该显示:ELF 64-bit LSB executable, ARM aarch64

嗯,这里要注意一点:不同的目标板架构,编译选项是不一样的。比如:

  • ARM 64位:-Vgcc_ntoaarch64le
  • ARM 32位:-Vgcc_ntoarmv7le
  • x86 64位:-Vgcc_ntox86_64

我在项目中遇到过一个问题:编译出来的程序在目标板上跑不起来,一运行就报"Invalid argument"。后来发现是架构选错了,目标板是ARMv8,我用了ARMv7的编译选项。

2.4 目标板连接与调试

目标板连接,我推荐用网线。串口虽然也能用,但速度太慢,传个大点的文件能急死人。

网络连接配置:

# 在目标板上设置IP
ifconfig en0 192.168.1.100 netmask 255.255.255.0

# 在开发机上测试连接
ping 192.168.1.100

# 使用ssh登录目标板
ssh root@192.168.1.100

调试配置:

QNX的调试器是gdb的变种,叫qconn。你需要在目标板上启动qconn服务:

# 在目标板上启动qconn
qconn &

# 在IDE中配置调试器
# 选择 Run -> Debug Configurations
# 设置 Target IP 为 192.168.1.100
# 设置 Port 为 8000

避坑指南:我曾经在调试一个网卡驱动时,发现断点总是打不上。折腾了半天,原来是目标板的防火墙把调试端口给封了。所以,记得检查目标板的防火墙设置。

调试小技巧:

  • sloginfo查看系统日志,比printf好用多了
  • 调试驱动时,建议先用io-pkt测试网络功能
  • 如果目标板死机了,别慌,按复位键重启就行

说实话,环境搭建这块,最怕的就是细节出错。你想想看,一个路径写错了,一个环境变量没设对,可能就要折腾半天。我的建议是:每做完一步,就验证一步。别等到最后才发现问题,那时候排查起来就麻烦了。

好了,环境搭建就讲到这里。下一章我们开始真正动手写BSP代码,到时候你会感谢今天把环境搭好的自己。