3. 开发环境搭建:交叉编译工具链(ARM GCC)、CMake构建系统、串口调试工具(CuteCom、screen)

说实话,做嵌入式开发这么多年,我见过太多人栽在环境搭建这一步。明明代码逻辑没问题,编译出来就是跑不起来。最后发现,要么是工具链版本不对,要么是串口工具没配好。嗯,这节课咱们就把这些基础打牢。

3.1 交叉编译工具链:ARM GCC

先说说交叉编译。你想想看,咱们的电脑是x86架构,飞控板是ARM架构。在x86上编译出ARM能跑的程序,这就是交叉编译。说白了,就是让电脑替飞控板干活。

我个人习惯用gcc-arm-none-eabi这个工具链。为什么选它?因为它是专门针对ARM Cortex-M系列的无操作系统裸机开发。MAVLink协议栈跑在飞控上,通常就是裸机或者RTOS环境,这个工具链最合适。

安装步骤(Ubuntu 20.04/22.04):

# 添加ARM官方源
sudo add-apt-repository ppa:team-gcc-arm-embedded/ppa
sudo apt update

# 安装工具链
sudo apt install gcc-arm-none-eabi

# 验证安装
arm-none-eabi-gcc --version

安装完记得验证一下。我遇到过有人装了半天,结果arm-none-eabi-gcc命令都找不到。检查一下版本号,确保是9.x以上。

避坑指南:我曾经在项目里用过系统自带的gcc-arm-linux-gnueabihf,结果编译出来的程序在飞控上跑不起来。后来才发现,那个工具链是针对带操作系统的ARM Linux,不是裸机用的。记住,飞控开发一定要用none-eabi版本。

3.2 CMake构建系统

说到构建系统,我早期做飞控时还在用Makefile。后来项目越来越大,Makefile维护起来简直要命。CMake的出现,说白了就是帮我们自动生成Makefile,而且跨平台支持特别好。

MAVLink协议栈的官方生成工具也是基于CMake的。你想想看,我们要把MAVLink的XML定义文件生成C代码,这个过程用CMake来管理最方便。

安装CMake:

sudo apt install cmake cmake-curses-gui

# 验证版本
cmake --version

我个人习惯用ccmake(就是cmake-curses-gui),可以在终端里可视化配置编译选项。对于MAVLink协议栈的裁剪,这个工具特别有用。

这里给一个典型的CMakeLists.txt示例,用于MAVLink协议栈的交叉编译:

cmake_minimum_required(VERSION 3.10)
project(mavlink_porting)

# 设置交叉编译工具链
set(CMAKE_C_COMPILER arm-none-eabi-gcc)
set(CMAKE_CXX_COMPILER arm-none-eabi-g++)

# 设置编译选项
set(CMAKE_C_FLAGS "-mcpu=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -Os")

# 添加MAVLink协议栈源码
add_subdirectory(mavlink)

# 生成可执行文件
add_executable(mavlink_test main.c)
target_link_libraries(mavlink_test mavlink)

小技巧:编译选项里的-mcpu=cortex-m4要根据你的飞控芯片来改。我用STM32F4系列就用这个,如果是F1系列要改成cortex-m3。这个坑我踩过,编译出来的程序在F4上跑没问题,换到F1上就死机。

3.3 串口调试工具:CuteCom与screen

飞控和地面站通信,最常用的就是串口。MAVLink协议栈调试时,你得能看见数据在线上跑。我推荐两个工具:CuteCom和screen。

CuteCom:图形化串口工具

CuteCom是个图形界面工具,适合刚开始调试时用。你能直观地看到收发数据,还能设置各种参数。

sudo apt install cutecom

# 启动
cutecom

打开后设置波特率(MAVLink常用57600或115200)、数据位8、停止位1、无校验。这些参数要和飞控板上的配置一致。

使用要点:

  • 选择正确的串口设备(通常是/dev/ttyUSB0/dev/ttyACM0
  • 勾选"Hex Display"可以看十六进制数据,调试MAVLink协议时特别有用
  • 发送区可以输入十六进制数据,方便手动测试

screen:命令行串口工具

我个人更习惯用screen。为什么?因为嵌入式开发经常要SSH到服务器上编译,没有图形界面。screen在终端里就能搞定一切。

# 安装screen
sudo apt install screen

# 连接串口,波特率115200
screen /dev/ttyUSB0 115200

# 退出:Ctrl+A,然后按K,再按Y确认

screen有个好处,你可以用Ctrl+A然后按H来记录日志。这样调试MAVLink协议时,可以把所有通信数据保存下来慢慢分析。

注意:我曾经在调试时忘了关screen,结果下次插上USB转串口模块,发现设备节点变成了ttyUSB1。原来screen没退出,占着ttyUSB0。所以用完一定要记得退出,或者用Ctrl+A, :quit强制退出。

3.4 知识体系总览

为了让你更直观地理解这三部分的关系,我画了一张图:

开发环境搭建知识体系 ARM GCC工具链 CMake构建系统 串口调试工具 gcc-arm-none-eabi 交叉编译选项配置 裸机 vs Linux工具链 CMakeLists.txt编写 交叉编译工具链设置 MAVLink源码集成 CuteCom图形化工具 screen命令行工具 波特率/数据位配置 三者配合:编译 → 构建 → 调试,缺一不可

这张图把三个工具的关系说清楚了。ARM GCC负责编译,CMake负责构建管理,串口工具负责调试。三者配合,才能把MAVLink协议栈跑起来。

3.5 环境验证

装完工具后,我建议你写个简单的测试程序,验证整个环境是否打通。

// test.c
#include <stdio.h>

int main() {
    printf("MAVLink环境搭建成功!\n");
    return 0;
}
# 编译
arm-none-eabi-gcc -mcpu=cortex-m4 -mthumb -c test.c -o test.o

# 查看生成的目标文件
arm-none-eabi-objdump -h test.o

如果能正常生成.o文件,说明工具链没问题。接下来就可以开始移植MAVLink协议栈了。

个人经验:我习惯在项目根目录建一个toolchain.cmake文件,把交叉编译的配置都写进去。这样换项目时直接引用,不用每次都重新配。后面讲MAVLink移植时,我会把这个文件分享出来。

好了,环境搭建就到这里。记住,工具是死的,人是活的。多动手试试,遇到问题别慌,看看串口数据对不对,检查一下编译选项有没有配错。这些坑我都踩过,你跟着我的经验走,能省不少时间。


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