
F´ 中的 CCSDS AOS 解帧器Svc::Ccsds::AosDeframer 深入解析与配置指南【免费下载链接】fprimeF´ - A flight software and embedded systems framework项目地址: https://gitcode.com/GitHub_Trending/fpr/fprime导读Svc::Ccsds::AosDeframer是 F´F Prime飞行软件框架中针对 CCSDS AOS Space Data Link ProtocolCCSDS 732.0-B-5标准实现的解帧Deframing组件。它是 F´ 上行链路uplink数据栈的接收端核心部件接收上游Svc::FrameAccumulator或通信适配器送来的定长 AOS 传输帧从帧数据域M_PDU中提取完整的数据包并通过输出端口逐包向下游通常为Svc::Ccsds::SpacePacketDeframer或路由器分发。读完本文你将掌握该组件的协议支持范围、configure()配置方法、端口接线方式、事件与遥测含义以及从源码与单元测试出发的底层工作机理能够在自己的 F´ 拓扑中正确部署并定位问题。AOS 解帧能力协议支持范围AosDeframer遵循 CCSDS 732.0-B-5 第 5 版规范实现了 AOS SDL 的一个明确子集。依据 组件 SDD 与 FPP 定义该文件顶部注释同样标注了标准版本支持项如下单一虚拟信道NumVcs 1通过configure()函数指定唯一可接受的虚拟信道VCM_PDUMultiplexing PDU数据域服务支持数据包跨多个帧的拼接与重组spanning packets可选的帧错误控制字段FECF校验按规范 4.1.6 节执行 16 位 CRC 校验空间数据包协议SPP与封装数据包协议EPP提取分别依据 CCSDS 133.0-B-2 与 CCSDS 133.1-B-3通过 Packet-Version-NumberPVN掩码按位独立启用空闲帧与空闲包丢弃VC 帧计数连续性检查与间隙检测gap detection。明确不支持的特性包括Space Data Link SecuritySDLS安全服务、传输帧插入域Transfer Frame Insert Zone、以及帧头错误控制字段Frame Header Error Control Field。在 F´ 的 CCSDS 组件族中SDLS 相关功能由 CcsdsSdlsDeframer、AesGcmDecryptor 等独立组件承担。从模块归属看AosDeframer与 AosFramer 是收发对称的一对AosFramer负责把包封装进 AOS 帧下行/遥测方向AosDeframer负责把帧还原成包上行/指令方向。其 FPP 组件定义 中声明为passive component即被动组件解帧逻辑全部由dataIn输入端口触发无需独立线程。内部工作机理从帧到包解帧的主处理流程从 dataIn_handler 实现 开始可概括为以下步骤。1. 帧长与 FECF 校验若接收缓冲区大小小于配置的fixedFrameSize直接报InvalidFrameLength事件、通过errorNotify通知、并把帧缓冲区经dataReturnOut归还发送方若启用了 FECF调用validateFecf()实现见 AosDeframer.cpp对帧前fixedFrameSize - 2字节用Ccsds::Utils::CRC16::compute计算 CRC与帧尾 trailer 中收到的 FECF 比对失败即丢弃该帧并累计CrcErrorCount遥测。2. 帧头解析与校验parseAndValidateHeaderparseAndValidateHeader 按规范 4.1.2 节逐字段解析 AOS 主帧头任一失败都会触发对应事件与errorNotify并返回nullptr使该帧被丢弃Transfer Frame Version NumberTFVNAOS 取二进制01Tfvn::AOS不匹配报InvalidTfvnSpacecraft ID10 位由globalVcId低 8 位与 signaling 字段高 2 位拼接得到与配置值不匹配报InvalidSpacecraftIdVirtual Channel ID6 位在已配置 VC 集合当前仅一个中查找找不到报InvalidVcIdVC 帧计数默认 24 位若使用了帧计数循环frame count cycle见规范 4.1.2.5.3会把 4 位循环计数扩展到第 24~27 位。自该 VC 第一帧被接受后若接收计数 ! (上一计数 1) frameCountMask则报VcFrameCountGap、通过errorNotify通知并主动放弃当前正在重组的跨帧包abandonSpanningPacket。从源码结构看AosDeframerVc结构体AosDeframer.hpp保留了每 VC 的framesProcessed、packetsExtracted、vcFrameCount计数以及跨帧包重组状态其设计刻意镜像了AosFramer::AosVc模式为将来扩展多 VC 支持预留了结构。3. M_PDU 数据域提取extractPacketsextractPackets 先解析 M_PDU 头的 First Header PointerFHP规范 4.1.4.2.2 节据此确定数据域内包边界FHP 0x7FE空闲数据标识FHP_IDLE_DATA_ONLY整帧只有空闲数据报IdleFrame事件后返回FHP 0x7FF无包起始FHP_NO_PACKET_START整个数据域是上一包的延续数据追加到跨帧重组缓冲区FHP dataZoneSize指针越界不可信输入报InvalidFhp并放弃进行中的跨帧包其余情况FHP 之前是上一包的延续数据若有跨帧包则先appendToSpanningPacket随后从 FHP 处开始循环提取一个个新包。4. 跨帧包的重组与缓冲生命周期当一个包超过单帧数据域容量时解帧器需要跨多帧累积。关键实现是 appendToSpanningPacket其工作方式非常讲究先入静态头缓冲在确定包总大小之前最多HEADER_BUF_SIZE 8字节EPP 最大头长度先暂存于 VC 结构体内的静态headerBuf再动态分配一旦通过sizePacket()确定包大小立即经allocate端口Fw.BufferGet向 BufferManager 申请整包缓冲区将已累积的头字节拷入继续从帧中填充剩余数据完成即输出当bytesReceived buffer.getSize()时把完整包连同上下文经dataOut发出PacketsExtracted遥测 1并清空状态失败即放弃若allocate失败或分配尺寸不足报SpanningPacketAllocFailed并跳过该包若因帧计数间隙、FHP 越界等原因无法完成报SpanningPacketAbandoned事件中带有已收/应收字节数便于诊断。包大小的判定由 sizePacket 依据首字节高 3 位PVN分派SPPPVN0sizeSppPacket 解析 6 字节空间包主头按规范 4.1.3.5.2 由packetDataLength 1计算总长APID 为0x7FFComCfg::Apid::SPP_IDLE_PACKET见 default/config/ComCfg.fpp时判定为空闲包表示本帧最后一个包EPPPVN7sizeEppPacket 依据 133.1-B-3 解析可变的 length-of-length0/1/2/3/4处理扩展字节与保留字段并对 32 位目标上可能出现的整数溢出做了静态与运行时双重防护protocolId Idle时同样视为本帧结束其余 PVN 值在编译期断言拒绝FW_ASSERT(false)因为configure()只允许启用 SPP 与/或 EPP。5. 缓冲所有权管理所有权流转是 F´ 数据链路的经典模式帧缓冲上游经dataIn送入后无论成败最终都经dataReturnOut归还发送方见 dataIn_handler跨帧包缓冲由解帧器通过allocate端口取得发出给下游后下游使用完毕经dataReturnIn送回dataReturnIn_handler 统一调用deallocate归还 BufferManager中途放弃的跨帧包缓冲也由解帧器自己释放。配置configure() 详解configure()必须在处理任何帧之前调用。完整签名见 AosDeframer.hppdeframer.configure( fixedFrameSize, // 定长 AOS 帧大小字节规范 Section 4.1.1 frameErrorControlField, // 帧尾是否携带 FECF规范 Section 4.1.6 spacecraftId, // 可接受的 10 位航天器 ID默认ComCfg::SpacecraftId vcId, // 可接受的 6 位虚拟信道 ID默认0 pvnMask // 要提取的 PVN 位掩码默认同时启用 SPP 与 EPP );configure 实现 内的校验与副作用如下参数类型默认值约束FW_ASSERT违反即断言失败fixedFrameSizeU32ComCfg::AosMaxFrameFixedSize必须 ComCfg::AosMaxFrameFixedSize默认配置为 1536 字节见 default/config/ComCfg.fpp必须大于AOSHeader(6) M_PDUHeader(2) (FECF? AOSTrailer(2):0)的最小值frameErrorControlFieldbooltrue构造函数默认AosDeframer.cpp无spacecraftIdU16ComCfg::SpacecraftId默认0x0044必须满足(spacecraftId 0xFC00) 010 位有效vcIdU80必须满足(vcId 0xC0) 06 位有效pvnMaskU8PvnBitfield::SPP_MASK \| PvnBitfield::EPP_MASK必须至少置位一个有效位且不能含有有效位之外的位VALID_MASK此外configure()还会断言allocate与deallocate输出端口已连接——因为跨帧包重组依赖动态缓冲分配未接线即调用会在配置阶段直接暴露问题。调用结束后会重置 FECF 错误计数与各 VC 统计并清理未完成的跨帧包状态因此可安全地重复调用。默认常量可在 default/config/ComCfg.fpp 中查看SpacecraftId 0x0044、AosMaxFrameFixedSize 1536。工程部署时应在此配置文件中按任务实际参数调整。注意该文件中的TmFrameFixedSize 1024针对的是 TM遥测帧AOS 帧尺寸以AosMaxFrameFixedSize为准。端口描述组件端口在 AosDeframer.fpp 中声明SDD 汇总如下Kind端口名端口类型说明guarded inputdataInSvc.ComDataWithContext接收已定帧的 AOS 数据对应 CCSDS 3.4.3.2 节VC_RECEIVE.indication服务原语outputdataOutSvc.ComDataWithContext输出提取出的数据包携带上下文outputdataReturnOutSvc.ComDataWithContext将收到的帧缓冲所有权归还发送方sync inputdataReturnInSvc.ComDataWithContext接收下游归还的数据包缓冲所有权outputerrorNotifyCcsds.ErrorNotify向连接的组件通知解帧错误outputallocateFw.BufferGet为跨多帧的数据包分配缓冲区outputdeallocateFw.BufferSend释放跨帧包缓冲区除业务端口外FPP 定义 还声明了 F´ 标准 AC 端口timeCaller取时间、logTextOut/logOut事件文本与事件下行、tlmOut遥测下行、prmGetOut/prmSetOut参数读写。上下文类型ComCfg::FrameContextdefault/config/ComCfg.fpp在组件间传递comQueueIndex、apid、sequenceFlags/Count、vcId、pvn、saIndex、firstHeaderPointer等字段其中pvn正是由本组件在跨帧包生命周期内维护的。典型接线上游Svc::FrameAccumulator或直接是TcpServer/Udp等通信适配器→dataIndataOut→Svc::Ccsds::SpacePacketDeframer或路由器allocate/deallocate→Svc::BufferManagererrorNotify→ 错误监测组件。解帧器自身作为DeframerInterface的 AOS 实现与 TcDeframer、SpacePacketDeframer 处于同一抽象层次形成可替换的解帧组件族。事件Events下表事件定义在 AosDeframerEvents.fppi格式串中的字段可辅助排障事件严重级别触发条件InvalidSpacecraftIdwarning low帧 SCID 与配置不符事件携带收到的值与配置值InvalidFrameLengthwarning high帧长度与配置的定长不符携带实际/期望长度InvalidVcIdactivity low帧 VCID 不在可接受集合中InvalidFecfwarning highFECFCRC校验失败携带帧尾值与板载计算值InvalidTfvnwarning high传输帧版本号非法携带收到的与期望的 TFVNDisabledPvnwarning high包版本号无效或被配置掩码禁用携带 VC 与 PVNIdleFrameactivity low帧仅含空闲数据SpanningPacketAllocFailedwarning high跨帧包缓冲分配失败包被丢弃携带 VC、PVN、请求字节数VcFrameCountGapwarning highVC 帧计数序列出现不连续携带收到值与期望的下一个值SpanningPacketAbandonedwarning high跨帧包在完成前被放弃携带已收/应收字节数InvalidFhpwarning highFirst Header Pointer 超出数据域大小遥测Telemetry遥测通道定义在 AosDeframerTelem.fppi可用于监控链路健康状况通道类型说明LatestVcFrameCountU32最近一次从帧头收到的 VC 帧计数FramesProcessedU32每个虚拟信道已处理的帧数PacketsExtractedU32每个虚拟信道已提取的包数CrcErrorCountU32FECFCRC错误数按物理信道统计与 VC 无关从实现看CrcErrorCount是组件级的独立成员m_crcErrorCountAosDeframer.hpp因为 FECF 属于物理信道层面的保护注释明确其按物理信道而非 VC 计数其余三项为每 VC 状态AosDeframerVc内成员当前NumVcs 1时二者等价。实践中建议用FramesProcessed与PacketsExtracted的差值辅助判断是否存在持续无法提取的帧用VcFrameCountGap事件与CrcErrorCount联动定位上行链路误码或丢帧。单元测试佐证组件测试位于 Svc/Ccsds/AosDeframer/test/ut其中的 AosDeframerTestSupport.cpp 展示了手工构造 AOS 帧的完整套路可作为理解帧布局与自测工具开发的参考assembleFrameBuffer()按位构造 6 字节 AOS 主头TFVN 2 位 | SCID 低 8 位 | VCID 6 位 24 位 VC 帧计数 signaling 字段、2 字节 M_PDU 头FHP、数据区与可选 FECF trailer并用Ccsds::Utils::CRC16计算帧尾 CRCcreateSppPacket()构造 SPP 包PVN0、APID、序列号、长度createEppPacket()构造 EPP 包含 Idle 填充包、各种 length-of-length 变体from_allocate_handler模拟 BufferManager支持注入m_failNextAlloc以测试SpanningPacketAllocFailed路径configureDefault()使用TEST_FRAME_SIZE、ComCfg::SpacecraftId、VC 0 以及 SPP|EPP 掩码作为基准配置印证了configure()的典型调用形态。测试辅助代码还揭示了一个实用细节数据域剩余空间不足时用 EPP Idle 填充包protocolId0, lengthOfLength0补齐避免将零字节误判为合法 SPP 包——这与生产实现中 Idle 包丢弃逻辑sizeSppPacket/sizeEppPacket返回 0完全对应。部署建议与限制综合文档与源码部署AosDeframer时需要注意以下几点先配置后使用configure()必须早于任何dataIn调用且allocate/deallocate端口必须先接线否则断言失败定长帧前提AOS 是定长帧协议上游FrameAccumulator 或协议适配器必须保证交到dataIn的是完整定长帧本组件只负责长度与 CRC 校验不做帧同步单 VC 限制当前NumVcs 1若任务需要多虚拟信道需要等待或自行扩展getVcStruct与m_vcs数组源码中已留 TODO 与AosDeframerVc结构;PVN 掩码选择默认同时启用 SPP 与 EPP若链路上只有一种协议可收窄掩码以降低误判与DisabledPvn事件噪声缓冲容量规划跨帧包的最大尺寸受allocate端口所接 BufferManager 的容量约束需按最坏情况如最大 EPP/SPP 包规划缓冲池避免SpanningPacketAllocFailed反复出现。【免费下载链接】fprimeF´ - A flight software and embedded systems framework项目地址: https://gitcode.com/GitHub_Trending/fpr/fprime创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考