F´ ComSplitter 组件解析:Com 缓冲流的分发实现、构建目标与单元测试
嵌入式系统编程【免费下载链接】fprimeF´ - A flight software and embedded systems framework项目地址https://gitcode.com/gh_mirrors/fp/fprime点击查看免费下载本文以 F´F Prime飞行软件框架中Svc::ComSplitter组件Svc/ComSplitter/README.md为核心讲解其如何将一路 Com 输入端口上的通信缓冲流复制分发到多路输出端口并完整梳理该组件目录的redo构建目标、源码实现与单元测试验证。读完本文你将掌握 ComSplitter 的端口模型、分发语义、连接策略以及如何通过 F´ 的 CMake/UT 体系构建与测试该组件。ComSplitter 组件定位与端口模型ComSplitter 是 F´ 框架中的一个 passive被动组件功能单一而明确把一个 Com 缓冲流拆分split并转发到多个下游消费者。其 FPP 定义位于 Svc/ComSplitter/ComSplitter.fppmodule Svc { A component for splitting a Com buffer stream passive component ComSplitter { Com input port sync input port comIn: Fw.Com Com output port output port comOut: [5] Fw.Com } }端口模型由两部分组成comIn同步输入端口单实例类型为Fw.Com。这是一个sync input port意味着comIn_handler在调用者的执行上下文中同步执行ComSplitter 自身不引入线程或队列。comOut输出端口数组容量固定为5每个输出端口同样是Fw.Com类型。输出端口数组使得组件可以同时连接多个下游接收者例如多个遥测下行链路、日志记录器或通信栈。Fw.Com端口本身定义在 Fw/Com/Com.fppmodule Fw { type ComBuffer Port for passing communication packet buffers port Com( ref data: ComBuffer Buffer containing packet data context: U32 Call context value; meaning chosen by user ) }也就是说每次通过comIn传入的是一个Fw::ComBuffer引用含context上下文值ComSplitter 收到后会把该缓冲内容原样复制并分发给所有已连接的comOut输出端口。从源码结构看Svc/ComSplitter/ComSplitter.hppSvc::ComSplitter类继承自自动生成的ComSplitterComponentBase构造函数接收组件名init(instance)用于按实例号初始化组件私有成员comIn_handler是唯一的业务处理入口并声明了ComSplitterComponentBaseFriend作为白盒测试友元类。分发语义逐端口复制转发核心分发逻辑集中在 Svc/ComSplitter/ComSplitter.cpp 的comIn_handler实现中void ComSplitter :: comIn_handler( NATIVE_INT_TYPE portNum, Fw::ComBuffer data, U32 context ) { FW_ASSERT(portNum 0); NATIVE_INT_TYPE numPorts getNum_comOut_OutputPorts(); FW_ASSERT(numPorts 0); for(NATIVE_INT_TYPE i 0; i numPorts; i) { if( isConnected_comOut_OutputPort(i) ) { // Need to make a copy because we are passing by reference!: Fw::ComBuffer dataToSend data; comOut_out(i, dataToSend, 0); } } }其执行流程可拆解为四步入参断言FW_ASSERT(portNum 0)确认调用来自唯一的输入端口 0。端口数检查通过getNum_comOut_OutputPorts()获取输出端口数组容量并断言大于 0此处恒为 5。逐端口遍历对每个输出端口 i 调用isConnected_comOut_OutputPort(i)判断是否已连接。未连接的输出端口会被静默跳过这是 ComSplitter 支持部分连接的关键设计——上层只需连接实际需要的下游数量。复制转发对已连接的端口注释明确说明了原因——data是以引用方式传入的而comOut_out也会以引用传递因此必须显式构造一份Fw::ComBuffer dataToSend data副本再通过comOut_out(i, dataToSend, 0)发送避免多个下游拿到同一引用造成数据竞争或意外修改。值得注意的是发送时传入的context固定为0且每次转发都是独立副本因此每个下游消费者看到的都是完整、独立的缓冲数据互不影响。构建目录的 redo 目标继承自原 README组件目录下的 README.md 记录了该目录基于redo构建系统的可用目标。主目标Main targets目标作用Dictionary生成Dictionary目录内含供 ISF Ground Support EquipmentGSE使用的字典Docs生成Docs目录内含 ISF 风格的组件文档Interface生成Interface目录内含组件接口定义NCSL生成NCSL目录内含非注释源代码行数non-commented source lines of code统计README重新生成这份README文件Template生成Template目录内含 ISF 组件模板all构建Build/$TARGET/$MODE/lib.a组件库TARGET与MODE为环境变量clean清理本目录及其子目录的构建产物refresh从Model重新生成ComSplitterComponentAi.xmlall目标的参数约定TARGET可选值为 Darwin、Linux、PI、CORTEX160未设置时默认使用本机环境Darwin 或 LinuxMODE可选值为 Unit、Integration、Flight未设置时默认 Unit。注意refresh目标中提到的ComSplitterComponentAi.xml属于该组件的历史ISF 时代描述文件在当前仓库中已由 ComSplitter.fpp 取代。辅助目标Helper targets仅在开发或调试构建系统时直接调用目标作用Table生成Table目录包含 ISF XML 中未体现的表接口部分default.a构建Build/target/mode/lib.a组件库default.ncsl.txt生成 NCSL 统计文件default.o构建形如Build/target/mode/path/file.o的目标文件path可为空现代 CMake 构建与单元测试仓库现状当前 F´ 已迁移到 CMake 构建体系ComSplitter 的构建配置位于 Svc/ComSplitter/CMakeLists.txt通过register_fprime_module()注册模块将ComSplitter.fpp自动生成端口与组件骨架代码与ComSplitter.cpp手工实现一起编译单元测试部分则通过register_fprime_ut()注册测试源为ComSplitter.fpp、test/ut/ComSplitterTester.cpp与test/ut/ComSplitterMain.cpp。该模块同时被顶层 Svc/CMakeLists.txt 纳入 Svc 库的模块清单。单元测试采用 F´ 的 GTest 测试框架Fw/Test/UnitTest.hpp、gtest/gtest.h。Svc/ComSplitter/test/ut/ComSplitterTester.cpp 中的test_nominal()验证了核心分发行为构造 4 字节测试数据{0xde,0xad,0xbe,0xef}循环 3 次修改首字节后依次从comIn注入端口连接采用部分连接策略connectPorts()中只连接 5 个comOut输出端口中的3 个for (i 0; i 3; i)注入 3 帧后断言from_comOut历史总数为93 帧 × 3 个已连接端口并逐条比对每次转发的内容与原始缓冲逐字节一致memcmp校验长度与内容。这一测试恰好印证了源码中的跳过未连接端口逻辑若 5 个端口全部连接则历史应为 15 条。测试入口 Svc/ComSplitter/test/ut/ComSplitterMain.cpp 通过TEST(TestNominal, Nominal)运行上述用例VxWorks 目标除外。典型使用场景结合端口模型与分发语义ComSplitter 在 F´ 拓扑中适用于以下场景均为仓库源码可支撑的推断性描述一对多广播将同一路遥测/指令数据流同时送往下行链路、日志系统等多个消费者数据流分路在通信栈中把上游单一数据源分发给多个并行处理或记录模块拓扑解耦借助未连接端口自动跳过的特性同一组件实例可在不同部署中按需连接 15 个下游而无需修改组件本身。若需要更多输出路数可参照 FPP 定义按需调整comOut数组容量当前为 5并重新运行自动编码流程生成对应代码。小结ComSplitter 是 F´ 框架中一个简洁而实用的被动组件以comIn为单输入、comOut[5]为多输出通过逐端口复制Fw::ComBuffer实现缓冲流的一对多分发。其源码ComSplitter.cpp、FPP 定义ComSplitter.fpp与单元测试ComSplitterTester.cpp三者相互印证构成完整的定义—实现—验证闭环目录 README 中记录的redo目标则保留了该组件在 ISF 构建体系下的历史工作流可作为理解 F´ 构建演进背景的参考。赞分享嵌入式系统编程【免费下载链接】fprimeF´ - A flight software and embedded systems framework项目地址https://gitcode.com/gh_mirrors/fp/fprime点击查看免费下载相关推荐F´F PrimeComSplitter 组件详解Com 缓冲区流分发与多路复制F´F PrimeComSplitter 组件详解Com 缓冲区流分发与多路复制 F´F Prime是一个面向飞行软件与嵌入式系统的组件化框架。 Sv嵌入式系统编程F´ 组件代码生成器单元测试实战指南FppTest/component 测试套件解析与 fprime-util 构建运行流程F´ 组件代码生成器单元测试实战指南FppTest/component 测试套件解析与 fprime util 构建运行流程 本指南以 F´F Prime嵌入式系统编程F´ (F Prime) DpManager 组件基于规则的单元测试Abstract State、规则组与随机场景解析F´ F Prime DpManager 组件基于规则的单元测试Abstract State、规则组与随机场景解析 导读 本文以 Svc/DpManager/嵌入式系统编程上一篇如何使用Linux Optimizer自动化优化你的Linux服务器新手入门教程下一篇Qwik-UI贡献者教程如何为开源组件库提交你的第一个PR创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

