嵌入式系统编程【免费下载链接】fprimeF´ - A flight software and embedded systems framework项目地址https://gitcode.com/gh_mirrors/fpri/fprime点击查看免费下载本指南以 F´F Prime官方文档 docs/UsersGuide/cmake/cmake-intro.md 为骨架系统讲解 F´ 的 CMake 构建系统的设计动机、目录组织、核心 APIregister_fprime_module/register_fprime_executable/add_fprime_subdirectory与实操流程。读者学完后将能够为组件Component、端口Port、拓扑Topology编写CMakeLists.txt把新模块挂接到部署Deployment中并在不借助fprime-util的情况下直接使用 CMake 完成出源构建out-of-source build、单元测试与交叉编译。为什么 F´ 需要一套全新的 CMake 构建系统早期版本的 F´ 使用一套定制的 make 系统来保证构建顺序与构建过程的正确性。然而这套系统对新手的学习曲线非常陡峭维护成本也高。作为替代F´ 引入了基于 CMake 的新构建系统目标有三点更易学习与使用遵循 CMake 的通用惯例而不是自成一套私有语法与标准 C 开发生态对齐IDE 集成、第三方工具链、社区经验都可以直接复用让添加模块自动化受益于自动编码autocoding能力F´ 的 XML/FPP 定义文件可以被自动编码器转换为 C 骨架CMake 系统负责把这些产物编排进构建。官方明确的两个使用前提务必先读不要与新、旧两套 make 系统混用。如果需要在两套系统之间切换请先执行git clean -xdf或手动删除所有生成的构建产物否则可能出现残留产物导致的链接错误或旧文件覆盖新文件的问题。禁止 in-source 构建。CMake 源内构建会把生成文件写进源码树污染版本库并破坏自动编码器的增量逻辑。所有构建都应使用 out-of-source出源目录。F´ CMake 的整体架构与文件组织CMake 本身是高层构建系统它不直接编译代码而是自动生成操作系统相关的低层构建文件如 GNU make 的 Makefile再由标准的make等工具完成编译、汇编与链接。F´ 在这一层之上又封装了专属 API把模块定义、自动编码与依赖推导全部纳入 CMake 流程。F´ CMake 构建架构如上图所示F´ 的构建流程以根CMakeLists.txt为入口分两类构建分支功能模块Module与可执行部署目标Executable。两条分支分别调用register_fprime_module/register_fprime_executable以及部署专用的register_fprime_deployment经由 cmake/API.cmake 中定义的注册函数联动 Python 自动编码器最终生成平台相关的构建文件输出静态库/归档文件与最终可执行文件。F´ CMake 文件层级从文件组织角度看见上图F´ 的 CMake 文件呈现典型的层级结构入口Entry Point由部署目录顶层的CMakeLists.txt触发并包含全局配置文件cmake/FPrime.cmakeConvenience 层按功能大类划分目录左侧如参考部署Ref右侧如 F´ 核心组件目录FwTime、Log等、SvcCmdDispatcher等服务组件、Drv驱动等Module / Deployment 层每个组件、端口、拓扑目录内再放置各自的CMakeLists.txt通过add_fprime_subdirectory逐级挂载。三步将新模块接入构建系统根据 cmake-intro.md 的说明向 CMake 系统添加一个新模块组件、端口或部署只需三步定义CMakeLists.txt在该模块目录中新建文件声明模块的源文件与依赖调用注册函数在CMakeLists.txt中调用register_fprime_module组件/端口或register_fprime_executable可执行/部署挂载到部署在部署层的CMakeLists.txt中用add_fprime_subdirectory把该目录加入构建。三步的完整函数签名与参数说明见 cmake/API.cmake 与 cmake-api.md。下面结合真实模板与参考部署逐层展开。模块 CMakeLists.txt注册库、可执行与单元测试F´ 的模块CMakeLists.txt由 cmake/module-CMakeLists.txt.template 给出标准结构。模块文件只需设置如下变量然后调用注册函数变量/函数用途说明SOURCE_FILES源文件列表必须。自动编码文件.fpp/Ai.xml与手写 C 源码的合并列表供register_fprime_module/register_fprime_executable使用MOD_DEPS模块依赖可选。仅用于补充无法被自动检测的依赖凡是在Ai.xml/.fpp导入关系遍历中可达的依赖CMake 会自动推导EXECUTABLE_NAME可执行文件名可选。覆盖默认可执行名供register_fprime_executable使用UT_SOURCE_FILES单元测试源文件可选配合register_fprime_utUT_MOD_DEPS单元测试依赖可选配合register_fprime_utregister_fprime_module注册普通模块/库组件、端口、拓扑均适用register_fprime_executable注册可执行/部署二进制部署的Top模块通常调用它register_fprime_ut注册单元测试与make checkTesting 构建类型配合模板给出的最小骨架如下节选自 cmake/module-CMakeLists.txt.template# Step 1: fill in source files. Autocoding XML files go here. set(SOURCE_FILES ... ) # Step 2: (optional) fill in non-standard module dependencies here. set(MOD_DEPS ... ) # Step 3: call register_fprime_module or register_fprime_executable register_fprime_module() # Step 4-6: (optional) set UT files / UT dependencies and register UT set(UT_SOURCE_FILES ... ) set(UT_MOD_DEPS ... ) register_fprime_ut()真实示例Ref 拓扑的 CMakeLists.txt参考部署Ref的拓扑目录 Ref/Top/CMakeLists.txt 是模块写法的典型范例——拓扑把.fpp定义文件、打包 XML 与手写 C 实现一并注册为模块并显式声明了自动检测不到的链接依赖set(SOURCE_FILES ${CMAKE_CURRENT_LIST_DIR}/instances.fpp ${CMAKE_CURRENT_LIST_DIR}/RefPackets.xml ${CMAKE_CURRENT_LIST_DIR}/topology.fpp ${CMAKE_CURRENT_LIST_DIR}/RefTopology.cpp ) set(MOD_DEPS Fw/Logger Svc/LinuxTime # Communication Implementations Drv/Udp Drv/TcpClient ) register_fprime_module()注意这里的MOD_DEPS并非全部依赖——凡是能通过instances.fpp/topology.fpp的导入关系推导出的依赖如Svc/CmdDispatcher、Svc/TlmChan等都会被 CMake 自动识别这正是与旧 make 系统最大的差异之一详见下文迁移章节。部署 CMakeLists.txt构建入口的三段式结构部署目录如Ref的CMakeLists.txt是整次构建的入口必须包含更多基础设施。标准结构由 cmake/deployment-CMakeLists.txt.template 定义分为三个 SectionSection 1基础项目配置调用cmake_minimum_required声明最低 CMake 版本模板要求 3.5 及以上参考部署使用了 3.13并用project声明项目名与语言必须包含C与CXXproject(Ref C CXX) cmake_minimum_required(VERSION 3.15)从源码看Ref实际使用了cmake_minimum_required(VERSION 3.13)并附带cmake_policy(SET CMP0048 NEW)以启用带版本号的project(Ref VERSION 1.0.0 LANGUAGES C CXX)见 Ref/CMakeLists.txt。project声明的项目名会直接成为可执行文件的默认名称。Section 2引入 F´ 核心构建系统依次include两个 CMake 文件把整个 F´ 框架纳入构建include(${CMAKE_CURRENT_LIST_DIR}/../cmake/FPrime.cmake) # NOTE: register custom targets between these two lines include(${CMAKE_CURRENT_LIST_DIR}/../cmake/FPrime-Code.cmake)FPrime.cmake负责框架级配置、模块注册表与自动编码基础设施FPrime-Code.cmake负责代码生成相关的目标与规则。若需自定义 target官方模板明确建议在两次 include 之间注册。Section 3挂载部署专属模块与拓扑用add_fprime_subdirectory逐一把组件目录和Top拓扑目录加入构建add_fprime_subdirectory(${CMAKE_CURRENT_LIST_DIR}/PingReceiver/) add_fprime_subdirectory(${CMAKE_CURRENT_LIST_DIR}/RecvBuffApp/) add_fprime_subdirectory(${CMAKE_CURRENT_LIST_DIR}/SendBuffApp/) add_fprime_subdirectory(${CMAKE_CURRENT_LIST_DIR}/SignalGen/) # Add Topology subdirectory add_fprime_subdirectory(${CMAKE_CURRENT_LIST_DIR}/Top/)最后部署入口文件还需要注册可执行输出。Ref的实际写法见 Ref/CMakeLists.txt是设置SOURCE_FILES入口Main.cpp与MOD_DEPS依赖${PROJECT_NAME}/Top即上文注册的拓扑模块再调用部署专用函数set(SOURCE_FILES ${CMAKE_CURRENT_LIST_DIR}/Main.cpp) set(MOD_DEPS ${PROJECT_NAME}/Top) register_fprime_deployment()register_fprime_deployment与register_fprime_executable的完整定义均可从 cmake/API.cmake 查得。注册后Ref还通过target_compile_options给部署可执行文件单独施加了-Wall -Wextra -Werror等严格编译选项核心组件不应用以免引入大量无关告警。要点回顾模块构建时至少调用register_fprime_module可执行输出可以用register_fprime_executable注册在部署CMakeLists.txt里也可以注册在任意子模块通常是Top/CMakeLists.txt中。两种模板都要求复制后重命名为CMakeLists.txt放入对应目录。手动使用 CMake构建目录、构建类型与make check多数用户日常使用fprime-util封装命令但理解裸 CMake 流程对排查构建问题与 IDE 集成至关重要。完整说明见 cmake-advanced.md。直接使用 CMake 的完整流程为# 1. 创建并进入构建目录每个配置独立一个目录 mkdir build_dir cd build_dir # 2. 调用 CMake 生成 Makefile指向部署的 CMakeLists.txt cmake ../Ref/ # 3. 触发底层构建系统 make # 4. 可选构建并运行单元测试仅 Testing 构建类型可用 make check两种 CMAKE_BUILD_TYPEF´ 只使用两种CMAKE_BUILD_TYPE取值在生成构建缓存时通过-DCMAKE_BUILD_TYPEtype指定取值用途说明Release类飞行flight-like可执行文件面向交付/运行不启用测试特性Testing调试 单元测试更宽松的可执行make check目标仅在此类型下可用出源构建与多配置隔离这是官方反复强调的纪律每种平台、工具链、选项组合都应使用独立的构建目录。例如迁移指南 Migration.md 给出的三变体实践# Linux 构建 mkdir build_linux cd build_linux cmake ../Ref cd .. # 嵌入式交叉构建 mkdir build_arm cd build_arm cmake ../Ref -DCMAKE_TOOLCHAIN_FILE../cmake/toolchain/arm-linux-gnueabihf.cmake cd .. # 单元测试构建 mkdir build_ut cmake ../Ref -DCMAKE_BUILD_TYPETesting cd .. # 分别构建 cd build_linux make cd ../build_arm make cd ../build_ut make check各目录相互独立、互不干扰且不需要手动清理其他目录。与旧系统不同一旦构建配置发生变化CMake 会自动重新运行配置阶段无需再执行make gen_make。从旧 make 系统迁移的三个关键差异Migration.md 总结了新系统相对旧系统的主要变化理解这些差异有助于迁移存量工程mod.mk→CMakeLists.txt旧系统每个模块一个mod.mk新系统一律改为CMakeLists.txt。依赖推导方式随之改变——所有在Ai.xml导入遍历中可达的依赖都会被自动检测只有无法自动检测的手动/链接依赖才需要写进MOD_DEPS逐模块维护最终由 CMake 汇总到顶层二进制做构建排序与链接。可执行命名旧系统使用拓扑Ai.xml的 key 命名可执行文件新系统使用 CMakeproject声明的${PROJECT_NAME}命名更清晰、更易维护。构建形态旧系统要求make gen_make预生成新系统一律出源构建、每个变体一个构建目录配置变更自动重跑 CMake。另外旧系统的make impl/make testcomp可直接用自动编码器包装脚本替代impl生成组件实现骨架testcomp生成测试组件骨架Autocoders/Python/bin/ac_util.sh impl|testcomp path/to/Ai.xml # 例如 Autocoders/Python/bin/ac_util.sh impl ./ComLogger/ComLoggerAi.xml工具链与平台为交叉编译接入新硬件F´ 的交叉编译采用通用工具链 专属平台文件的分离设计详见 cmake-toolchains.md 与 cmake-platforms.md工具链文件toolchain file标准 CMake 概念指定编译器与构建工具的位置与参数。F´ 大多直接复用社区通用工具链也可基于cmake/toolchain/下的模板自行编写平台文件platform fileF´ 专属配置文件名必须为${CMAKE_SYSTEM_NAME}.cmake存放在cmake/platform/目录。内容可以是一个空文件但通常包含StandardTypes.hpp的 include 路径F´ 平台类型头面向该平台的编译选项、头文件位置与#define平台相关的 CMake option 开关单元测试的专属编译配置单元测试被视作独立平台处理。新建平台的推荐路径是复制platform.cmake.template模板并逐步填写。整套流程与迁移指南给出的命令一致mkdir build-cross cd build-cross cmake -DCMAKE_TOOLCHAIN_FILEpath/to/toolchain/file path/to/deployment make进一步阅读与验证API 全量文档cmake-api.md 汇总了模块级 API、运行期选项、内建 targetdict、impl、testimpl、coverage及 CMake 支持代码索引函数实现可直接查阅 cmake/API.cmake迁移指南Migration.md 覆盖mod.mk迁移、部署创建、交叉编译与多变体构建进阶用法cmake-advanced.md 讲解不借助fprime-util的手工 CMake 用法与Release/Testing构建类型工具链与平台cmake-toolchains.md、cmake-platforms.mdCMake 单元测试cmake-uts.md 描述用于验证 CMake 系统自身的单元测试可直接复制的模板与范例cmake/module-CMakeLists.txt.template、cmake/deployment-CMakeLists.txt.template以及完整示例工程 Ref/CMakeLists.txt 与 Ref/Top/CMakeLists.txt。CMake 安装与基础教程请参考官方文档cmake.org/install、CMake 官方教程。虽然 F´ 尽力为 F´ 专属任务简化 CMake 用法但对通用 CMake 的基础理解仍然非常有助于排查与定制构建。赞分享嵌入式系统编程【免费下载链接】fprimeF´ - A flight software and embedded systems framework项目地址https://gitcode.com/gh_mirrors/fpri/fprime点击查看免费下载相关推荐F´ CMake 构建系统完全指南模块注册、部署集成、构建选项与平台交叉编译F´ CMake 构建系统完全指南模块注册、部署集成、构建选项与平台交叉编译 本文基于 F´ 官方用户手册的构建系统章节 docs/user manual/嵌入式系统编程F´ 飞控软件框架 CMake 构建系统设计与实践指南F´ 飞控软件框架 CMake 构建系统设计与实践指南 本指南以 F´F Prime开源仓库中的 CMake Build System 软件设计文档SDD嵌入式系统编程HarfBuzz跨平台编译指南CMake与Meson构建系统配置实战HarfBuzz跨平台编译指南CMake与Meson构建系统配置实战 想要在Windows、Linux和macOS上轻松编译HarfBuzz文本整形引擎吗?图形学上一篇如何用Infinite-Canvas实现ComfyUI本地部署与远程工作流管理终极指南下一篇字节跳动开源M3-Agent多模态记忆革命AI首次实现类人长期记忆存储创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考