第二章:开发环境搭建——Ubuntu下PX4编译环境、交叉编译工具链、JTAG/SWD调试器配置
说实话,做嵌入式开发这么多年,我踩过最多的坑就是环境搭建。明明代码逻辑没问题,编译不过、烧录失败、调试器连不上……十有八九是环境没配好。这一章,我就把PX4驱动开发最核心的环境搭建步骤,掰开了揉碎了讲给你听。
2.1 Ubuntu下的PX4编译环境
我个人习惯用Ubuntu 20.04 LTS,稳定,社区支持好。你如果用的是22.04或者18.04,问题也不大,但有些依赖包的版本可能会有细微差别。
2.1.1 基础依赖安装
先把系统更新到最新,然后装一堆必要的工具。别嫌多,少了哪个后面都会报错。
sudo apt update
sudo apt upgrade -y
sudo apt install -y \
git zip cmake build-essential genromfs ninja-build \
libncurses5-dev libxml2-dev libssl-dev \
python3-pip python3-dev python3-numpy \
astyle clang-tidy
嗯,这里要注意:genromfs这个包在Ubuntu 22.04上可能被移除了,如果你装不上,可以换成mkromfs或者直接从源码编译。我在项目里遇到过这个问题,当时折腾了半小时才找到原因。
2.1.2 PX4源码获取
我建议你直接克隆官方仓库,别用那些第三方打包的版本,容易出问题。
git clone https://github.com/PX4/PX4-Autopilot.git --recursive
cd PX4-Autopilot
--recursive这个参数很重要,它会同时拉取所有子模块。如果你忘了加,后面编译时会报一堆找不到头文件的错误。我曾经犯过这个错,当时还以为是编译器坏了……
2.1.3 编译测试
先跑一个最简单的固件编译,验证环境是否正常。
make px4_fmu-v5_default
第一次编译会比较慢,因为要下载工具链、编译所有依赖库。大概需要10-20分钟,取决于你的网络和CPU。如果编译成功,你会看到类似这样的输出:
-- Build files have been written to: /home/user/PX4-Autopilot/build/px4_fmu-v5_default
[100%] Built target px4_fmu-v5_default
make list_config_targets 查看所有支持的板型。我平时调试时经常用这个命令,省得记那些长长的板子名字。
2.2 交叉编译工具链配置
说白了,交叉编译就是在你的电脑上编译出能在ARM芯片上跑的程序。你想想看,你的电脑是x86架构,飞控是ARM架构,不搞个交叉编译工具链,编译出来的东西根本跑不了。
2.2.1 ARM GCC工具链
PX4官方推荐用GCC ARM Embedded工具链。我建议你直接装最新版,别用系统自带的,版本太老。
# 下载ARM GCC
wget https://developer.arm.com/-/media/Files/downloads/gnu-rm/10.3-2021.10/gcc-arm-none-eabi-10.3-2021.10-x86_64-linux.tar.bz2
# 解压到指定目录
sudo tar -xjf gcc-arm-none-eabi-10.3-2021.10-x86_64-linux.tar.bz2 -C /opt/
# 添加环境变量
echo 'export PATH=$PATH:/opt/gcc-arm-none-eabi-10.3-2021.10/bin' >> ~/.bashrc
source ~/.bashrc
# 验证安装
arm-none-eabi-gcc --version
如果输出版本号,说明安装成功。如果没有,检查一下路径对不对,或者是不是忘记source了。
2.2.2 工具链验证
写一个简单的测试程序,交叉编译看看能不能通过。
// test.c
#include <stdio.h>
int main() {
printf("Hello from PX4!\n");
return 0;
}
arm-none-eabi-gcc -c test.c -o test.o
arm-none-eabi-objdump -d test.o
如果能看到ARM汇编指令,说明工具链工作正常。我记得第一次看到那些ARM指令时,心里还挺激动的——原来这就是飞控的底层啊。
2.3 JTAG/SWD调试器配置
调试器这东西,说白了就是让你能单步执行代码、看变量值、设断点。没有它,调试驱动就像蒙着眼睛走路。
2.3.1 常用调试器选择
| 调试器型号 | 接口类型 | 速度 | 价格 | 推荐指数 |
|---|---|---|---|---|
| ST-Link V2 | SWD | 4 MHz | 约30元 | ⭐⭐⭐⭐ |
| J-Link EDU | JTAG/SWD | 12 MHz | 约400元 | ⭐⭐⭐⭐⭐ |
| Black Magic Probe | SWD | 8 MHz | 约150元 | ⭐⭐⭐ |
| CMSIS-DAP | SWD | 10 MHz | 约50元 | ⭐⭐⭐⭐ |
我个人最推荐J-Link EDU,虽然贵了点,但稳定性和速度都没得说。如果你预算有限,ST-Link V2也够用,我刚开始学的时候就用它。
2.3.2 OpenOCD安装与配置
OpenOCD是一个开源的调试工具,支持多种调试器和目标芯片。
sudo apt install openocd
然后写一个配置文件,比如stm32f4.cfg:
# 选择调试器
source [find interface/stlink-v2.cfg]
# 选择目标芯片
source [find target/stm32f4x.cfg]
# 设置SWD模式
transport select hla_swd
# 设置速度
adapter speed 4000
启动OpenOCD:
openocd -f stm32f4.cfg
如果看到类似这样的输出,说明连接成功:
Info : STLINK V2J29S7 (API v2) VID:PID 0483:3748
Info : Target voltage: 3.28 V
Info : stm32f4x.cpu: hardware has 6 breakpoints, 4 watchpoints
2.3.3 GDB调试连接
OpenOCD启动后,再开一个终端,用GDB连接上去。
arm-none-eabi-gdb
(gdb) target remote localhost:3333
(gdb) monitor reset halt
(gdb) load firmware.elf
(gdb) continue
这里有个坑:monitor reset halt这个命令,有些调试器不支持。如果你遇到Unknown command的错误,可以试试monitor reset或者monitor halt。我在调试STM32F7时遇到过这个问题,后来发现是OpenOCD版本太旧了。
- 编译环境:Ubuntu 20.04 + PX4源码 + 基础依赖
- 交叉编译:ARM GCC 10.3 + 环境变量配置
- 调试器:J-Link或ST-Link + OpenOCD + GDB
2.4 环境验证与常见问题
环境搭好了,怎么知道对不对?我一般会跑一个完整的流程:编译→烧录→调试。
2.4.1 完整验证流程
# 1. 编译固件
make px4_fmu-v5_default
# 2. 连接调试器
openocd -f stm32f4.cfg &
# 3. 烧录固件
arm-none-eabi-gdb \
-ex "target remote localhost:3333" \
-ex "monitor reset halt" \
-ex "load build/px4_fmu-v5_default/px4_fmu-v5_default.elf" \
-ex "monitor reset" \
-ex "quit"
如果每一步都成功,恭喜你,环境搭建完成!
2.4.2 常见问题排查
- 编译报错:找不到头文件——检查子模块是否完整,运行
git submodule update --init --recursive - OpenOCD连不上——检查接线,SWD只需要4根线:SWDIO、SWCLK、GND、3.3V
- GDB无法加载固件——检查.elf文件路径是否正确,或者试试用.bin文件
- 烧录后飞控不工作——检查bootloader是否被擦除,或者芯片锁死了
嗯,环境搭建这部分就讲到这里。记住一句话:环境搭好了,开发就成功了一半。别嫌麻烦,一步一个脚印来,后面写驱动的时候你会感谢现在的自己。
公众号:蓝海资料掘金营,微信deep3321