vscode-copilot-chat 中 Anthropic SDK 升级实战指南:从版本核对到编译修复与回归测试的完整流程

vscode-copilot-chat 中 Anthropic SDK 升级实战指南:从版本核对到编译修复与回归测试的完整流程

人工智能AI 应用AI Agent代码智能体交互助手工具调用MCP Clients 【免费下载链接】vscode-copilot-chat Copilot Chat extension for VS Code 项目地址: https://gitcode.com/gh_mirrors/vs/vscode-copilot-chat 点击查看 免费下载 本指南基于 vscode-copilot-chat…

2026/9/24 15:34:49 阅读更多 →
GitHubDesktop2Chinese高阶技巧:正则捕获组+第三参数动态替换,让映射不怕版本更新

GitHubDesktop2Chinese高阶技巧:正则捕获组+第三参数动态替换,让映射不怕版本更新

GitHubDesktop2Chinese高阶技巧:正则捕获组第三参数动态替换,让映射不怕版本更新 【免费下载链接】GitHubDesktop2Chinese GithubDesktop语言本地化(汉化)工具 【GitHub桌面客户端中文汉化】 项目地址: https://gitcode.com/gh_mirrors/gi/GitHubDeskt…

2026/9/24 15:34:49 阅读更多 →
(全新整理)上市公司-杠杆操纵程度数据(2003-2024年)本数据包含原始数据、参考文献、代码、最终结果。

