第2章:BSP开发环境搭建
说实话,环境搭建这事儿,看着简单,但坑是真不少。我见过太多人卡在这一步,折腾一整天连个Hello World都跑不起来。今天我就把这些年踩过的坑、总结的经验,一次性说清楚。
2.1 QNX Momentics IDE安装
QNX Momentics IDE,说白了就是基于Eclipse的一套集成开发环境。你如果用过Eclipse,上手会很快。但要注意,它不是普通的Eclipse,而是QNX专门定制过的。
安装步骤:
- 从QNX官网下载Momentics IDE安装包(注意选对版本,我建议用7.0或7.1)
- 运行安装程序,选择安装路径(千万别用中文路径,我吃过这个亏)
- 选择组件时,建议全选,省得后面缺东西再补
- 等待安装完成,大概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 | 交叉编译工具 |
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代码,到时候你会感谢今天把环境搭好的自己。