BetaFlight代码解析(3)- 构建 Betaflight

本文档介绍如何从源代码构建 Betaflight 固件。内容涵盖构建系统要求、开发环境搭建、针对不同目标平台的构建以及构建输出的解读。有关整体系统架构的信息,请参阅“系统架构”部分。

先决条件

在安装 Betaflight 之前,您需要安装以下工具:

工具 目的 安装说明
Git 源代码管理 克隆存储库需要此步骤
GNU Make 构建系统 建议使用 4.0 或更高版本
ARM-GCC 工具链 交叉编译器 建议使用 ARM GCC 10.3.1 或更高版本。
Python 用于实用脚本 Python 3.6 或更高版本
OpenSSL 用于签名生成 某些构建操作需要

支持的操作系统

该构建系统支持以下操作系统:

LinuxmacOSWindows(通过 WSL 或 MinGW/MSYS2)

构建系统会自动检测您的操作系统并加载相应的设置。

构建系统架构

BetaFlight代码解析(3)- 构建 Betaflight

Betaflight 构建系统采用模块化 Makefile 架构:

核心构建系统:主目录
Makefile
包含专门的 Makefile 文件
mk/
配置管理:处理配置子模块、预处理器扩展和目标选择。平台架构:支持多种MCU系列,并具有平台特定的代码组织结构。构建输出:根据目标要求生成多种固件格式

目录结构

BetaFlight代码解析(3)- 构建 Betaflight

构建固件

基本构建命令

要构建 Betaflight,您首先需要克隆该代码库:



git clone https://github.com/betaflight/betaflight.git
cd betaflight

然后使用以下命令之一:

命令 描述

make
构建默认目标

make TARGET=MATEKF405
针对特定目标构建

make TARGET=MATEKF405 CONFIG=CUSTOM
使用自定义配置构建

make clean
清理构建产物

make TARGET=MATEKF405 clean
清洁特定目标

make targets
列出所有可用目标

make help
显示帮助信息

构建过程

BetaFlight代码解析(3)- 构建 Betaflight

版本控制和命名

构建系统会自动将版本信息包含在固件中:

BetaFlight代码解析(3)- 构建 Betaflight

固件版本由
version.h
主版本号、次版本号和补丁版本号定义。

配置管理系统

BetaFlight代码解析(3)- 构建 Betaflight

构建配置选项

选项 描述 例子 来源

TARGET
指定飞行控制器目标
make TARGET=MATEKF405
直接目标选择

CONFIG
使用统一目标配置
make CONFIG=MATEKF405_CONFIG
配置子模块

DEBUG
调试构建类型(INFO、GDB)
make DEBUG=GDB
优化控制

OPTIONS
编译时特性标志
make OPTIONS="USE_LED_STRIP=no"
特征选择

EXST
外部存储引导加载程序
make EXST=yes
引导加载程序支持

RAM_BASED
将目标加载到 RAM 中
make RAM_BASED=yes
开发模式

CUSTOM_DEFAULTS_EXTENDED
扩展自定义默认值
make CUSTOM_DEFAULTS_EXTENDED=yes
配置空间

配置子模块管理

配置系统采用git子模块的方式:

