嵌入式系统编程【免费下载链接】fprimeF´ - A flight software and embedded systems framework项目地址https://gitcode.com/gh_mirrors/fp/fprime点击查看免费下载导读本文档是 F´F Prime飞行软件框架从旧版 Make 构建系统迁移到新版 CMake 构建系统的官方迁移指南源自仓库 docs/UsersGuide/cmake/Migration.md。它面向所有希望摆脱旧 Make 系统、开始使用新 CMake 系统的 F´ 用户逐项给出迁移过程中的关键步骤、命令行示例、构建目录规划以及跨平台编译配置方法。读完本文你将掌握如何用ac_util.sh直接运行代码生成器、如何将mod.mk迁移为CMakeLists.txt、如何创建 Deployment 构建入口、如何配置交叉编译工具链与平台文件以及如何组织多变体的 out-of-source 构建目录。F´ 框架中的 CMake 相关文件组织如下可在仓库 cmake/ 目录下查看上图展示了 F´ CMake 系统的文件组织与依赖关系根CMakeLists.txt→FPrime.cmake核心构建入口 → 细分功能模块API、Options、Module、Unit_Test、toolchain、platform 等→ Deployment 部署配置入口。背景为什么要从旧 Make 系统迁移到 CMake历史版本的 F´ 附带了一套专有的 Make 构建系统用于确保构建过程正确、顺序无误。但使用和维护这套构建系统对新用户来说学习曲线陡峭。新 CMake 系统的目标就是替代旧的基于 Make 的构建系统让构建更易学、更易用同时使用 CMake 也让 F´ 更贴近标准的 C 开发实践详见 docs/UsersGuide/cmake/cmake-intro.md。使用 CMake 系统前必须理解两个重要注意事项CMake 不应与旧 Make 系统同时使用。若需要在两套构建系统之间切换先执行git clean -xdf或手动删除所有生成文件见 cmake-intro.md 第 1 条。CMake in-source 构建是危险的请务必使用 out-of-source 构建见 cmake-intro.md 第 2 条。make impl与make testcomp迁移到ac_util.sh旧系统中make impl和make testcomp命令用于生成实现骨架和测试组件代码。这些命令本质上只需一个 Ai.xml或一列 Ai.xml直接运行代码生成器即可并不依赖任何 Make 系统设置。因此迁移指南指出让用户先进入目录、生成 Make 系统、再运行这些命令远不如直接运行代码生成器高效。新系统中这一能力由ac_util.sh包装脚本提供Autocoders/Python/bin/ac_util.sh impl|testcomp path/to/Ai.xml i.e. Autocoders/Python/bin/ac_util.sh impl ./ComLogger/ComLoggerAi.xml注意当前仓库中Autocoders/Python/bin/ac_util.sh并不存在该文件可能位于其他安装路径或由 F´ 工具链提供但命令形式与用法以本迁移指南为准。实际使用时若仓库缺少该脚本请参考 F´ 发布包中的Autocoders/Python/bin目录。创建模块mod.mk→CMakeLists.txt旧 Make 系统中用户为每个模块定义一个mod.mk新 CMake 系统中用户必须改为在每个模块目录中定义一个CMakeLists.txt用于声明源文件和部分模块依赖。这是与旧 Make 系统的一个重要区别与旧 Make 系统的区别CMake 系统会自动检测 Ai.xml 中导入的所有依赖因此只需手工维护手动依赖和链接依赖。这些依赖以模块为单位声明最终会汇总到顶层二进制用于构建排序和链接。每个CMakeLists.txt应调用以下 API 中的一个或多个API 调用用途适用范围add_fprime_subdirectory将目录加入构建所有目录register_fprime_module将库加入构建所有组件Component与端口Portregister_fprime_executable将可执行输出加入构建所有拓扑Topology模块级CMakeLists.txt的指南见 module模板文件API 函数说明见 cmake-api.md 与 API.cmake。模块 CMakeLists.txt 模板实战仓库 cmake/module-CMakeLists.txt.template 提供了模块级模板核心步骤为设置SOURCE_FILES自动代码 XML/FPP 文件 源码文件的合并列表可选设置MOD_DEPS无法自动检测的模块依赖调用register_fprime_module或register_fprime_executable可选设置UT_SOURCE_FILES与UT_MOD_DEPS再调用register_fprime_ut。示例来自模板# Setup source files set(SOURCE_FILES ${CMAKE_CURRENT_LIST_DIR}/CommandDispatcherComponentAi.xml ${CMAKE_CURRENT_LIST_DIR}/CommandDispatcherImpl.cpp ) # Register the fprime module using above sources register_fprime_module() # Setup unit test source files set(UT_SOURCE_FILES ${FPRIME_FRAMEWORK_PATH}/Svc/CmdDispatcher/CommandDispatcherComponentAi.xml ${CMAKE_CURRENT_LIST_DIR}/test/ut/CommandDispatcherTester.cpp ${CMAKE_CURRENT_LIST_DIR}/test/ut/CommandDispatcherImplTester.cpp ) # Register a unit test with above sources register_fprime_ut()仓库中的真实组件示例Drv/BlockDriver/CMakeLists.txtset(SOURCE_FILES ${CMAKE_CURRENT_LIST_DIR}/BlockDriver.fpp ${CMAKE_CURRENT_LIST_DIR}/BlockDriverImpl.cpp ) register_fprime_module()拓扑模块示例Ref/Top/CMakeLists.txt——拓扑作为模块注册并可声明MOD_DEPSset(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/PosixTime # Communication Implementations Drv/Udp Drv/TcpClient Drv/TcpServer ) register_fprime_module()核心 API 的底层实现从 cmake/module.cmake 的源码可见register_fprime_module系列的底层由generate_base_module_properties统一生成目标Executable、Deployment、Unit Test、Library 四种类型并为目标设置FP_TYPE属性、加入FPRIME_MODULES全局列表然后调用setup_module_targets完成自动代码生成与依赖挂接见 module.cmake。add_fprime_subdirectory则是在 cmake/API.cmake 中实现的它先通过get_module_name计算模块名再基于FPRIME_BUILD_LOCATIONS找到最近的构建根用file(RELATIVE_PATH)计算新的二进制目录最终调用原生add_subdirectory并自动覆盖binary_dir参数以避免二进制产物冲突。创建 Deployment部署新 F´ 系统中Deployment 必须在其顶层目录放置一个遵循特定格式的CMakeLists.txt作为构建入口。该文件包含 F´ 的 Make 系统FPrime.cmake充当 CMake 命令的目标设置基本项目信息可通过add_fprime_subdirectory引入 deployment 专属的模块位于 deployment 目录的顶层。与旧 Make 系统的区别CMake 系统使用${PROJECT_NAME}作为可执行文件名而不是 Topology Ai.xml 中的 key。这一命名在 deploymentCMakeLists.txt中通过 CMake 的project命令完成命名更简洁、更易维护。在通过add_fprime_subdirectory加入的某个 deployment 模块中应使用register_fprime_executable注册一个或多个可执行目标。DeploymentCMakeLists.txt指南见 deployment-CMakeLists.txt.template。Deployment CMakeLists.txt 模板的三大 Section根据 cmake/deployment-CMakeLists.txt.template一个完整的 deploymentCMakeLists.txt由三个 Section 组成Section 1基础 CMake 基础设施——调用project设置项目与默认 deployment 可执行名语言必须包含C与CXX并调用cmake_minimum_required设置版本为3.16 或更高project(Ref C CXX) cmake_minimum_required(VERSION 3.16)Section 2包含 F´ 核心构建系统——从 F´ 库根目录 includecmake/FPrime.cmake与cmake/FPrime-Code.cmake。若需要自定义 target可在两条 include 之间注册include(${CMAKE_CURRENT_LIST_DIR}/../cmake/FPrime.cmake) include(${CMAKE_CURRENT_LIST_DIR}/../cmake/FPrime-Code.cmake)Section 3包含模块与拓扑——用add_fprime_subdirectory引入所有 deployment 专属模块拓扑目录也在此包含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/)真实 Deployment 示例Ref仓库中的参考部署 Ref/CMakeLists.txt 完整演示了上述三段式结构project(Ref VERSION 1.0.0 LANGUAGES C CXX)、includeFPrime.cmake与fprime_setup_included_code()、再通过add_fprime_subdirectory引入 PingReceiver、RecvBuffApp、SendBuffApp、SignalGen、TypeDemo 和 Top 六个模块最后用SOURCE_FILESMain.cpp、MOD_DEPS${PROJECT_NAME}/Top与register_fprime_deployment()生成顶层可执行目标。交叉编译Toolchain 文件 Platform 文件交叉编译通过创建一对文件来配置Toolchain 文件标准 CMake 工具链文件可在线获取或由用户自行编写。这些文件可以放在项目外部也可以放在仓库的cmake/toolchain目录中。Platform 文件为 F´ 添加交叉编译特有配置使 toolchain 文件保持通用性从而允许任何 CMake toolchain 都能被使用。Platform 文件设置标准头文件位置、目标平台的编译标志以及#defines。此外platform 文件还用于设置单元测试专属编译——即单元测试被当作一个独立的平台处理。这是与旧 Make 系统的一个区别。Toolchain 指南见 cmake-toolchains.mdPlatform 指南见 cmake-platforms.md。编写 Toolchain 文件仓库 cmake/toolchain/toolchain.cmake.template 提供了 toolchain 模板。模板明确了编写步骤STEP 1删除message(FATAL_ERROR ...)防护行防止模板被直接当作有效 toolchainSTEP 2设置CMAKE_SYSTEM_NAME目标系统名称STEP 3设置 C 与 C 交叉编译器路径STEP 4设置CMAKE_FIND_ROOT_PATH工具链包根路径用于查找库、可执行文件等DO NOT EDITCMAKE_FIND_ROOT_PATH_MODE_PROGRAM设为NEVERF´ 从主机查找程序LIBRARY/INCLUDE/PACKAGE设为ONLY交叉编译时从工具链查找。模板中的示例set(CMAKE_SYSTEM_NAME RaspberryPI) # specify the cross compiler set(CMAKE_C_COMPILER /opt/rpi/bin/arm-linux-gnueabihf-gcc) set(CMAKE_CXX_COMPILER /opt/rpi/bin/arm-linux-gnueabihf-g) # where is the target environment set(CMAKE_FIND_ROOT_PATH /opt/rpi)仓库cmake/toolchain/目录内现成可用的 toolchain 文件有aarch64-linux.cmake、arm-hf-linux.cmake、arm-sf-linux.cmake、raspberrypi.cmake树莓派交叉编译工具链。编写 Platform 文件根据 cmake-platforms.md任何 CMake toolchain 文件理论上都可用但需要在 platform 目录中创建一个以${CMAKE_SYSTEM_NAME}.cmake命名的 platform 文件来添加目标平台专属配置。该文件最小可以为空但更常见的是包含StandardTypes.hpp的 include 路径也可以添加构建标志、其他 include 以及 CMake option 标志来支持不同的编译时选项。创建新 platform 时可复制仓库 cmake/platform/platform.cmake.template 并填写。仓库现成的 platform 文件包括 Linux.cmake、Darwin.cmakemacOS和 rtems5.cmakeRTEMS 5 初步支持。构建 DeploymentsOut-of-Source 构建构建 Deployment 采用out-of-source源码外构建以干净地分离构建产物与源码。每一种构建变体都应使用独立的构建目录每个目录代表一次独立构建。例如若需要 Linux、嵌入式二进制、单元测试三种变体则应分别为其建立独立的构建目录结构。这是与旧 Make 系统的一个区别。设置与构建每个目录被创建后使用该构建所需的特定构建参数运行 CMake包括指定所用 toolchain。Toolchain 用于选择编译器与构建工具路径并允许 CMake 系统交叉编译且自动链接到平行的 F´ platform 文件其中包含 F´ 特定的交叉编译配置。仅在存在多个针对同一 toolchain 的 F´ 交叉编译配置时才需要显式指定特定 platform。与旧 Make 系统的区别每次构建通过调用 CMake 设置然后用make等标准构建命令构建。与旧系统不同若构建配置发生变化CMake 会自动重新运行无需调用make gen_make。完整使用文档见 cmake-intro.md。三种构建变体的完整示例考虑三种构建变体Linux、嵌入式Embedded、单元测试Unit Tests。设置 Linux 构建mkdir build_linux cd build_linux cmake ../Ref cd ..设置嵌入式ARM 交叉编译构建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推荐的构建目录规划如下不同平台/模式各自独立互不污染上图展示了推荐的多变体构建目录结构Project源码目录含fprime/框架与adapt/适配代码之下为build_linux、build_rpi、build_debug等各自独立的构建目录体现 out-of-source 构建最佳实践。全局构建选项OptionsCMake 系统运行时选项说明见 Options如需修改构建行为请查阅此文档。Targets内置支持目标如dict说明见 Targets.md。Targets 系统允许注册额外构建目标同时应用于全局与模块级作用域每个 target 可提供一组构建目标每个已注册模块一个和一个全局构建目标。例如dicttarget 可能构建局部字典片段再汇总为全局字典。对于生成 GNU make 文件的项目可用make target与make MODULE_target执行例如make Svc_CmdDispatcher_coverage详见 Targets.md。总结与迁移检查清单旧 Make 系统新 CMake 系统关键要点make impl/make testcompac_util.sh impl\|testcomp Ai.xml直接运行代码生成器无需 Make 系统模块mod.mk模块CMakeLists.txt用add_fprime_subdirectory/register_fprime_module/register_fprime_executable部署 make 入口部署CMakeLists.txt三段式projectinclude FPrime.cmakeadd_fprime_subdirectory${PROJECT_NAME}即可执行名交叉编译配置Toolchain Platform 双文件toolchain 通用化platform 承载 F´ 特定配置UT 视为独立平台源码内构建Out-of-source 构建每种变体独立构建目录配置变更时 CMake 自动重跑无需make gen_make迁移后的典型工作流用ac_util.sh快速生成组件骨架 → 为模块编写CMakeLists.txt并调用register_fprime_module→ 在 deploymentCMakeLists.txt中用add_fprime_subdirectory汇总模块并register_fprime_deployment→ 按目标平台创建独立构建目录执行cmake与make或make check跑单元测试。F´ 的 CMake 系统在 cmake/ 目录下提供了全部模板module-CMakeLists.txt.template、deployment-CMakeLists.txt.template、toolchain.cmake.template、platform.cmake.template参照模板即可快速完成从旧 Make 系统到新 CMake 系统的平滑迁移。赞分享嵌入式系统编程【免费下载链接】fprimeF´ - A flight software and embedded systems framework项目地址https://gitcode.com/gh_mirrors/fp/fprime点击查看免费下载相关推荐重构Vim构建系统从Autotools到CMake的实战迁移指南重构Vim构建系统从Autotools到CMake的实战迁移指南 引言构建系统迁移的痛点与价值 你是否仍在维护基于Autotools的遗留项目是否面临着跨如何无缝迁移Emscripten项目构建系统从Makefile到CMake的完整指南如何无缝迁移Emscripten项目构建系统从Makefile到CMake的完整指南 Emscripten作为一款强大的LLVM到WebAssembly编译器编译器WebAssembly开发工具构建工具Bilidown免费下载B站8K超清视频的完整指南收藏夹从此不落空Bilidown免费下载B站8K超清视频的完整指南收藏夹从此不落空 你有没有想过那些躺在收藏夹里的视频其实从来都不真正属于你平台改版、UP主退站、版权桌面应用音视频上一篇XMly-Downloader-Qt5 使用指南构建并本地保存喜马拉雅专辑音频下一篇Fast-GitHubGitHub加速扩展快速上手指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
