尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

F´(F Prime)飞行软件框架中的 Svc::WatchDog 端口:原理、FPP 定义与在健康检查(Health)组件中的应用

F´(F Prime)飞行软件框架中的 Svc::WatchDog 端口:原理、FPP 定义与在健康检查(Health)组件中的应用 F´F Prime飞行软件框架中的 Svc::WatchDog 端口原理、FPP 定义与在健康检查Health组件中的应用【免费下载链接】fprimeF´ - A flight software and embedded systems framework项目地址: https://gitcode.com/GitHub_Trending/fpr/fprimeSvc::WatchDog 是 F´F Prime飞行软件与嵌入式系统框架中用于“喂狗”stroking a watchdog timer的核心端口健康检查组件Svc::Health在每个调度周期通过它向系统看门狗定时器发送喂狗码以此表明系统仍然响应、未发生挂死hang。本文基于 Svc/WatchDog/docs/sdd.md 展开结合 WatchDog.fpp 的端口定义与 Health 组件的实现完整讲解该端口的接口契约、设计动机、参数语义及其在真实拓扑中的调用链帮助你理解并正确使用这一看门狗机制。Svc::WatchDog 端口框图1. 端口概述IntroductionSvc::WatchDog端口用于向激活组件active components发送“心跳”信号从而验证系统内的激活组件仍然可响应、没有挂起。其端口注释在源码中写得很直白Port for stroking a watchdog timer用于刷新看门狗定时器的端口见 Svc/WatchDog/WatchDog.fpp。在实际飞行软件中“组件未响应”往往是灾难性的某个激活组件因死锁、无限循环或任务栈溢出而挂死会导致整个任务链停止推进。Svc::WatchDog端口就是这类健康监控体系的出口——它负责把“我还活着”的信号送给外部的看门狗硬件或监控实体一旦信号缺失外部看门狗可以复位系统或触发安全处置。需要特别指出的是Svc::WatchDog端口本身并不承担故障检测逻辑它只是一个单向的喂狗输出接口真正判断“谁还活着、谁已挂死”的是配套的 Svc::Ping 端口与Svc::Health健康检查组件。两者配合构成了 F´ 中的“Ping 喂狗”健康监控闭环这一点在下一节展开。2. 设计Design2.1 工作机制Ping 应答 周期喂狗根据 Svc/WatchDog/docs/sdd.md 的设计说明系统中的健康检查组件Health持有一组 Ping 输出端口向各激活组件周期发送 Ping 消息激活组件必须在一个超时窗口内把端口参数key中携带的值原样应答回来。Health 组件据此判断每个目标是否仍然响应。而Svc::WatchDog端口承担的角色是“看门狗刷新”Health 组件在完成一轮 Ping 检查之后通过WdogStroke输出端口向外发送一次喂狗码watchdog stroke code。只要健康检查逻辑仍在按周期运行喂狗信号就会持续产生反之若 Health 组件自身也挂死或调度中断喂狗停止外部看门狗便会被触发。这一机制可以从 Svc/Health/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其中WdogStroke: Svc.WatchDog即Svc::WatchDog端口在 Health 组件中的实例化名称match PingSend with PingReturn声明了 Ping 发送与返回端口的配对关系。2.2 端口参数Svc::WatchDog端口只有一个参数ArgumentTypeDescriptioncodeU32Code for the watchdog reset看门狗复位/喂狗码该参数在 WatchDog.fpp 中的完整定义与注释为 Port for stroking a watchdog timer port WatchDog( code: U32 Watchdog stroke code )其中code是一个 32 位无符号整数的喂狗码。从实际实现看Health 组件内部维护一个喂狗码成员m_watchDogCode每次喂狗时将该值原样传给端口对于外部看门狗而言这个码既可以用于校验喂狗序列的正确性防止误触发也可以被忽略、仅当作固定占位值使用具体取决于系统接入的看门狗实现。2.3 串行化SerializablesSvc::WatchDog端口不定义任何序列化类型Serializables文档中明确标注 “There are no serializables defined in the port”。其唯一的U32参数直接通过 FPP 自动生成的端口调用机制传递无需额外的数据结构定义。3. 在 Health 组件中的真实调用链要真正理解Svc::WatchDog端口如何使用最直接的方式是阅读它的消费方——Svc::Health组件实现 Svc/Health/HealthComponentImpl.cpp。在每个调度周期Run端口被触发中Health 组件会依次执行 Ping 检查逻辑然后在周期末尾执行喂狗// health check for each ping entry ... // (遍历各 Ping 目标判断是否超时、是否应答错误 key) // stroke watchdog. if (this-isConnected_WdogStroke_OutputPort(0)) { this-WdogStroke_out(0, this-m_watchDogCode); }见 Svc/Health/HealthComponentImpl.cpp#L131-L134。这段实现透露了三个关键点喂狗发生在健康检查周期末尾只要Run周期持续驱动 Health 组件喂狗信号就会随之持续产生因此喂狗本身也间接验证了 Health 组件与整个调度链的健康状态。端口连接检查调用前通过isConnected_WdogStroke_OutputPort(0)判断端口是否已连接未连接时静默跳过避免在未装配看门狗的系统上产生无效调用。喂狗码来源喂狗码为成员变量m_watchDogCodeU32在每轮喂狗中原样发出体现 “stroke code” 的语义。同时注意Ping 检查自身的超时判定如warnCycles警告阈值、fatalCycles致命阈值见 Svc/Health/Health.fpp 中HLTH_PING_WARN、HLTH_PING_LATE、HLTH_PING_WRONG_KEY等事件与喂狗是相互独立的两条路径Ping 负责“发现”挂死的组件WatchDog 负责“报告”整体心跳。3.1 Health 组件中的完整端口角色分工从 Health.fpp 可以梳理出 WatchDog 端口在健康监控体系中的位置PingSend输出Svc.Ping向被监控的激活组件发起 Ping携带递增的keyPingReturn输入Svc.Ping接收激活组件应答的key用于校验其是否仍响应WdogStroke输出Svc.WatchDog周期喂狗通知外部看门狗系统仍健康。Health 组件还提供命令HLTH_ENABLE、HLTH_PING_ENABLE、HLTH_CHNG_PING用于动态启停健康检查、启停单个 Ping 条目、调整警告/致命超时阈值配合事件与遥测如PingLateWarnings形成一套完整的可运维健康监控能力。这些命令与事件均定义于 Svc/Health/Health.fpp。Health 健康检查组件端口关系图3.2 典型的系统拓扑接线方式在实际 F´ 拓扑中例如参考部署 TestDeploymentsProject/Ref 中的健康监控接线Svc::WatchDog端口通常由以下方式之一消费连接到一个看门狗驱动组件如外部硬件看门狗定时器的驱动将code值写入硬件寄存器完成喂狗连接到一个监控/遥测组件把喂狗事件作为系统存活指示上报在未装配看门狗硬件的开发/测试平台上可以保持该端口悬空——Health 组件已通过isConnected_WdogStroke_OutputPort做了容错处理。由于Svc::WatchDog与 Svc::Ping 都是单向简单端口接线时只需将 Health 的WdogStroke输出端口与目标组件的 WatchDog 输入端口一一对应即可端口名WatchDog即作为连接标识。4. 构建集成CMakeSvc::WatchDog端口作为一个独立的 F´ 模块随源码树分发其构建配置见 Svc/WatchDog/CMakeLists.txtregister_fprime_module( AUTOCODER_INPUTS ${CMAKE_CURRENT_LIST_DIR}/WatchDog.fpp DEPENDS Fw_Port )要点说明AUTOCODER_INPUTS指向 WatchDog.fpp由 FPP 自动代码生成器autocoder在构建时生成端口的 C 调用接口如WatchDog_out、isConnected_WatchDog_OutputPort等DEPENDS声明对Fw_Port的依赖即端口基础设施Fw::Port基类体系见 Fw/Port在使用该端口时只需在组件 FPP 中声明output port或input port并正确接线随后将相关模块加入 CMake 构建即可无需手写任何端口胶水代码。5. 变更日志Change Log原文档记录的修订历史如下DateDescription1/25/2016Initial Version初始版本Svc::WatchDog端口的接口自初始版本以来保持稳定单个U32 code参数、无序列化类型的契约一直延续至今这保证了基于该端口的拓扑设计与驱动实现具有良好的向后兼容性。6. 小结何时使用 Svc::WatchDog使用场景系统需要向外部看门狗硬件或软件监控实体周期上报“系统存活”信号且该信号应由健康检查逻辑统一驱动搭配使用与Svc::Ping、Svc::Health组件配合形成“Ping 检测组件响应 WatchDog 上报整体心跳”的双层健康监控参数语义code为喂狗码由调用方如 Health 的m_watchDogCode决定具体取值外部看门狗可据此校验喂狗序列实现成本端口仅含一个 U32 参数无序列化类型接线与使用极为轻量且 Health 组件对未连接端口做了容错即使暂未接入真实看门狗也不会影响系统运行。如需进一步阅读可参考端口定义源码 Svc/WatchDog/WatchDog.fpp、消费方实现 Svc/Health/HealthComponentImpl.cpp 及其组件定义 Svc/Health/Health.fpp以及配套的 Svc::Ping 端口文档。【免费下载链接】fprimeF´ - A flight software and embedded systems framework项目地址: https://gitcode.com/GitHub_Trending/fpr/fprime创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表