配置信息存储在单独的存储库中(
betaflight/config

make configs
该命令会为配置子模块加水。统一目标
FC_TARGET_MCU
使用预处理器宏从配置头中提取信息该
pp_def_value
系统支持从头文件中展开宏文件

目标系统架构

BetaFlight代码解析(3)- 构建 Betaflight

目标类型和发现

构建系统支持两种目标范式:

基础目标
target.mk
:带有文件的传统硬件特定目标基本配置:使用来自配置子模块的配置文件的统一目标

目标发现过程:


PLATFORMS

src/platform/
从子目录中发现
BASE_TARGETS
通过查找
target.mk
平台目标目录中的文件来找到它们。
BASE_CONFIGS

config.h
从配置子模块的文件中提取
CI_TARGETS
从基础目标中筛选,排除带有
.exclude
标记的目标。

平台组织

每个平台都遵循以下结构:



src/platform/<family>/
├── mk/<family>.mk          # MCU family build rules
├── target/<target>/        # Individual target configurations
│   └── target.mk          # Target-specific settings
├── link/                  # Linker scripts
└── <family>_hal.c         # Platform HAL implementation

构建输出和优化

BetaFlight代码解析(3)- 构建 Betaflight

构建输出类型

文件类型 变量名 描述 用法

.elf

TARGET_ELF
包含调试符号的 ELF 二进制文件 调试、反汇编

.bin

TARGET_BIN
原始二值图像 通过SWD/JTAG直接刷写

.hex

TARGET_HEX
英特尔十六进制格式 引导程序刷写

.dfu

TARGET_DFU
设备固件更新 USB DFU 刷机

.uf2

TARGET_UF2
USB 闪存格式 RP2040 拖放

.lst

TARGET_LST
拆卸清单 代码分析

.map

TARGET_MAP
内存映射 内存使用情况分析

文件命名规则

输出文件遵循以下格式: 
betaflight_<FC_VER>_<TARGET_NAME>[_<CONFIG>][_<REVISION>].<ext>

在哪里:


FC_VER
:提取自
version.h
使用预处理器
TARGET_NAME
目标或配置名称
REVISION
Git 版本(何时
REV=yes

外部存储 (EXST) 支持

对于具有外部存储引导加载程序的目标:


TARGET_EXST_ELF
:带有已修补的 MD5 哈希部分的 ELF
TARGET_UNPATCHED_BIN
:校验和修补前的二进制文件MD5校验和被计算并添加到二进制和ELF哈希部分。
EXST_ADJUST_VMA
通过配置头调整 VMA 地址

编译优化

可以为源文件分配不同的优化级别:


SPEED_OPTIMISED_SRC
关键性能代码(
-Ofast

SIZE_OPTIMISED_SRC
:空间受限代码(
-Os
)默认来源:标准优化(
-O2

NOT_OPTIMISED_SRC
便于调试的代码(未进行优化)

刷写固件

构建完成后,您可以使用以下方法之一刷写固件:

命令 描述

make TARGET=MATEKF405 flash
自动检测并闪存(USB 或串口)

make TARGET=MATEKF405 dfu_flash
使用 DFU 模式进行闪存

make TARGET=MATEKF405 tty_flash
使用串行引导加载程序进行闪存

make TARGET=MATEKF405 st-flash
使用 ST-Link 进行闪存

开发者工具

Betaflight包含多种工具,可帮助开发人员:

命令 描述

make openocd-gdb
启动 OpenOCD 和 GDB 进行调试

make cppcheck
运行静态代码分析

make test
运行测试套件

make version
打印固件版本信息

持续集成和测试

BetaFlight代码解析(3)- 构建 Betaflight

CI/CD 流水线支持

构建系统包含对持续集成的全面支持:

目标过滤


CI_EXCLUDED_TARGETS
在持续集成 (CI) 中,标记为文件的目标
.exclude
将被跳过。
CI_COMMON_TARGETS
:用于快速验证构建的代表性目标
PREVIEW_TARGETS
用于预览构建和测试的目标子集

自动化构建命令


make all
并行构建所有 CI 目标
make preview
构建预览目标并运行测试套件
make all_rev
:文件名中包含 Git 版本号的构建
make targets-by-mcu
:构建特定MCU类型的所有目标

静态分析与测试


cppcheck
静态代码分析集成包含多种执行模式的综合测试套件构建环境验证的编译器版本报告

故障排除

如果遇到编译问题,请尝试以下步骤:

运行
make clean
以删除旧的构建产物请确保已安装正确的 ARM 工具链。请检查您的
TARGET
信息是否有效。
make targets
要调试构建问题,请使用
DEBUG=INFO
该选项详细日志请见:
make V=1

© 版权声明

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
none
暂无评论...