部署实战解析:一个完整的星载 CDH 参考拓扑)
F´ ReferenceRef部署实战解析一个完整的星载 CDH 参考拓扑【免费下载链接】fprimeF´ - A flight software and embedded systems framework项目地址: https://gitcode.com/GitHub_Trending/fpr/fprime本文基于 F´F Prime开源仓库中TestDeploymentsProject/Ref的参考部署Reference DeploymentSDD 文档系统讲解这个把命令Commanding、事件Events、遥测通道Telemetry Channels与参数Parameters串联起来的“参考航天器”示例包括它的组件构成、九个维度的拓扑视图、真实的 FPP 拓扑定义、构建运行方式与集成测试。读完本文你将掌握如何阅读和复用 F´ 的部署拓扑以及如何用fprime-util和 F´ GDS 快速跑起一个完整的飞行软件二进制。1. 参考部署是什么参考部署应用Reference Deployment的目标是演示一组 ISFIntegrated Software Framework即 F´ 组件框架组件如何互连形成一个可运行的部署deployment。部署在这里指“一组组件连接在一起并编译成单个二进制”的整体。该部署模拟了一个“参考航天器”覆盖了航天飞行软件中最核心的几类能力命令Commanding地面系统发送命令组件注册并接收命令事件Events组件产生事件日志供下行传输与地面查看遥测通道Telemetry Channels组件周期性更新遥测值并下行参数Parameters参数数据库PrmDb在启动时从存储加载参数并提供给组件。从仓库结构看这个参考部署位于 TestDeploymentsProject/Ref其顶层说明文档SDD位于 TestDeploymentsProject/Ref/docs/sdd.md构建与运行指南位于 TestDeploymentsProject/Ref/README.md。部署源码FPP 拓扑定义、C 实现与测试都在该目录及其Top/、test/子目录中。2. 组件清单三类组件构成参考部署SDD 将参考部署中的组件划分为三类示例应用组件、可复用服务组件、以及平台实用组件。2.1 示例应用组件Application Components组件描述SDD 链接SendBuffApp发送数据缓冲区buffer的组件TestDeploymentsProject/Ref/SendBuffApp/docs/sdd.mdRecvBuffApp接收数据缓冲区的组件TestDeploymentsProject/Ref/RecvBuffApp/docs/sdd.mdBlockDriver一个概念性驱动把缓冲区从 SendBuffApp 中继到 RecvBuffAppTestDeploymentsProject/Ref/BlockDriver/docs/sdd.mdSignalGen按波形生成遥测数据的组件TestDeploymentsProject/Ref/SignalGen/docs/sdd.mdPingReceiver接收健康Healthping 且可以被命令关闭响应的测试组件TestDeploymentsProject/Ref/PingReceiver/docs/sdd.md从各自的 SDD 与源码可以看到这些组件的定位SendBuffApp负责发送缓冲区并提供注入错误的能力需求 ISF-RBF-001/002RecvBuffApp负责接收并检测接收缓冲区中的错误ISF-SBF-001/002BlockDriver是一个主动active组件通过BufferIn/BufferOut端口把数据包原样回环并把PingIn的键值回环到PingOut需求 ISF-BDV-001/002定义见 TestDeploymentsProject/Ref/BlockDriver/BlockDriver.fppSignalGen用于在地面软件中测试绘图同时演示**数据产品Data Products**能力REF-SGN-001/002。2.2 可复用服务组件Reusable Service Components这些组件是标准 F´ 服务组件被参考部署互连起来提供通用能力组件描述SDD 链接EventManager记录事件供下行Svc/EventManager/docs/sdd.mdActiveRateGroup通过调用各组件来执行一个速率组rate groupSvc/ActiveRateGroup/docs/sdd.mdBufferManager管理缓冲区池Svc/BufferManager/docs/sdd.mdCmdSequencer从二进制文件中加载一组命令并执行Svc/CmdSequencer/docs/sdd.mdCmdDispatcher把来自地面系统的命令分发给已注册的组件Svc/CmdDispatcher/docs/sdd.mdFileDownlink把文件下行到地面系统Svc/FileDownlink/docs/sdd.mdFileManager执行各种文件操作Svc/FileManager/docs/sdd.mdFileUplink接收来自地面系统的上行文件Svc/FileUplink/docs/sdd.mdHealth对拓扑中的主动组件发送 ping验证其线程是否存活Svc/Health/docs/sdd.mdPrmDb启动时从存储加载参数集并向组件提供参数Svc/PrmDb/docs/sdd.mdRateGroupDriver向 ActiveRateGroup 实例发送消息以驱动一个周期Svc/RateGroupDriver/docs/sdd.mdTlmChan为遥测通道提供存储并周期性向地面系统发送遥测Svc/TlmChan/docs/sdd.mdPolyDb管理一个多态数据值polymorphic data values数据库Svc/PolyDb/docs/sdd.md2.3 平台实用组件Utility Components组件描述SDD 链接PosixTime在 POSIX 系统上为遥测提供时间戳Svc/PosixTime/docs/sdd.mdPassiveConsoleTextLogger把事件文本形式打印到标准输出Svc/PassiveConsoleTextLogger/docs/sdd.md需要说明的是SDD 这张服务组件表给出的是参考部署涉及的完整服务能力。在当前仓库的 TestDeploymentsProject/Ref/Top/topology.fpp 中这些服务组件大多被组织进了可复用的子拓扑subtopology——CdhCore、ComCcsds、FileHandling、DataProducts定义见 Svc/Subtopologies参考部署再对这些子拓扑进行实例化与互连。这种“子拓扑 顶层部署”的组织方式正是现代 F´ 部署推荐的结构。3. 拓扑总览一个部署如何被定义出来SDD 明确指出参考部署的拓扑是“所有组件互连”的集合连接数量庞大无法在一张图中全部展示因此按用途拆分为多个视图。需要留意的是SDD 中的拓扑图最初由 MagicDraw 生成FPP 连接定义则用 ISF 的 MagicDraw 插件生成而当前仓库已经使用纯手写的 FPP 重新定义了该拓扑两者在结构上一一对应。顶层部署定义在 TestDeploymentsProject/Ref/Top/topology.fpp 中其结构如下子拓扑实例CdhCore.Subtopology、ComCcsds.Subtopology、FileHandling.Subtopology、DataProducts.Subtopology另有DpCompression.Subtopology处于注释状态可在需要时启用本部署专属实例5 个SignalGenSG1~SG5、blockDrv、posixTime、pingRcvr、3 个速率组rateGroup1Comp/rateGroup2Comp/rateGroup3Comp、rateGroupDriverComp、recvBuffComp、sendBuffComp、typeDemo、systemResources、dpDemo、linuxTimer、comDriver、cmdSeq、wasmSeq模式图pattern graph说明符command connections、event connections、telemetry connections、text event connections、health connections、param connections、time connections——这些是 FPP 的“接线约定”声明了拓扑中所有实例与核心服务命令分发、事件、遥测、健康、参数、时间的连接关系遥测包定义通过include RefPackets.fppi引入见 TestDeploymentsProject/Ref/Top/RefPackets.fppi直接连接direct graph specifiersRateGroups、Communications、Ref、ComCcsds_CdhCore、ComCcsds_FileHandling、FileHandling_DataProducts等连接块。各实例的基址base ID、队列/栈大小与优先级定义在 TestDeploymentsProject/Ref/Top/instances.fpp 中。文件头给出了基址约定0xDSSCCxxxD为部署位1-FSS为子拓扑位00 为主拓扑CC为组件位xxx保留给组件内部条目事件、命令、遥测。例如blockDrv基址为0x10000000rateGroup1Comp为0x10001000sendBuffComp为0x10010000comDriver为0x10025000。默认队列大小为 10、栈大小为 64 KB主动组件分别分配了优先级如blockDrv47、三个速率组 43/42/41、cmdSeq与wasmSeq20、dpDemo19。4. 九大拓扑视图SDD 把拓扑视图拆分为 CDHCommand and Data Handling命令与数据处理核心连接集——这部分会在项目间复用——以及参考示例独有的连接集。以下逐一展开并结合当前源码说明每个视图的实际连线。4.1 Commanding命令命令视图由三部分组成组件注册命令的连接、命令的分发连接、以及命令执行状态返回的连接。CDH Commanding核心命令链路的连接如下Reference Deployment Commanding参考部署专属命令连接如下从源码看命令通路的核心是CdhCore子拓扑中的cmdDispSvc.CommandDispatcher它在 Svc/Subtopologies/CdhCore/CdhCore.fpp 中定义并暴露了seqCmdBuff接收来自序列器或其他命令源的命令缓冲区与seqCmdStatus返回命令执行状态两个拓扑端口。cmdSeq、wasmSeq的命令输出都汇入CdhCore.Subtopology.seqCmdBuff状态则经由seqCmdStatus返回见 TestDeploymentsProject/Ref/Top/topology.fpp。4.2 Telemetry遥测遥测视图是各组件向TlmChan组件更新遥测通道的连接。CDH TelemetryReference Deployment Telemetry在模式图中telemetry connections instance CdhCore.tlmSend让所有组件实例的遥测端口自动连到tlmSendtlmSend.Run由rateGroup1Comp.RateGroupMemberOut[2]周期性触发CdhCore.Subtopology.tlmSendRun触发后TlmChan按 RefPackets.fppi 中的包定义如CDHid 1、DriveTlmid 3、SigGenSumid 4、SystemRes1id 5 等打包下行。遥测包按组group划分组 1 为 1Hz 高频包、组 2/3 为更低频包。4.3 Logging日志日志视图是各组件向EventManager组件发送事件供记录的连接。CDH LoggingReference Deployment Logging对应模式图为event connections instance CdhCore.events。CdhCore.events暴露eventsRun拓扑端口由rateGroup3Comp.RateGroupMemberOut[7]驱动处理被丢弃事件计数等周期任务事件包经events.PktSendeventsPktSend端口送往通信栈下行文本事件则经textLoggerSvc.PassiveTextLogger在CdhCore子拓扑中实例化为textLogger输出。4.4 Parameters参数参数视图是各组件向PrmDb组件检索和更新参数的连接。CDH Parameters核心 CDH 组件没有任何参数Reference Deployment Parameters对应模式图为param connections instance FileHandling.prmDb。PrmDb位于FileHandling子拓扑中所有组件实例的参数端口都会连接到它。启动时拓扑自动执行参数加载流程见下节loadParameters()PrmDb从存储文件默认为工作目录下的PrmDb.dat读取参数。集成测试 TestDeploymentsProject/Ref/test/int/ref_integration_test.py 中演示了PRM_SAVE_FILE/PRM_LOAD_FILE/PRM_COMMIT_STAGED命令以及沙箱路径校验行为。4.5 Time时间时间视图是各组件获取时间以给事件和遥测打时间戳的连接。CDH TimeReference Deployment Time对应模式图为time connections instance posixTime即所有组件的时间获取端口都接到Svc.PosixTime实例posixTime在 TestDeploymentsProject/Ref/Top/instances.fpp 中定义基址0x10020000从而在 Linux/macOS 上获得墙钟时间戳。4.6 Health健康健康视图是各组件响应Health的 ping 以验证其线程存活的连接。CDH HealthReference Deployment Health健康检查的接线同样由模式图health connections instance CdhCore.$health自动生成。每个被检查的组件实例需要在 TestDeploymentsProject/Ref/Top/RefTopologyDefs.hpp 的PingEntries命名空间中声明WARN/FATAL常量表示“错过几次 ping 后发出 WARNING_HI 事件、总共几次未响应后触发 FATAL”。参考部署中blockDrv、pingRcvr、三个速率组、cmdSeq均为WARN 3, FATAL 5。Health的 ping 条目在CdhCore子拓扑配置阶段通过health.setPingEntries(...)注入见 Svc/Subtopologies/CdhCore/CdhCore.fpp看门狗码为0x123。4.7 Rate Groups速率组速率组视图是各组件以不同速率在参考拓扑中被执行的连接速率组的实际定义在 TestDeploymentsProject/Ref/Top/topology.fpp 的connections RateGroups块中是理解整个部署节拍的关键linuxTimer.CycleOut - rateGroupDriverComp.CycleInLinux 系统定时器Svc.LinuxTimer产生 1Hz 基础节拍RateGroupDriver把 1Hz 分频为三个速率组。分频配置见 TestDeploymentsProject/Ref/Top/RefTopology.cppDividerSet{{1, 0}, {2, 0}, {4, 0}}即rateGroup1 为 1Hz、rateGroup2 为 1/2Hz、rateGroup3 为 1/4Hz偏移均为 0rateGroup11Hz驱动tlmSendRun遥测打包、fileDownlinkRun、systemResources.run、comQueueRun、cmdDispRun命令分发、aggregatorTimeout以及 SG1、SG2 的调度rateGroup21/2Hz驱动cmdSeq.schedIn命令序列器、sendBuffComp.SchedIn、dpDemo.run、fileManagerSchedIn、wasmSeq.checkTimers/writeTelemetry以及 SG3、SG4 的调度rateGroup31/4Hz驱动healthRun、blockDrv.Sched、bufferManagerSchedIn、dpBufferManagerSchedIn、dpWriterSchedIn、dpMgrSchedIn、eventsRun以及 SG5 的调度。每个速率组都有ContextArray上下文数组参考部署中全部置 0见 RefTopology.cpp。Main.cpp通过Ref::startRateGroups(Fw::TimeInterval(1, 0))以 1 秒为间隔启动节拍循环见 TestDeploymentsProject/Ref/Main.cpp。4.8 Ground地面系统地面视图是 CDH 组件从地面系统接收命令、向地面系统发送遥测的连接。参考示例中与地面系统的通信通过 TCP/IP socket 进行从源码可以确认这一点comDriver是Drv.TcpClient实例基址0x10025000见 instances.fpp。拓扑的Communications连接块把comDriver与ComCcsds子拓扑互连comDriver.allocate - commsBufferGetCallee、comDriver.deallocate - commsBufferSendIn上下行缓冲区分配、comDriver.$recv - drvReceiveIn上行、drvSendOut - comDriver.$send下行、comDriver.ready - drvConnected连接就绪信号见 topology.fpp。setupTopology()中只有命令行显式给出-a hostname -p port时才配置并启动 TCP 客户端线程COMM_PRIORITY 34。4.9 Drivers驱动驱动视图是参考组件与示例“驱动”之间收发数据包、以及驱动向RateGroupDriver提供 tick 来循环速率组的连接数据通路在 topology.fpp 的connections Ref块中非常直观sendBuffComp.Data - blockDrv.BufferIn blockDrv.BufferOut - recvBuffComp.Data即SendBuffApp发送缓冲区 →BlockDriver中继 →RecvBuffApp接收构成完整的数据缓冲演示闭环。blockDrv.Sched由 rateGroup3 驱动1/4Hz对应遥测通道blockDrv.BD_Cycles计数每次周期。此外connections Ref还演示了数据产品Data Products的两种缓冲区请求方式SG1与dpDemo既使用同步请求productGetOut - productGetIn也使用异步请求productRequestOut - productRequestInDataProducts子拓扑通过productResponseOut返回缓冲区填充完成后经productSendOut - productSendIn交给DpWriter落盘。5. 拓扑的启动、配置与生命周期参考部署的 C 侧实现展示了 F´ 拓扑生命周期的标准 8 步流程详见 TestDeploymentsProject/Ref/Top/RefTopology.cppinitComponents(state)初始化每个组件setBaseIds()为每个组件实例设置基址偏移connectComponents()按 FPP 定义接线组件项目专属配置configureTopology()regCommands()命令注册必须在配置完成后readParameters()loadParameters()读取并加载参数文件startTasks(state)启动主动组件的任务线程启动非主动组件拥有的任务这里是 TCP 接收线程。其中configureTopology()RefTopology.cpp做了四件关键配置rateGroupDriverComp.configure(rateGroupDivisorsSet)注入分频器{1,0},{2,0},{4,0}三个速率组注入空的上下文数组cmdSeq.allocateBuffer(0, mallocator, 5 * 1024)为命令序列器分配 5 KB 内存以装载序列内容沙箱配置FileHandling::fileUplink.configure(.)、fileDownlink.configure(.)、prmDb.configureSandbox(.)将文件上行、下行与参数数据库的文件访问限制在进程工作目录内——集成测试test_file_uplink_sandbox与test_prm_db_sandbox正是验证“绝对路径逃逸工作目录会被拒绝产生FileOpenError/PrmFileReadError事件”这一安全行为。main()TestDeploymentsProject/Ref/Main.cpp解析命令行参数-a主机名/IP与-p端口号注册SIGINT/SIGTERM信号处理器Ctrl-C 时调用stopRateGroups()优雅退出然后按“setup → startRateGroups(1s) → teardown”的顺序驱动整个程序。6. 构建与运行从源码到可跑二进制参考部署可以直接在 Linux 与 macOS 上构建运行适合在嵌入式硬件就绪前快速体验 F´、验证安装并修改代码。完整步骤见 TestDeploymentsProject/Ref/README.md。前提按 docs/getting-started/installing-fprime.md 安装 F´。构建F´ 底层使用 CMakefprime-util是简化流程的封装# 克隆仓库并进入部署目录 git clone 仓库地址 cd fprime/TestDeploymentsProject # 创建并激活 Python 虚拟环境安装依赖 python3 -m venv fprime-venv . fprime-venv/bin/activate pip install -r ../requirements.txt # 生成构建目录只需一次除非构建目录被删除 fprime-util generate # 为当前系统构建 Ref 二进制 fprime-util build提示fprime-util generate可带工具链参数实现交叉编译例如fprime-util generate raspberrypibuild子命令也可单独构建某个组件。更多用法见 F´ 实用工具文档。运行F´ 自带基于浏览器的测试地面系统 GDS运行 GDS 时会自动启动 Ref 二进制cd fprime/TestDeploymentsProject fprime-gds启动后可在 GDS 的 “Commanding”“Event”“Channels” 标签页观察 F´ 代码的实际运行“Logs” 标签页中的Ref.log保存了 Ref 应用的标准输出。只运行 GDS 不启动 Ref 应用fprime-gds --no-app随后从构建产物目录独立启动 Ref 二进制并指定连接地址与端口cd build-artifacts/platform/bin/ ./Ref -a 127.0.0.1 -p 50000GDS 默认端口为 50000更多选项见fprime-gds --help。地面链路采用 CCSDS 空间包 空间数据链路Space Packet Space Data Link成帧可在 TestDeploymentsProject/Ref/fprime-gds.yml 中看到framing-selection: space-packet-space-data-link配置。7. 集成测试验证参考部署行为参考部署带有一套完整的集成测试位于 TestDeploymentsProject/Ref/test/int/ref_integration_test.py作为 F´ 集成测试的参考样例。它覆盖了以下典型验证场景遥测流streamingtest_is_streaming在 10 秒内断言至少收到 5 条遥测并验证Ref.sendBuffComp.SendState为SEND_IDLE命令收发test_send_command/test_send_command_args使用CdhCore.cmdDisp.CMD_NO_OP与CMD_NO_OP_STRING验证命令发送、分发与事件回执命令有序性test_send_and_assert_no_op连续 100 次发送 NO-OP 命令通过事件序列OpCodeDispatched → NoOpReceived → OpCodeCompleted断言无乱序、无丢失数据通路test_bd_cycles_ascending观察Ref.blockDrv.BD_Cycles遥测随时间严格递增间隔不超过 1.5 秒同时断言rateGroup1Comp.RgCycleSlips周期滑动为 0验证速率组没有丢拍事件过滤test_active_logger_filter通过CdhCore.events.SET_EVENT_FILTER命令禁用/启用COMMAND级别事件验证 EventManager 过滤生效信号波形test_signal_generation对Ref.SG4下发Settings命令参数如[1, 5, 0, SQUARE]与Toggle断言History、PairHistory、Info遥测符合预期序列执行test_seqgen/test_seqgen_complex_args用fprime-seqgen把文本序列test_seq.seq 等编译为二进制序列再通过Ref.cmdSeq.CS_RUN ... BLOCK命令执行系统资源test_system_resources验证内存/非易失存储/CPU 遥测超过最小阈值文件与参数沙箱test_file_uplink_sandbox、test_prm_db_sandbox验证文件上行与参数数据库的文件访问被限制在工作目录内越界路径被拒绝并产生对应错误事件。这些测试均基于 F´ GDS 的 Python 测试框架fprime_test_api配合 TestDeploymentsProject/Ref/test/int/int_config.json 运行是编写自有 F´ 部署集成测试的现成模板。8. Change Log变更记录日期描述6/19/2015初始版本4/20/2017Rel1.9总结ReferenceRef部署是 F´ 框架中“麻雀虽小、五脏俱全”的完整样例它以SendBuffApp → BlockDriver → RecvBuffApp的数据回环为演示主线串联起命令分发、事件记录、遥测通道、参数库、健康检查、速率组驱动、TCP/IP 地面链路、文件上下行与数据产品等全部核心服务并以CdhCore、ComCcsds、FileHandling、DataProducts四个子拓扑实现可复用性。无论是学习 F´ 拓扑的组织方式、搭建第一个部署还是作为新项目 CDH 骨架的起点TestDeploymentsProject/Ref 都是值得逐行研读的参考实现——本文所引用的拓扑定义、实例配置、生命周期代码与集成测试都可以在仓库中直接打开继续深入。【免费下载链接】fprimeF´ - A flight software and embedded systems framework项目地址: https://gitcode.com/GitHub_Trending/fpr/fprime创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考