拓冰建站拓冰建站
首页 / 资讯中心 / 正文

F´ 参考部署中的 RecvBuffApp 组件:数据缓冲接收、校验与遥测机制全解析

嵌入式系统编程【免费下载链接】fprimeF´ - A flight software and embedded systems framework项目地址https://gitcode.com/gh_mirrors/fp/fprime点击查看免费下载导读Ref::RecvBuffApp是 F´F Prime飞行软件与嵌入式系统框架参考部署Ref中用于演示数据缓冲Data Buffer接收链路的被动组件。它接收来自Ref::SendBuffApp组件发送的Drv.DataBuffer执行反序列化、校验和checksum检测与统计上报并通过事件、遥测和参数机制把处理结果暴露给整个系统。读完本文你将掌握该组件在 Ref/Top/topology.fpp 中的连接方式、RecvBuffApp.fpp定义的端口/事件/参数/遥测模型以及RecvBuffComponentImpl.cpp中完整的接收处理与错误注入检测逻辑。Ref::RecvBuffApp 组件框图1. 组件定位与设计目标在 F´ 参考部署中Ref::RecvBuffApp与Ref::SendBuffApp构成一对缓冲收发演示组件发送方周期性构造并发出数据缓冲接收方负责接收并验证。依据官方 SDDsdd.md该组件需要满足两条需求需求编号需求描述验证方法ISF-SBF-001Ref::RecvBuffApp组件应能接收缓冲buffers系统测试ISF-SBF-002Ref::RecvBuffApp组件应能检测接收缓冲中的错误系统测试对应地发送方 SendBuffApp/docs/sdd.md 承担发送缓冲ISF-RBF-001与提供错误注入能力ISF-RBF-002两条需求二者共同构成一条完整的发送—接收—校验演示链路用于验证 F´ 框架下数据缓冲端口Drv.DataBuffer的跨组件传递能力。从源码结构看RecvBuff被建模为passive被动组件它没有自己的队列与线程处理完全由输入端口上的同步调用驱动。这一设计选择意味着它只能被主动方如BlockDriver的接收任务驱动不能自主发起处理。2. 组件接口模型从 FPP 到实现组件模型定义位于 RecvBuffApp.fpp采用 F´ 的 FPPF Prime Prime语言描述。RecvBuff的端口、事件、参数与遥测项如下。2.1 端口定义端口类型端口名称方向/说明sync input port Data: Drv.DataBufferData数据缓冲同步输入端口接收Drv.DataBuffercommand recv port CmdDispCmdDisp命令接收端口command reg port CmdRegCmdReg命令注册端口command resp port CmdStatusCmdStatus命令响应端口event port LogLog事件输出端口text event port LogTextLogText文本事件输出端口time get port TimeTime时间获取端口telemetry port TlmTlm遥测输出端口param get port ParamGetParamGet参数读取端口param set port ParamSetParamSet参数设置端口其中Data端口是组件的数据入口其余均为 F´ 组件通用的标准端口命令、事件、遥测、时间、参数用于将组件接入参考部署的公共基础设施。该接口集合与 docs/img/RecvBuffBDD.jpg 中的组件框图一致。2.2 自定义类型PacketRecvStatus与PacketStatFPP 模型中定义了两个辅助类型用于表达接收统计状态枚举PacketRecvStatusPACKET_STATE_NO_PACKETS 0尚未收到任何缓冲PACKET_STATE_OK 1接收状态正常PACKET_STATE_ERRORS 3接收方已检测到错误。结构体PacketStatBuffRecv: U32已接收缓冲数量BuffErr: U32接收出错的缓冲数量PacketStatus: PacketRecvStatus当前包接收状态。该结构体随后被直接用作遥测通道PktState的载荷类型实现一条遥测承载多个统计字段的聚合上报。2.3 事件Events| 事件名称 | ID | 严重级别 | 格式串 | | -------- | -- | -------- | ------ | |FirstPacketReceived($id: U32)| 0 | activity low |First packet ID {} received| |PacketChecksumError($id: U32)| 1 | warning high |Packet ID {} had checksum error| |BuffRecvParameterUpdated($id: U32)| 2 | activity low |BuffRecv Parameter {} was updated|FirstPacketReceived收到第一个包时上报作为链路建立成功的标志PacketChecksumError校验和不匹配时上报级别为warning high用于快速暴露数据损坏BuffRecvParameterUpdated参数被更新时上报与参数回读遥测配合形成闭环。2.4 参数Parameters参数名类型默认值参数 ID设置 opcode保存 opcodeparameter1U3210001parameter2I1611123这两个参数属于测试参数用于演示 F´ 的参数获取、设置、保存与回读遥测流程并不参与实际的数据校验逻辑。2.5 遥测Telemetry| 遥测项 | 类型 | ID | 说明 | | ------ | ---- | -- | ---- | |PktState|Ref.PacketStat| 0 | 包统计接收数/错误数/状态 | |Sensor1|F32| 1 | 传感器 1 值格式{.2f}V| |Sensor2|F32| 2 | 传感器 2 值 | |Parameter1|U32| 3 | 参数 1 回读update on change| |Parameter2|I16| 4 | 参数 2 回读update on change带高/低告警阈值 |Parameter2的遥测定义还声明了告警limits区间用于演示 F´ 遥测系统的限值告警能力低侧yellow -1、orange -2、red -3高侧yellow 1、orange 2、red 3。Sensor1/Sensor2在接收处理中被模拟递增见下文用于演示接收驱动遥测更新的典型模式。3. 接收处理实现反序列化、校验和检测与统计组件实现位于 RecvBuffComponentImpl.hpp 与 RecvBuffComponentImpl.cpp核心是Data_handler。它由基类RecvBuffComponentBase由 FPP 自动生成见头文件第 4 行的 include声明是Data输入端口被调用时执行的同步回调。RecvBuffImpl维护的私有状态包括m_statsRef::PacketStat聚合统计m_buffsReceivedU32已接收缓冲计数m_errBuffsU32出错缓冲计数m_firstBuffReceivedbool是否已收到首个缓冲m_sensor1/m_sensor2F32模拟传感器值。构造函数将这些状态初始化为零值并将PacketStatus置为PACKET_STATE_NO_PACKETSRecvBuffComponentImpl.cpp。3.1 数据处理流程Data_handlerRecvBuffComponentImpl.cpp按以下步骤处理每个到达的缓冲计数递增m_buffsReceived并写入m_stats.BuffRecv重置反序列化游标调用buff.resetDeser()确保从缓冲头开始解析反序列化包 ID读取U32 id并用FW_ASSERT断言反序列化成功Fw::FW_SERIALIZE_OK反序列化数据区读取 24 字节的testData反序列化校验和读取U32 csum首包事件若m_firstBuffReceived为假则发送log_ACTIVITY_LO_FirstPacketReceived(id)将状态置为PACKET_STATE_OK并置位标志校验和计算对 24 字节数据逐字节求和得到sum校验和比较若sum ! csum则递增m_errBuffs、写入m_stats.BuffErr、发送log_WARNING_HI_PacketChecksumError(id)并将状态置为PACKET_STATE_ERRORS模拟传感器更新m_sensor1 5.0、m_sensor2 1.2遥测上报调用tlmWrite_Sensor1、tlmWrite_Sensor2、tlmWrite_PktState三个通道写入方法。由此可见错误检测需求 ISF-SBF-002通过对数据区逐字节求和的简易校验和算法实现发送方写入同样的求和值接收方重新计算并比对。一旦数据在传输途中被破坏求和结果即不匹配组件便会触发高优先级警告事件并累计错误计数。3.2 参数更新回调parameterUpdated(FwPrmIdType id)RecvBuffComponentImpl.cpp在参数被外部修改时被调用对PARAMID_PARAMETER1读取新值并写入遥测tlmWrite_Parameter1对PARAMID_PARAMETER2读取新值并写入遥测tlmWrite_Parameter2其它 ID触发FW_ASSERT(0, id)防止非法参数 ID。任何参数更新都会先发送log_ACTIVITY_LO_BuffRecvParameterUpdated(id)事件使参数变更可被观测。4. 发送方与拓扑连接完整链路如何打通接收组件必须放在正确的拓扑里才能动起来。在 Ref/Top/instances.fpp 中recvBuffComp以base id 0x4700被实例化发送方sendBuffComp以base id 0x2600实例化。两者的数据连接定义在 Ref/Top/topology.fpp 中rateGroup2Comp.RateGroupMemberOut[1] - sendBuffComp.SchedIn sendBuffComp.Data - blockDrv.BufferIn blockDrv.BufferOut - recvBuffComp.Data链路工作方式如下驱动发送rateGroup2Comp的速率组槽位 1 周期调用sendBuffComp.SchedIn构造与发送SendBuffImpl::SchedIn_handler在收到调度后若处于发送状态则重置m_testBuff序列化游标依次序列化包 ID、24 字节数据填充0xFF、校验和最后经Data_out(0, m_testBuff)发出缓冲传递缓冲经sendBuffComp.Data - blockDrv.BufferIn送入BlockDriver再由blockDrv.BufferOut - recvBuffComp.Data回灌给接收组件接收校验recvBuffComp.Data触发RecvBuffImpl::Data_handler执行第 3 节描述的完整校验流程。4.1 发送方的错误注入配合需求 ISF-SBF-002 的验证依赖于发送方的错误注入能力。SendBuffApp.fpp定义了SB_INJECT_PKT_ERROR命令opcode 1对应实现中SendBuffComponentImpl.cpp会在下次发送时将testData[5]置 0从而破坏数据区并使其与预先计算的校验和不一致——这样接收端RecvBuffImpl便会检测到错误、递增BuffErr并上报PacketChecksumError事件。系统测试正是通过注入错误→观察接收端事件与遥测来完成 ISF-SBF-002 的闭环验证。4.2 遥测打包与地面观测Ref/Top/RefPackets.xml 将接收组件的全部遥测通道纳入下行包channel namerecvBuffComp.PktState/ channel namerecvBuffComp.Sensor1/ channel namerecvBuffComp.Sensor2/ channel namerecvBuffComp.Parameter1/ channel namerecvBuffComp.Parameter2/配合sendBuffComp的PacketsSent、NumErrorsInjected等通道地面系统可同时观测发送方与接收方的统计值直接对比发送数—错误数—接收状态。5. 构建、运行与观测5.1 构建集成CMakeLists.txt 将组件纳入 F´ 的模块化构建体系set(SOURCE_FILES ${CMAKE_CURRENT_LIST_DIR}/RecvBuffApp.fpp ${CMAKE_CURRENT_LIST_DIR}/RecvBuffComponentImpl.cpp ) set(MOD_DEPS Os Fw/Cmd) register_fprime_module()RecvBuffApp.fpp会驱动 F´ 自动编码器生成组件骨架RecvBuffComponentAc.*及 FPP 定义的枚举/结构体代码依赖模块为Os与Fw/Cmd类型别名 RecvBuff.hpp 将RecvBuffImpl重命名为RecvBuff供拓扑和地面工具引用。5.2 运行观测要点在参考部署中运行后可通过以下途径验证链路发送SB_START_PKTS命令后sendBuffComp.PacketsSent随速率组周期递增接收端recvBuffComp.PktState.BuffRecv同步增长发送SB_INJECT_PKT_ERROR命令后recvBuffComp.PktState.BuffErr递增同时产生PacketChecksumError警告事件recvBuffComp.Sensor1/Sensor2每个接收周期分别 5.0/1.2可用以确认接收处理被持续驱动修改parameter1/parameter2后BuffRecvParameterUpdated事件与对应回读遥测update on change将反映新值。6. 关键源码索引关注点位置组件 SDDRef/RecvBuffApp/docs/sdd.md组件框图Ref/RecvBuffApp/docs/img/RecvBuffBDD.jpgFPP 组件模型Ref/RecvBuffApp/RecvBuffApp.fpp实现头文件Ref/RecvBuffApp/RecvBuffComponentImpl.hpp实现源文件Ref/RecvBuffApp/RecvBuffComponentImpl.cpp类型别名Ref/RecvBuffApp/RecvBuff.hpp构建脚本Ref/RecvBuffApp/CMakeLists.txt发送方 SDDRef/SendBuffApp/docs/sdd.md发送方 FPP 模型Ref/SendBuffApp/SendBuffApp.fpp发送方实现Ref/SendBuffApp/SendBuffComponentImpl.cpp拓扑实例化Ref/Top/instances.fpp拓扑连接Ref/Top/topology.fpp遥测打包Ref/Top/RefPackets.xml7. 变更记录日期说明4/20/2017初始版本赞分享嵌入式系统编程【免费下载链接】fprimeF´ - A flight software and embedded systems framework项目地址https://gitcode.com/gh_mirrors/fp/fprime点击查看免费下载相关推荐F´ 框架 Ref 部署中的 RecvBuffApp 数据缓冲接收组件详解F´ 框架 Ref 部署中的 RecvBuffApp 数据缓冲接收组件详解 Ref::RecvBuffApp 是 F´F Prime飞行软件与嵌入式系统框架嵌入式系统编程Encore项目中的遥测数据收集机制解析Encore项目中的遥测数据收集机制解析 什么是遥测数据 在软件开发领域遥测 Telemetry 是指系统自动收集并传输使用数据的技术。Encore项目通过收后端开发工具云原生微服务F´ 框架 Ref 部署演示组件剖析SendBuffApp 缓冲区发送与错误注入机制F´ 框架 Ref 部署演示组件剖析SendBuffApp 缓冲区发送与错误注入机制 Ref::SendBuffApp 是 F´F Prime飞行软件框架嵌入式系统编程上一篇vscode-git-graph快捷键大全提升Git操作效率的10个技巧下一篇exp4j Java表达式求值库完全指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门