嵌入式系统编程【免费下载链接】fprimeF´ - A flight software and embedded systems framework项目地址https://gitcode.com/gh_mirrors/fp/fprime点击查看免费下载本篇技术指南聚焦 F´Flight Software Framework中遥测通道字典Telemetry Channel Dictionary的完整生命周期如何通过组件 XML 声明一条遥测通道如何由自动编码器Autocoder生成以TestTlm.md为代表的组件字典文档以及生成的tlmWrite_*接口如何被实现代码调用、被接收侧组件反序列化消费。文章以仓库中Autocoders/Python/test/tlm1测试工程为主线同时对照tlm_string、tlm_enum等变体让读者掌握在 F´ 中声明—生成—下发—接收一条遥测通道的端到端方法并能读懂任何 F´ 组件自动生成的字典文档。一、什么是组件字典与遥测通道字典在 F´ 的经典 XML 自动编码流程中开发者先用 XML 描述组件的端口ports、命令commands、事件events、遥测通道telemetry和参数params自动编码器据此生成组件基类*ComponentAc.hpp/cpp以及配套的组件字典Component Dictionary文档。tlm1测试工程的字典文档 docs/TestTlm.md 就是该流程最直接的产物其完整内容如下# TestTlm Component Dictionary ## Telemetry Channel List |Channel Name|ID|Type|Description| |---|---|---|---| |somechan|100 (0x64)|U32|A test channel|这份文档虽短却完整呈现了 F´ 遥测通道字典的四个核心元数据字段字段取值含义Channel Namesomechan通道名即自动生成的tlmWrite_somechan()接口的后缀ID100 (0x64)通道唯一标识符十进制与十六进制同时给出用于通道寻址与解包TypeU32通道数据类型决定序列化/反序列化时使用的 F´ 类型系统DescriptionA test channel通道用途说明源自 XML 定义中的comment二、通道的源头XML 定义中的telemetry声明字典文档中的每一行都来自组件 XML 中telemetry段的通道声明。tlm1工程的组件定义文件 TestComponentAi.xml 中声明了该通道component nameTestTlm kindpassive namespaceTlm commentA component with a single telemetry channel/comment ports port nameaport data_typeAnother::Test kindsync_input commentA test port/comment /port /ports telemetry channel id100 namesomechan data_typeU32 abbrevT001-1234 high_yellow10 high_red20 comment A test channel /comment /channel /telemetry /component对照字典文档可见channel的id、name、data_type与comment分别映射为字典表中的 ID、Channel Name、Type 与 Description。此外该声明还包含了字典表中未展示但真实存在的进阶属性abbrevT001-1234通道缩写缩写编号用于地面系统对通道进行短标识引用high_yellow10/high_red20通道高告警黄色/红色门限值说明 F´ 通道定义在字典阶段就内置了限值监测语义接收方与地面软件可据此进行告警判断。组件本身为kindpassive被动组件、namespaceTlm因此生成的基类为Tlm::TestTlmComponentBase所有通道类型均落在Tlm命名空间下。从tlm_string、tlm_enum等变体看data_type字段还支持string与自定义枚举类型字典中的 Type 列会相应显示为string或枚举名见后文第六节。三、字典文档的生成机制与阅读价值docs/TestTlm.md由自动编码器在生成组件基类的同时自动产出属于面向人的可读产物与其同源的结构化产物如遥测通道 ID 到偏移/类型的映射配合构成了通道的完整描述。对 F´ 开发者而言这份字典的实用价值体现在三处通道 ID 的唯一性核对100 (0x64)同时给出十进制与十六进制便于在多组件拓扑中避免 ID 冲突数据类型与门限确认Type 列与 XML 中的data_type、high_yellow、high_red对应是地面遥测配置如 GDS的输入依据与实现代码的接口对应通道名somechan直接对应实现侧可调用的tlmWrite_somechan()接口。四、运行时调用链tlmWrite 下发与 tlmRecvPort 接收字典与自动生成的基类共同支撑了通道的运行时数据流。实现组件 TestTelemImpl.cpp 中展示了通道的下发方式void TestTlmImpl::genTlm(U32 val) { printf(Writing value %d to telemetry.\n, val); this-tlmWrite_somechan(val); }关键点在于this-tlmWrite_somechan(val)该接口由自动编码器依据 XML 通道声明生成参数类型即通道的data_type此处为U32。实现类 TestTelemImpl.hpp 继承自Tlm::TestTlmComponentBase因此可直接调用该写接口。这解释了字典文档与代码之间的一一映射字典里的每一行通道都对应基类中一个可调用的tlmWrite_name接口。通道数据离开组件后通过Fw::Tlm输出端口进入遥测接收组件。tlm1工程使用自动编码器自带的telem_tester接收组件定义于 TelemTestComponentAi.xml组件名TelemTester端口tlmRecvPort类型为Fw::Tlm其处理函数在 TestTelemRecvImpl.cpp 中演示了完整的反序列化解析流程void TestTelemRecvImpl::tlmRecvPort_handler( NATIVE_INT_TYPE portNum, FwChanIdType id, Fw::Time timeTag, Fw::TlmBuffer val) { U32 tlmVal; val.deserialize(tlmVal); printf(ID: %d TLM value is %d. Time is %d:%d base: %d\n, id, tlmVal, timeTag.getSeconds(), timeTag.getUSeconds(), timeTag.getTimeBase()); }该处理函数揭示了 F´ 遥测数据包的四个组成要素通道 IDFwChanIdType id即字典中的100、时间标签Fw::Time、**序列化后的通道值Fw::TlmBuffer**以及端口号。接收侧必须按字典中的 TypeU32调用对应的deserialize才能正确还原数值——这正是字典文档对消费端代码的关键约束。五、端到端运行与单元测试验证工程入口 main.cpp 展示了将上述元素串联为一条完整链路的接线方式TestTlmImpl testImpl(TestTlmImpl); testImpl.init(); TestTelemRecvImpl tlmRecv(TestTlmRecv); tlmRecv.init(); TestTimeImpl timeSource(TimeComp); timeSource.init(); testImpl.set_Tlm_OutputPort(0, tlmRecv.get_tlmRecvPort_InputPort(0)); testImpl.set_Time_OutputPort(0, timeSource.get_timeGetPort_InputPort(0)); timeSource.setTime(Fw::Time(TB_NONE, 2, 3)); testImpl.genTlm(26);执行流程为初始化三个组件 → 将TestTlmImpl的遥测输出端口接到TelemTester的tlmRecvPort输入端口 → 将时间输出端口接到时间源组件 → 调用genTlm(26)触发通道下发。接收侧将打印出ID: 100 TLM value is 26及时间标签与字典中somechan 100的定义严格对应从而验证了XML 声明 → 字典文档 → 自动生成接口 → 运行时下发 → 端口接收全链路的正确性。工程同时注册了 GTest 单元测试目标见 CMakeLists.txt 中的register_fprime_ut()测试代码 test/ut/main.cpp 基于自动生成的Tlm::TestTlmGTestBase构造ATester测试器可对组件的通道行为进行 GTest 风格断言验证。六、字典类型的扩展字符串与枚举通道同一套字典机制支持更丰富的通道类型仓库中的两个变体工程提供了直接对照字符串通道tlm_string工程的字典 docs/TestTlm.md 在somechanU32之外额外声明了stringchanID101 (0x65)Type 为string对应 XML 中data_typestring的通道接收侧需以字符串语义反序列化。枚举通道tlm_enum工程的字典 docs/TestTlm.md 中somechan的类型列显示为自定义枚举名SomeEnum说明data_type可直接引用用户定义的枚举类型字典文档会如实呈现该类型名。这两个变体证明字典表中 Type 列的取值空间由 F´ 类型系统决定涵盖基础数值类型、字符串与用户自定义枚举开发者可据此为不同业务语义的遥测量选择合适的通道类型。七、构建集成与进一步探索tlm1作为自动编码器回归测试工程其构建方式展示了 F´ 模块的标准接入模式CMakeLists.txt将组件 XML 与实现源码列入SOURCE_FILES通过register_fprime_module()注册模块并通过EXCLUDE_FROM_ALL TRUE从全量构建中排除该测试模块UT 部分则通过register_fprime_ut()注册。读者可继续阅读以下仓库文件加深理解组件 XML 定义TestComponentAi.xml端口 XML 定义TestPortAi.xml通道下发实现TestTelemImpl.cpp通道接收实现TestTelemRecvImpl.cpp接收组件模板定义TelemTestComponentAi.xml字典变体对比tlm_string 字典 与 tlm_enum 字典小结docs/TestTlm.md看似只是一张三列小表实则是 F´ 自动编码流程在遥测字典层面的浓缩投影从 XMLtelemetry声明的完整参数ID、名称、类型、缩写、告警门限到自动生成的tlmWrite_somechan()接口再到接收侧按字典类型反序列化的端口处理函数一条遥测通道的端到端设计在这一测试工程中被完整闭环验证。掌握字典文档 ↔ XML 声明 ↔ 自动生成接口三者的对应关系是阅读任意 F´ 组件字典、并在此基础上构建地面遥测配置与告警逻辑的起点。赞分享嵌入式系统编程【免费下载链接】fprimeF´ - A flight software and embedded systems framework项目地址https://gitcode.com/gh_mirrors/fp/fprime点击查看免费下载相关推荐WebUI Forge 训练实操指南4 步练出你的第一个 Textual Inversion 嵌入WebUI Forge 训练实操指南4 步练出你的第一个 Textual Inversion 嵌入 跟着本文走完 4 个步骤你就能在 WebUI Forge嵌入式系统编程F´ 组件事件字典Event Component Dictionary全解析从 XML 定义到自动生成的 Markdown 字典F´ 组件事件字典Event Component Dictionary全解析从 XML 定义到自动生成的 Markdown 字典 本文围绕 F´F Pr嵌入式系统编程WezTerm 插件管理指南深入解析 wezterm.plugin 模块的加载、更新与自研流程WezTerm 插件管理指南深入解析 wezterm.plugin 模块的加载、更新与自研流程 wezterm.plugin 是 WezTerm 内建的 Lu嵌入式系统编程上一篇3分钟上手AdminLTE树形组件让层级数据展示不再复杂下一篇三步打造个性化终端美学Kitty标签栏边距颜色独立控制方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
