第二章:开发环境搭建——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指令时,心里还挺激动的——原来这就是飞控的底层啊。

注意: 交叉编译工具链的版本一定要和PX4固件版本匹配。比如PX4 v1.13推荐用GCC 10.3,如果你用了GCC 9.x,编译时可能会报一些奇怪的错误。我曾经因为版本不匹配,折腾了一整天才发现问题。

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是否被擦除,或者芯片锁死了
避坑指南: 我曾经在调试一个SPI传感器驱动时,发现每次烧录后飞控都不工作。折腾了两天,最后发现是调试器的3.3V引脚和飞控的3.3V引脚冲突了。解决办法:调试器只接SWDIO、SWCLK、GND三根线,不接VCC。

嗯,环境搭建这部分就讲到这里。记住一句话:环境搭好了,开发就成功了一半。别嫌麻烦,一步一个脚印来,后面写驱动的时候你会感谢现在的自己。


公众号:蓝海资料掘金营,微信deep3321