首页/新闻资讯/正文详情

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

发布时间:2026/9/24 13:37:57 来源:云帆数科 栏目:资讯中心
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),仅供参考

相关推荐

thumbor 亮度调节滤镜 brightness 完全指南:参数详解、URL 用法与逐像素实现原理
thumbor 亮度调节滤镜 brightness 完全指南:参数详解、URL 用法与逐像素实现原理

后端图像处理 【免费下载链接】thumbor thumbor is an open-source photo thumbnail service by globo.com 项目地址: https://gitcode.com/gh_mirrors/th/thumbor 点击查看 免费下载 thumbor 是一个开源的照片缩略图服务,内置了一套可串联的滤镜&#… · 2026/9/24 13:37:57

Salt State Modules 完全参考指南:132 个内置状态模块的目录、用法与编写原理
Salt State Modules 完全参考指南:132 个内置状态模块的目录、用法与编写原理

运维配置管理后端 【免费下载链接】salt Software to automate the management and configuration of infrastructure and applications at scale. 项目地址: https://gitcode.com/gh_mirrors/sa/salt 点击查看 免费下载 导读 本文以 Salt 官方文档的 State Syste… · 2026/9/24 13:37:57

SpringBoot+Vue画师约稿平台管理系统全栈开发实战
SpringBoot+Vue画师约稿平台管理系统全栈开发实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 13:37:51

十人锁步,一人拖累全场
十人锁步,一人拖累全场

内部测试第 4 天,QA 提了一个 P0。 标题只有七个字:“一个人卡,全场卡。” 复现步骤更简单: 1. 开一局 5v5 2. 把其中【任意一台】测试机的网络设为 400ms 延迟 3. 观察其余 9 台结果: 被限速的那台 : 逻辑帧率 3.2 … · 2026/9/24 14:08:17

PyMuPDF 可选内容(OCG / OCMD)完全指南:在 PDF 中实现图层显示与隐藏的编程控制
PyMuPDF 可选内容(OCG / OCMD)完全指南:在 PDF 中实现图层显示与隐藏的编程控制

图像处理 【免费下载链接】PyMuPDF PyMuPDF is a high performance Python library for data extraction, analysis, conversion & manipulation of PDF (and other) documents. 项目地址: https://gitcode.com/gh_mirrors/py/PyMuPDF 点击查看 免费下载 本篇指… · 2026/9/24 14:08:17

BP神经网络自适应PID控制器设计与嵌入式实现
BP神经网络自适应PID控制器设计与嵌入式实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 14:08:11

嵌入式系统启动流程对比
嵌入式系统启动流程对比

裸机启动流程 “裸机”指直接运行在硬件上的程序(无操作系统,通常是MCU/单片机),启动流程极简: 硬件复位 上电/复位后,CPU强制从固定启动地址(如0x00000000)读取指令(该… · 2026/9/24 14:08:11

计算机毕业设计之基于Spring Boot 企业crm系统的设计与实现
计算机毕业设计之基于Spring Boot 企业crm系统的设计与实现

随着网络科技的不断发展以及人们经济水平的逐步提高,网络技术如今已成为人们生活中不可缺少的一部分,而信息管理系统是通过计算机技术,针对用户需求开发与设计,该技术尤其在各行业领域发挥了巨大的作用,相比于以前的传… · 2026/9/24 14:08:11

【Dv3admin】下拉API接口传多个值到form
【Dv3admin】下拉API接口传多个值到form

表单操作中常见需求之一是在下拉选择时同步传递和处理多个字段,提升数据验证和业务逻辑的便捷性。实际开发环境下,数据交互常涉及到多项信息同步写入,直接影响业务流程的顺畅与正确。 本文介绍一种在下拉选择学生信息时,如何一次性将学号和姓名等多个参数同时写入表单,实… · 2026/9/24 14:08:11

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13

1D-CNN时间序列建模实战:从Conv1d原理到工业落地
1D-CNN时间序列建模实战:从Conv1d原理到工业落地

简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26

柔软的L:汉语语流中被忽视的舌肌张力控制
柔软的L:汉语语流中被忽视的舌肌张力控制

1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码