(全新整理)上市公司-杠杆操纵程度数据(2003-2024年)本数据包含原始数据、参考文献、代码、最终结果。

文章目录资料下载地址介绍01、数据简介02、相关数据03、数据截图项目备注资料下载地址资料下载地址 点击这里下载资料 介绍 01、数据简介 参考许晓芳和陆正飞等做法计算企业杠杆操纵程度,包含以下六个指标结果,指标值越大企业杠杆操纵程度越大&#…

2026/9/24 15:33:49 阅读更多 →

最新新闻

从预览页到课本PDF:tchMaterial-parser 批量下载国家中小学智慧教育平台电子课本

从预览页到课本PDF:tchMaterial-parser 批量下载国家中小学智慧教育平台电子课本

从预览页到课本PDF:tchMaterial-parser 批量下载国家中小学智慧教育平台电子课本 【免费下载链接】tchMaterial-parser 国家中小学智慧教育平台 电子课本下载工具,帮助您从智慧教育平台中获取电子课本的 PDF 文件网址并进行下载,让您更方便地…

2026/9/24 16:20:25 阅读更多 →
palera1n 越狱工具完整指南:适用设备、操作步骤与故障恢复

palera1n 越狱工具完整指南:适用设备、操作步骤与故障恢复

palera1n 越狱工具完整指南:适用设备、操作步骤与故障恢复 【免费下载链接】palera1n Jailbreak for A8 through A11, T2 devices, on iOS/iPadOS/tvOS 15.0, bridgeOS 5.0 and higher. 项目地址: https://gitcode.com/GitHub_Trending/pa/palera1n palera1n…

2026/9/24 16:20:25 阅读更多 →
在 AI 应用中构建 Stack Trace 错误展示组件:ai-elements StackTrace 组件实战指南

在 AI 应用中构建 Stack Trace 错误展示组件:ai-elements StackTrace 组件实战指南

后端前端CRM人工智能AI Agent 【免费下载链接】crm Comp AI CRM is an open source, CRM designed for AI agents. Agentic-first CRM. 项目地址: https://gitcode.com/gh_mirrors/crm48/crm 点击查看 免费下载 本篇文章聚焦 Comp AI CRM 仓库中 .agents/skills/ai…

2026/9/24 16:20:25 阅读更多 →
用 Infinite-Canvas 把散落的 Prompt 和素材收进一张无限画布

用 Infinite-Canvas 把散落的 Prompt 和素材收进一张无限画布

做 AI 绘图或者多模态创作的人,大概都经历过这种状态:Prompt 写在某个聊天窗口里,参考图存在下载文件夹,生成结果又丢在另一个目录,改了几版之后自己都记不清哪张图对应哪段提示词。想对比两个版本的差异,得…

2026/9/24 16:20:25 阅读更多 →
【Dv2Admin】修正页面列数据接口同时多次请求

【Dv2Admin】修正页面列数据接口同时多次请求

在企业级应用的开发中,提升用户界面的性能和交互体验一直是开发者关注的重点。尤其在数据请求与反显过程中,大量的请求会给服务器带来不必要的负担,同时可能影响用户的体验。 本文通过一个典型的业务场景,探讨如何优化列表数据请求,以一次请求的方式实现高效的数据反显,…

2026/9/24 16:20:25 阅读更多 →
openFrameworks ofEasyCam 交互相机完全指南:从 easyCamExample 入门到源码级原理

openFrameworks ofEasyCam 交互相机完全指南:从 easyCamExample 入门到源码级原理

图形学音视频 【免费下载链接】openFrameworks openFrameworks is a community-developed cross platform toolkit for creative coding in C. 项目地址: https://gitcode.com/gh_mirrors/op/openFrameworks 点击查看 免费下载 在 openFrameworks 的 3D 创作中&…

2026/9/24 16:19:25 阅读更多 →

日新闻

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

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

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

2026/9/24 0:00:19 阅读更多 →
单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

简介:一份基于单细胞RNA测序数据的细胞类型注释算法研究Python毕业设计源码,针对计算机相关专业正在做毕设或需要项目实战的学习者,可用于课程设计与期末大作业。项目代码完整、经导师指导评审通过,可直接运行,覆盖数据…

2026/9/24 0:00:19 阅读更多 →
C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

第一次在项目里被反射卡住,是在一个老旧的WinForms模块里:几十个类依赖PropertyChanged通知,运行时反射读属性、发通知,每次启动慢半拍不说,一上.NET Native/AOT裁剪模式几乎全面崩盘。后来我把这段逻辑全部改成C#源生…

2026/9/24 0:00:19 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/24 9:10:42 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →