
F´ 中的 Svc::Ping 端口活动组件健康探测与心跳应答机制详解【免费下载链接】fprimeF´ - A flight software and embedded systems framework项目地址: https://gitcode.com/GitHub_Trending/fpr/fprimeSvc::Ping是 F´F Prime飞行软件与嵌入式系统框架中用于**探测活动组件是否仍然响应、是否发生挂起hang**的标准端口类型。本文以 Svc::Ping 设计文档 为核心结合 Ping.fpp 端口定义、Health 健康监控组件 及其实现源码系统讲解该端口的定义、请求-应答协议、key 校验机制、超时判定原理以及如何在业务组件中落地实现。读完本文你将掌握在 F´ 拓扑中接入 Ping 端口、实现 ping 应答处理器并理解健康检查超时行为的完整方法。1. Svc::Ping 端口概述Svc::Ping端口在 F´ 框架中承担一个非常聚焦的职责向活动组件发送探测消息并要求其在指定超时时间内回传约定的 key 值以此验证组件的事件循环、队列调度与任务线程仍然健康运行。在 F´ 的端口体系中Ping 属于请求-应答request-response模式的成对端口请求方向健康检查方通过 Ping 输出端口向被检查组件发送探测应答方向被检查组件在收到探测后通过自身线程执行处理器并将 key 原样返回。该端口定义在Svc模块中源码位置为 Svc/Ping/Ping.fpp配套设计文档为 Svc/Ping/docs/sdd.md。2. 端口定义与参数说明2.1 FPP 端口定义Svc::Ping是一个极其精简的端口其完整 FPP 定义如下Ping.fppmodule Svc { Port for pinging active components port Ping( key: U32 Value to return to pinger ) }从定义可以看出Ping 端口只携带一个参数参数类型说明keyU3232 位无符号整数活动组件必须原样返回的键值key参数的设计意图非常明确它充当请求-应答配对的标识符。探测方在发送 ping 时附带一个递增的 key应答方必须在处理器中把该 key 作为应答参数回传探测方据此区分当前响应对应的是哪一次探测并校验应答是否真实、是否与当前未决的 ping 匹配。2.2 序列化类型根据 Svc::Ping 设计文档 第 2.1.2 节该端口未定义任何可序列化类型Serializables。整个端口的载荷就是单个U32标量因此在系统字典、串行化处理与代码生成上都保持极简。3. 端口关系图Svc::Ping端口的请求-应答关系如下图所示Svc/Ping/docs/img/PingBDD.jpg图中展示了 Ping 端口在系统中的应用模式一个健康监控组件持有多个 Ping 输出端口PingSend向若干活动组件发起探测同时持有对应的 Ping 输入端口PingReturn接收应答每个被监控的活动组件则实现一个 Ping 输入端口并在其处理器中将 key 通过 Ping 输出端口回传。4. 工作机制心跳探测协议4.1 探测发起系统中的一个健康检查组件如Svc::Health使用一组 Ping 端口向活动组件发送消息。探测以周期驱动的方式进行健康组件每次被调度Run/Sched端口被调用时就遍历其维护的 ping 表对当前没有未决探测的条目发起一次新的 ping并将 key 递增后随 ping 一起发送。以 Health 组件实现 的Run_handler为例HealthComponentImpl.cpp// If clear entry if (0 this-m_pingTrackerEntries[entry].cycleCount) { // start a ping this-m_pingTrackerEntries[entry].key this-m_key; // send ping this-PingSend_out(static_castFwIndexType(entry), this-m_pingTrackerEntries[entry].key); // increment key this-m_key; // increment cycles for the entry this-m_pingTrackerEntries[entry].cycleCount; }可以看到key 就是健康组件私有的单调递增计数器每次发起探测都会自增对应 HealthComponentImpl.hpp 中的U32 m_key成员。4.2 应答与 key 校验活动组件被要求在其自身线程上执行 Ping 端口处理器。处理器被调用时必须把收到的key参数原样作为 Ping 输出端口的参数返回。健康组件通过PingReturn输入端口接收应答并对 key 进行校验HealthComponentImpl.cppvoid HealthImpl::PingReturn_handler(const FwIndexType portNum, U32 key) { // verify the key value if (key ! this-m_pingTrackerEntries[portNum].key) { Fw::LogStringArg _arg this-m_pingTrackerEntries[portNum].entry.entryName; this-log_FATAL_HLTH_PING_WRONG_KEY(_arg, key); } else { // reset the counter and clear the key this-m_pingTrackerEntries[portNum].cycleCount 0; this-m_pingTrackerEntries[portNum].key 0; } }校验结果分两种路径key 匹配说明应答有效将该条目的周期计数器归零、清除 key该条目进入“空闲”状态等待下一轮探测key 不匹配说明应答方返回了错误的键值可能组件逻辑异常健康组件上报HLTH_PING_WRONG_KEYFATAL 事件事件定义见 Health.fpp。4.3 端口配对约束在 F´ 中PingSend 与 PingReturn 必须一一配对这一点通过 FPP 的match语句在 Health.fpp 中显式声明 Ping output port output port PingSend: [HealthPingPorts] Svc.Ping Ping return port async input port PingReturn: [HealthPingPorts] Svc.Ping Run port sync input port Run: Svc.Sched Run port output port WdogStroke: Svc.WatchDog # ... ... match PingSend with PingReturnmatch PingSend with PingReturn确保同一数组下标上的发送端口与接收端口对应同一个被监控组件从而可以通过端口号portNum索引跟踪表条目。5. 在活动组件中实现 Ping 应答任何希望被健康监控的活动组件都需要提供一个 Ping 输入端口并在处理器中把 key 回传。仓库中的 Ref::BlockDriver 是一个最简范例。其 FPP 端口声明BlockDriver.fppasync input port PingIn: Svc.Ping drop output port PingOut: Svc.Ping其 C 处理器实现BlockDriver.cppvoid BlockDriver::PingIn_handler(const FwIndexType portNum, U32 key) { // call ping output port this-PingOut_out(0, key); }这个回环loopback实现完美演示了“应答方职责”的全部内容读取输入 key → 原样写入输出端口。真实业务组件可以在此基础上执行任意轻量自检逻辑但核心约束是必须在自身线程内尽快完成应答因为应答的及时性本身就是被监控组件“未挂起”的证明。6. 超时判定WARN 与 FATAL 两级阈值Ping 协议的超时并不基于墙钟时间而是基于调度周期数。每个被监控条目配置两个阈值HealthComponentImpl.hpp 中的PingEntry结构字段含义warnCycles触发 WARNING 事件的周期数到达该值时上报告警并更新遥测fatalCycles触发 FATAL 事件的周期数到达该值时判定组件无响应entryName条目名称用于事件与命令定位实际超时时间 周期数 × 调度周期。例如调度周期为 100ms、fatalCycles 10则 FATAL 超时约为 1 秒。因此Ping 的超时精度取决于Run/Sched端口的调度速率见 Svc::Health 设计文档 第 3.2.1 节。超时判定逻辑位于Run_handler的循环分支HealthComponentImpl.cpp} else { // check for FATAL timeout value first: warnCycles fatalCycles is a legal // configuration, and the FATAL takes precedence over the warning if (this-m_pingTrackerEntries[entry].entry.fatalCycles this-m_pingTrackerEntries[entry].cycleCount) { Fw::LogStringArg _arg this-m_pingTrackerEntries[entry].entry.entryName; this-log_FATAL_HLTH_PING_LATE(_arg); } else if (this-m_pingTrackerEntries[entry].cycleCount this-m_pingTrackerEntries[entry].entry.warnCycles) { Fw::LogStringArg _arg this-m_pingTrackerEntries[entry].entry.entryName; this-log_WARNING_HI_HLTH_PING_WARN(_arg); this-tlmWrite_PingLateWarnings(this-m_warnings); } // if at warning or fatal threshold this-m_pingTrackerEntries[entry].cycleCount; }关键实现细节FATAL 优先于 WARNwarnCycles fatalCycles是合法的配置即只报 FATAL 不报 WARN因此先比较 fatal 再比较 warnWARN 事件HLTH_PING_WARNseverity 为 warning high同时累加并写入遥测通道PingLateWarnings定义于 Health.fppFATAL 事件HLTH_PING_LATEseverity 为 fatal表示任务线程不再响应未决期间不重复 ping只要某个条目仍有未决探测cycleCount ! 0就不会再向它发起新的 ping避免探测风暴。7. 运行时的监控管理Ping 监控的启用/禁用与阈值调整都可以通过命令在运行时完成这些命令由健康组件提供定义见 Health.fpp命令作用关键参数HLTH_ENABLE整体启用/禁用健康检查enable: Fw.EnabledHLTH_PING_ENABLE针对某个条目启用/禁用 pingentry: string(40)、enable: Fw.EnabledHLTH_CHNG_PING修改某个条目的 WARN/FATAL 阈值entry: string(40)、warningValue: U32、fatalValue: U32阈值修改存在合法性校验HLTH_CHNG_PING要求warningValue fatalValue否则上报HLTH_PING_INVALID_VALUES警告事件并返回VALIDATION_ERROR命令响应见 HealthComponentImpl.cpp。需要特别注意的是根据 Svc::Health 设计文档 第 3.2.1 节的说明这些运行时的监控更新阈值修改、启用状态不会在软件复位后持久保存复位后恢复为启动时通过setPingEntries()配置的初始值。此外健康组件在每次Run调用末尾还会对看门狗端口进行喂养HealthComponentImpl.cpp// stroke watchdog. if (this-isConnected_WdogStroke_OutputPort(0)) { this-WdogStroke_out(0, this-m_watchDogCode); }只要健康检查自身逻辑持续运行看门狗就会被持续触发一旦健康组件线程本身挂起看门狗将因停止收到心跳而触发外部复位——这构成了系统级故障兜底。8. 测试与验证Ping 端口的协议行为通过 Health 组件的单元测试得到系统性验证测试代码位于 Svc/Health/test/ut/HealthTester.cpp 与 Svc/Health/test/ut/HealthTester.hpp。根据 Svc::Health 设计文档 的单元测试章节验证场景覆盖标称遥测测试多轮调度后对每个条目正常回传 key确认无事件、无遥测产生对应需求 HTH-001警告遥测测试不回传应答验证计数器递减与 WARN 事件、遥测的产生HTH-002故障遥测测试持续不回传直至触发 FATAL 事件HTH-003启用/禁用测试验证整体及单条目的启用/禁用行为HTH-004、HTH-005阈值更新测试通过HLTH_CHNG_PING修改阈值并验证按新阈值触发事件HTH-006看门狗测试验证所有 ping 应答正常时看门狗端口持续输出HTH-007。此外BlockDriver 的单元测试中也包含 ping 回环测试BlockDriverTestMain.cpp验证PingIn → PingOut的 key 原样回传行为。单元测试覆盖率可通过fprime-util check --coverage查看。9. 变更记录根据 Svc::Ping 设计文档 的变更日志日期说明2016/1/5初始版本该端口自引入以来保持接口稳定key: U32的单参数设计延续至今体现了其在框架接口设计中小而稳定的特点。10. 总结Svc::Ping端口是 F´ 健康监控体系的基石它以单个U32key 参数承载了探测—应答—校验—超时判定的完整闭环配合 Svc::Health 组件的周期驱动调度、两级超时阈值WARN/FATAL、运行时命令管理与看门狗喂养为飞行软件中的活动组件提供了轻量而可靠的存活证明机制。在实际工程中接入该端口只需两步在目标组件的 FPP 中声明Svc.Ping输入端口并在处理器中原样回传 key然后在拓扑中将健康组件的PingSend/PingReturn与该组件配对即可。【免费下载链接】fprimeF´ - A flight software and embedded systems framework项目地址: https://gitcode.com/GitHub_Trending/fpr/fprime创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考