ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

F´ 参数服务端口深度解析:Fw::PrmGet / Fw::PrmSet 的接口契约、状态语义与 PrmDb 集成实战

F´ 参数服务端口深度解析:Fw::PrmGet / Fw::PrmSet 的接口契约、状态语义与 PrmDb 集成实战 F´ 参数服务端口深度解析Fw::PrmGet / Fw::PrmSet 的接口契约、状态语义与 PrmDb 集成实战【免费下载链接】fprimeF´ - A flight software and embedded systems framework项目地址: https://gitcode.com/gh_mirrors/fp/fprime导读本篇技术指南围绕 F´F Prime飞行软件框架中负责参数存取的端口接口Fw::PrmGet与Fw::PrmSet展开讲解其端口契约、返回值语义、序列化缓冲类型以及它们在参数数据库组件Svc::PrmDb中的真实调用链。读完本文你将掌握如何在 F´ 组件中声明、连接并实现参数读取/更新端口理解ParamValid状态枚举的完整流转逻辑并能结合源码与测试用例确认每个接口的行为边界。Fw::PrmGet 端口图Fw::PrmSet 端口图一、端口职责参数读写的基本契约在 F´ 中参数Parameter是可在飞行过程中或地面端动态调整的系统配置值而参数的存取并不由组件直接操作存储介质而是通过两个标准端口抽象出来Fw::PrmGet用于从存储中读取一个参数值。调用方传入参数 IDFwPrmIdType和一个用于承载返回值的缓冲对象端口调用结束后返回一个表示取值有效性的状态值。依据 Fw/Prm/Prm.fpp其签名如下 Port for getting a parameter port PrmGet( $id: FwPrmIdType Parameter ID ref val: ParamBuffer Buffer containing serialized parameter value ) - ParamValidFw::PrmSet用于更新参数值。调用方传入参数 ID 和一个携带新值的缓冲对象由端口对侧的处理逻辑负责落库或广播无返回值 Port for setting a parameter port PrmSet( $id: FwPrmIdType Parameter ID ref val: ParamBuffer Buffer containing serialized parameter value )两个端口都定义在module Fw命名空间下Fw/Prm/Prm.fpp。PrmGet是有返回值的输出端口PrmSet是无返回值端口前者用于请求后者用于下发更新二者共同构成 F´ 参数子系统的读写两面。二、返回值状态ParamValid 枚举的完整语义Fw::PrmGet端口调用后返回ParamValid类型。该类型在 FPP 中定义为一个枚举其四个取值承载了组件侧完整的参数生命周期判断逻辑Fw/Prm/Prm.fpp值数值描述UNINIT0仅用于组件内部表示参数尚未初始化即从未调用过loadParameters()VALID1端口调用返回参数已成功从存储中取回缓冲中为有效序列化数据INVALID2端口调用返回未能从存储中取回参数如 ID 不存在DEFAULT3仅用于组件内部表示端口返回了INVALID因此使用了参数声明时指定的默认值从枚举数值看UNINIT和DEFAULT这两个状态不会由端口调用本身返回而是组件内部依据端口返回结果VALID/INVALID与自身初始化进度推导出的中间状态。这一点在 Fw/Prm/changed-symbols.txt 的历史符号对照中也可以印证早期的 C 全局枚举常量Fw::PARAM_UNINIT、Fw::PARAM_VALID、Fw::PARAM_INVALID、Fw::PARAM_DEFAULT在 FPP 迁移后统一改为Fw::ParamValid::UNINIT、Fw::ParamValid::VALID等带作用域的枚举成员代码语义未变但命名空间更规范。三、Fw::PrmBuffer承载序列化参数值的缓冲类型Fw::PrmBuffer是这两个端口共享的数据载体用于存放序列化后的参数值字节流。它的实现在 Fw/Prm/PrmBuffer.hpp 与 Fw/Prm/PrmBuffer.cpp 中继承自Fw::SerializeBufferBase内部维护一个固定大小的字节数组enum { SERIALIZED_TYPE_ID FW_TYPEID_PRM_BUFF, SERIALIZED_SIZE FW_PARAM_BUFFER_MAX_SIZE sizeof(FwBuffSizeType) }; // ... U8 m_bufferData[FW_PARAM_BUFFER_MAX_SIZE]; // command argument buffer由源码可知Fw/Prm/PrmBuffer.hppSERIALIZED_SIZE由FW_PARAM_BUFFER_MAX_SIZE加上一个FwBuffSizeType的长度字段构成即序列化结果自带长度前缀方便网络/存储传输后反序列化getBuffCapacity()返回底层数组容量sizeof(m_bufferData)getBuffAddr()提供读写底层地址的接口构造函数从外部字节串拷贝数据时SerializeBufferBase::setBuff若返回非FW_SERIALIZE_OK会触发FW_ASSERTFw/Prm/PrmBuffer.cpp即非法尺寸在构造期即被断言拦截。缓冲的最大尺寸由配置文件控制。在 config/FpConfig.h 中// Specifies the size of the buffer that contains the serialized parameter value. #ifndef FW_PARAM_BUFFER_MAX_SIZE #define FW_PARAM_BUFFER_MAX_SIZE (FW_COM_BUFFER_MAX_SIZE - sizeof(FwPrmIdType) - sizeof(FwPacketDescriptorType)) #endif // Specifies the maximum size of a string in a parameter #ifndef FW_PARAM_STRING_MAX_SIZE #define FW_PARAM_STRING_MAX_SIZE 40 //! Max size of parameter string type #endif即参数缓冲容量 命令/遥测通用缓冲容量减去参数 ID 与包描述符所占字节数参数内嵌字符串默认最大 40 字节。二者均可用宏在编译期覆盖#ifndef保护适配不同平台的存储约束。此外 Fw/Prm/PrmBuffer.hpp 中有一条静态断言保证FW_PARAM_BUFFER_MAX_SIZE足以容纳最大参数字符串的完整缓冲含长度字段从编译期杜绝参数缓冲装不下参数字符串的隐患。配套的字符串类型为Fw::ParamStringFw/Prm/PrmString.hpp其STRING_SIZE FW_PARAM_STRING_MAX_SIZESERIALIZED_TYPE_ID FW_TYPEID_PRM_STR专用于在参数缓冲中序列化字符串型参数。四、源码中的真实调用链Svc::PrmDb 的实现印证Fw::PrmGet/Fw::PrmSet端口在框架中最典型的落地实现是参数数据库组件Svc::PrmDb。该组件在 Svc/PrmDb/PrmDb.fpp 中直接声明了这两个端口guarded input port getPrm: Fw.PrmGet async input port setPrm: Fw.PrmSet注意两者的端口类型差异getPrm是guarded互斥保护、同步执行输入端口setPrm是async异步入队执行输入端口。这与读写语义天然匹配——读操作需要立即拿到返回值写操作可以异步落库。在 Svc/PrmDb/docs/sdd.md 的组件设计文档中也明确记录了两端口均以Fw::PrmGet/Fw::PrmSet为标准定义并注明getPrm为同步、setPrm为异步。getPrm_handler的实现展示了完整的查找逻辑Svc/PrmDb/PrmDbImpl.cpp遍历内部数据库条目表m_db[entry]逐个比对used标记与id命中则把存储的val拷贝进调用方缓冲并返回Fw::ParamValid::VALID未命中则返回Fw::ParamValid::INVALID同时通过log_WARNING_LO_PrmIdNotFound(id)发出警告事件。这与设计文档中PARAM_INVALID 表示未能从存储成功取回参数的语义完全一致。单元测试 Svc/PrmDb/test/ut/PrmDbImplTester.cpp 也用EXPECT_EQ(Fw::ParamValid::INVALID, this-invoke_to_getPrm(0, 0x1000, pBuff).e)验证了查询不存在的参数 ID 返回 INVALID这一行为边界。五、参数状态的完整流转从初始化到默认值综合端口契约与组件实现可以梳理出组件侧参数状态的典型流转路径未初始化阶段组件尚未调用loadParameters()时内部状态保持UNINIT正常读取调用Fw::PrmGet端口存储侧命中 → 返回VALID组件使用取回值读取失败存储侧未命中 → 返回INVALID此时组件若为该参数声明了默认值则回退到默认值并将内部状态记为DEFAULT更新路径地面或上层组件通过Fw::PrmSet端口下发新值存储侧更新数据库条目后续PrmGet调用即可读到新值。这种端口只返回 VALID/INVALID组件内部自行推导 UNINIT/DEFAULT的设计将存储实现细节与业务逻辑解耦——存储可以是内存表如 PrmDb、文件如 PrmDb.dat或网络远端组件侧代码无需改动。六、扩展阅读与版本演进参数存取端口的正式设计文档即本文对应的 Fw/Prm/docs/sdd.md其中记录了 2015-06-23 的初始版本两个端口的核心契约至今未变端口的 FPP 权威定义见 Fw/Prm/Prm.fpp参数类型声明type ParamBuffer位于文件头部参数缓冲实现与静态断言见 Fw/Prm/PrmBuffer.hpp / Fw/Prm/PrmBuffer.cpp缓冲区容量与字符串长度宏定义见 config/FpConfig.h最完整的端口使用实例是 Svc/PrmDb 组件及其文档 Svc/PrmDb/docs/sdd.md、单元测试 Svc/PrmDb/test/ut/PrmDbImplTester.cpp若需在自定义组件中声明参数端口只需在组件 FPP 描述中引入Fw.PrmGet/Fw.PrmSet端口实例并在拓扑中连接到 PrmDb 组件的getPrm/setPrm输入端口即可复用完整的参数服务能力。【免费下载链接】fprimeF´ - A flight software and embedded systems framework项目地址: https://gitcode.com/gh_mirrors/fp/fprime创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表