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负责构建管理,串口工具负责调试。三者配合,才能把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