F´ 事件日志(Event Log)机制深度解析:从 XML 定义、自动代码生成到 Component Dictionary
嵌入式系统编程【免费下载链接】fprimeF´ - A flight software and embedded systems framework项目地址https://gitcode.com/gh_mirrors/fp/fprime点击查看免费下载导读本文以 F´F Prime飞行软件框架中的事件日志Event Log机制为核心以TestLog测试组件的 Component Dictionary 文档TestLog.md为主线完整还原了XML 定义事件 → 自动代码生成 → 事件发送与接收 → 字典文档生成的完整链路。读完本文你将掌握如何在 F´ 组件 XMLAi.xml中声明带参数的事件、理解事件 ID 的十六进制编码规则、使用自动生成的log_ACTIVITY_LO_*发送 API以及如何实现接收端的事件反序列化与日志端口对接。一、什么是 Component DictionaryTestLog.md 的定位在 F´ 框架中Component Dictionary组件字典是每个组件面向集成、测试与地面系统GDS的说明书。它以 Markdown 表格的形式集中罗列组件对外暴露的命令Commands、遥测通道Telemetry Channels与事件Events是自动化工具链、GDS 配置和人工联调时共同依赖的权威数据源。TestLog.md 正是Autocoders/Python/test/event_string测试组件生成的字典文档。该文档由自动化工具从组件的 XML 定义派生而来其事件列表部分记录了TestLog组件声明的全部事件及其参数签名Event NameIDDescriptionArg NameArg TypeArg SizeDescriptionSomeEvent100 (0x64)A test eventarg1I32The I32 command argumentarg2Fw::LogStringArg15The F32 command argumentarg3U8The U8 command argument这张表信息密度很高事件名为SomeEventID 为十进制的100、同时给出十六进制形式0x64事件带有三个参数——arg1I32、arg2Fw::LogStringArg即日志专用字符串类型容量 15 字符、arg3U8。后续章节将逐一揭示这些字段从何而来、如何被代码消费。二、事件从哪来XML 中的事件声明字典文档不是手写的而是由组件的 XML 描述AI XML驱动自动生成的。TestLog组件的完整定义位于 TestComponentAi.xml其中与SomeEvent相关的声明如下component nameTestLog kindpassive namespaceSomewhere events !-- A test event -- event id100 nameSomeEvent severityACTIVITY_LO format_string My Event %d [%s] %d commentA test event/comment args arg namearg1 typeI32 commentThe I32 command argument/comment /arg arg namearg2 typestring size15 commentThe F32 command argument/comment /arg arg namearg3 typeU8 commentThe U8 command argument/comment /arg /args /event /events ... /component逐字段对照字典表格可以完整还原文档中各列的技术含义id100事件的唯一编号在字典中同时呈现为十进制100与十六进制0x64。ID 在同一组件内必须唯一是接收端与 GDS 识别事件的依据。nameSomeEvent事件名称字典中的 Event Name 列即取自这里。severityACTIVITY_LO事件严重级别。F´ 预定义的级别包括ACTIVITY_LO低活动级、ACTIVITY_HI、WARNING_LO、WARNING_HI、FATAL、COMMAND、DIAGNOSTIC等直接决定事件在Fw::LogSeverity中的取值。format_stringMy Event %d [%s] %d事件的格式化字符串类似printf风格。三个占位符%d、%s、%d与三个参数一一对应供地面系统、文本日志Text Log通道渲染人类可读的事件文本。arg namearg1 typeI32/arg namearg3 typeU8整型参数直接映射为 C 基础类型。arg namearg2 typestring size15字符串参数。size指定容量上限自动代码生成时会将其映射为Fw::LogStringArg这正是字典中 Arg Type 列出现Fw::LogStringArg、Arg Size 列为15的原因。组件还导入了三个与日志链路密切相关的端口类型见 TestComponentAi.xmlFw/Log/LogPortAi.xml事件日志端口、Fw/Log/LogTextPortAi.xml文本日志端口、Fw/Time/TimePortAi.xml时间戳端口。在ports段中它们分别以LogroleLogEvent、LogTextroleLogTextEvent、TimeroleTimeGet三个输出端口的形式被实例化——事件在发出时自动携带时间戳并通过这两个日志端口分发。三、ID 与十六进制编码的生成规则字典中100 (0x64)的双进制呈现并非手工填写而是由 Markdown 字典模板程序化生成。查看模板 MdEventsTablePage.tmpl可以看到 ID 的完整计算逻辑#for $id, $eventname, $severity, $format_string, $throttle, $comment in $events: ... #if len($id) 1: #set $id $id[0] #if x in $id: #set $id int($id, 16) $base_id #else #set $id int($id) $base_id #end if #set $hexid hex($id) #end if从模板可以推断出几条关键规则支持十进制与十六进制两种书写方式如果 XML 中 ID 字符串含有字符x按十六进制解析否则按十进制解析。支持基址偏移base_id模板将解析出的 ID 加上组件级基址base_id得到最终 ID这是 F´ 框架级与组件级事件编号冲突规避的通用手段。十六进制自动派生最终 ID 通过 Python 的hex()生成0x64形式与十进制一并写入表格方便调试时按位识别事件族。模板同时遍历$args为每个事件输出参数行——首行写事件名与 ID后续每一行以| | | |前缀续写参数信息这正是 TestLog.md 表格中事件行 三个参数行排布的直接来源。同目录下的events/EventBody.tmplEventBody.tmpl则负责生成供 GDS 使用的 Python 事件描述模块其中同样携带ID、SEVERITY、FORMAT_STRING与ARGUMENTS元数据印证了字典与 GDS 数据共享同一份 XML 源头。四、自动生成的发送 APIlog_ACTIVITY_LO_SomeEvent事件定义好之后Autocoder 会为组件基类生成事件发送成员函数命名规则为log_SEVERITY_EventName。在 TestLogImpl.cpp 中可以直观看到它的用法void TestLogImpl::sendEvent(I32 arg1, Fw::LogStringArg arg2, U8 arg3) { printf(Sending event args %d, %s, %d\n, arg1, arg2.toChar(), arg3); this-log_ACTIVITY_LO_SomeEvent(arg1, arg2, arg3); }要点解析函数签名与 XML 参数严格对应arg1I32、arg2Fw::LogStringArg、arg3U8三个实参按声明顺序传入顺序与字典表格完全一致。组件实现类的继承关系TestLogImpl继承自Somewhere::TestLogComponentBase见 TestLogImpl.hpplog_ACTIVITY_LO_SomeEvent即定义在该自动生成的基类中实现类只需直接调用。命名空间Somewhere也来自 XML 的namespace属性说明命名空间、组件名共同决定了生成代码的 C 符号。参数类型映射规则XML 中的I32→I32、U8→U8、string size15→Fw::LogStringArg。其中字符串类型Fw::LogStringArg定义在 LogString.hpp其STRING_SIZE FW_LOG_STRING_MAX_SIZE内部使用定长char m_buf[...]存储toChar()返回 C 风格字符串指针——这就是字典 Arg Size 15 对应的实际容量语义。事件发送后基类会通过组件的Log输出端口类型Fw::Log与LogText输出端口类型Fw::LogText把事件分发出去并借助Time端口roleTimeGet为事件打上时间戳。因此任何事件在接收端都会携带事件 ID、时间戳、严重级别与序列化后的参数缓冲区。五、接收端视角事件的反序列化与参数顺序事件最终由日志消费方通过输入端口接收。TestLogRecvImpl.cpp 展示了接收处理的典型范式void TestLogRecvImpl::logRecvPort_handler(NATIVE_INT_TYPE portNum, FwEventIdType id, Fw::Time timeTag, const Fw::LogSeverity severity, Fw::LogBuffer args) { printf(Received log %d, Time (%d,%d:%d) severity %d\n, id, timeTag.getTimeBase(), timeTag.getSeconds(), timeTag.getUSeconds(), severity.e); I32 arg1; Fw::LogStringArg arg2; U8 arg3; // deserialize them in reverse order args.deserialize(arg3); args.deserialize(arg2); args.deserialize(arg1); printf(Args: %d \%s\ %d\n, arg1, arg2.toChar(), arg3); }这里有三个极易踩坑的关键点参数以逆序反序列化Fw::LogBuffer中参数的序列化顺序与发送 API 的实参顺序相反后进先出。因此接收端必须依次先deserialize(arg3)、再deserialize(arg2)、最后deserialize(arg1)才能还原原始顺序。代码注释 deserialize them in reverse order 明确点出了这一约定。事件元数据随参数一同送达FwEventIdType id对应字典中的事件 ID100/0x64Fw::Time timeTag是发送端TimeGet端口注入的时间戳Fw::LogSeverity对应 XML 中声明的ACTIVITY_LO。接收端可据此在日志系统中分流、过滤或渲染不同严重级别的事件。字符串参数以Fw::LogStringArg落位反序列化目标必须是定长字符串类型Fw::LogStringArg与发送端/字典中的类型完全一致随后用toChar()输出。六、测试与构建集成字典背后的工程闭环event_string不仅是演示代码更是一个可编译、可测试的 Autocoder 回归用例。从 CMakeLists.txt 可以看到其工程组织SOURCE_FILES同时包含两个 XMLTestComponentAi.xml、TestPortAi.xml与手写的 C 实现TestLogImpl.cpp、TestLogRecvImpl.cpp、main.cppXML 会经由 Autocoder 生成TestComponentAc基类代码后参与编译。MOD_DEPS声明依赖Autocoders/Python/test/log_tester与Autocoders/Python/test/time_tester——前者提供了LogTextImpl文本日志接收基类TestLogRecvImpl.hpp 中TestLogRecvImpl即继承自LogTextImpl后者提供时间模拟能力。单元测试入口 main.cpp 实例化了Somewhere::TestLogGTestBase测试基类表明 Autocoder 同时为组件生成了 GTest 测试骨架可对事件发送行为做自动化断言。也就是说从 XML 事件声明出发一条流水线同时产出C 组件基类含log_ACTIVITY_LO_SomeEvent、GTest 测试基类TestLogGTestBase、GDS 事件描述模块EventBody.tmpl产物以及本文章反复引用的 Markdown 组件字典MdEventsTablePage.tmpl产物。TestLog.md 正是这条流水线的最终可读产物之一它把事件 ID、参数类型、参数容量等运行时关键信息以表格形式固化下来成为跨角色组件开发者、集成者、测试者、GDS 操作员沟通的统一语言。七、实践要点小结声明事件在组件 Ai.xml 的events段使用event id name severity format_string声明参数用args/arg描述字符串参数务必给出size容量。生成产物重新运行 Autocoder或重新构建 CMake 工程后自动获得log_SEVERITY_EventName发送 API、GTest 基类与 Markdown 字典字典中的 Arg Type 列如Fw::LogStringArg即参数类型的最终 C 形态。发送事件在实现类中直接调用生成的发送函数实参顺序与 XML 声明顺序一致。接收事件在日志接收端按逆序对Fw::LogBuffer反序列化并通过FwEventIdType、Fw::Time、Fw::LogSeverity获得事件身份、时间戳与严重级别。核对字典事件 ID 的十进制/十六进制双表示、参数列表均可作为集成调试与 GDS 建链的核对依据确保 XML、生成代码与字典三方一致。赞分享嵌入式系统编程【免费下载链接】fprimeF´ - A flight software and embedded systems framework项目地址https://gitcode.com/gh_mirrors/fp/fprime点击查看免费下载相关推荐Activepieces 收到 Webhook 被拒绝报 413 Request Too Long 怎么调整负载上限Activepieces 收到 Webhook 被拒绝报 413 Request Too Long 怎么调整负载上限 Activepieces 的 Webho嵌入式系统编程F´ 事件节流Event Throttle机制剖析从 XML 定义、自动生成代码到组件字典与测试验证F´ 事件节流Event Throttle机制剖析从 XML 定义、自动生成代码到组件字典与测试验证 本文以仓库中 event_throttle 测试组件嵌入式系统编程Envoy StringMatcher五种字符串匹配模式与 Lua 自定义匹配器的配置与实现解析Envoy StringMatcher五种字符串匹配模式与 Lua 自定义匹配器的配置与实现解析 本文基于 Envoy 官方文档 string_matcher嵌入式系统编程上一篇3大核心功能重构Wallpaper Engine资源处理RePKG给开发者的效率提升指南下一篇LeagueAkari重新定义英雄联盟体验的智能辅助工具创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Matlab消防搜救智能体仿真:路径规划与目标概率检测实战

Matlab消防搜救智能体仿真:路径规划与目标概率检测实战

1. 项目到底在解决什么问题:从真实搜救现场到仿真推演其实最开始我接触这个题目,是因为数学建模竞赛里“mrite数学建模智能体”这个概念火了,评委越来越看重“智能体交互推演”而不是简单的公式套用。消防搜救这个主题更是典型——火场里的人…

2026/9/24 21:38:35 阅读更多 →
Ansys Maxwell静电场电位分布仿真:从建模到后处理全解析

Ansys Maxwell静电场电位分布仿真:从建模到后处理全解析

1. 为什么偏偏要用Maxwell做静电场电位分布1.1 静电场分析的核心需求与Maxwell的定位很多朋友第一次接触Ansys Maxwell,是从电机仿真或者电磁阀、电感器这类低频电磁场问题开始的。热搜词里一大半在问“maxwell电机仿真”“ansys maxwell 仿真很慢”“maxwell求解电…

2026/9/24 21:38:35 阅读更多 →
Vue 中 watch 与 computed 的正确用法:何时该删掉 watch?

Vue 中 watch 与 computed 的正确用法:何时该删掉 watch?

先说一个我几乎每周都能在 code review 里看到的场景:组件里一个ref,本质上是从另一个 prop 或状态“派生”出来的,但实现却用了watch手动同步。每次看到这种写法,我都会在评审意见里直接写一句:“这个 watch 写法&…

2026/9/24 21:38:35 阅读更多 →

最新新闻

医疗数据集微调大模型:从数据清洗到LLaMA-Factory实战指南

医疗数据集微调大模型:从数据清洗到LLaMA-Factory实战指南

简介:llm-medical-data是一套面向大模型微调训练的医疗数据集,主要服务需要真实医疗语料进行模型优化的数据科学家、医学研究人员以及处于入门阶段的个人学习者。资源围绕临床诊疗场景整理了患者基本信息、病史、检查结果、治疗过程与药物反应等多维数据…

2026/9/25 5:43:33 阅读更多 →
Agent Substrate 中的 go-jose Safe JSON:为 JOSE 安全消息定制的严格 JSON 解析器

Agent Substrate 中的 go-jose Safe JSON:为 JOSE 安全消息定制的严格 JSON 解析器

人工智能AI AgentAgent 沙箱云原生容器运行时零信任 【免费下载链接】substrate Agent Substrate: the core system 项目地址: https://gitcode.com/GitHub_Trending/substrate7/substrate 点击查看 免费下载 本文聚焦 Agent Substrate 仓库中随 go-jose v4 一并 v…

2026/9/25 5:43:33 阅读更多 →
QKeyMapper连发与锁定功能详解:轻松实现无限压枪与持续开火

QKeyMapper连发与锁定功能详解:轻松实现无限压枪与持续开火

QKeyMapper连发与锁定功能详解:轻松实现无限压枪与持续开火 【免费下载链接】QKeyMapper [按键映射工具] QKeyMapper,Qt开发Win10&Win11可用,不修改注册表、不需重新启动系统,可立即生效和停止。支持游戏手柄映射到键鼠&#…

2026/9/25 5:43:33 阅读更多 →
Atlas 300V 24G NPU加速卡部署YOLO全流程实战:从模型转换到性能优化

Atlas 300V 24G NPU加速卡部署YOLO全流程实战:从模型转换到性能优化

做目标检测部署的人,最近应该没少听到 Atlas 这个名字。尤其你是做视频分析、边缘盒子或者工业质检这类项目的,想把 YOLO 模型跑起来但又不想一直受制于 GPU 的功耗和成本,Atlas 系列是绕不开的一个选项。我收到最多的两个问题就是&#xff1…

2026/9/25 5:43:33 阅读更多 →
Atlas 300V Pro 24G推理卡YOLO部署实战:从模型转换到性能调优

Atlas 300V Pro 24G推理卡YOLO部署实战:从模型转换到性能调优

1. 先搞清楚:Atlas 300V 24G到底是什么卡最近总有人问我,Atlas 300V 24G是不是运算加速卡,还有人在搜“atlas部署yolo”能不能行。我用一句话先给结论:Atlas 300V Pro(24GB显存版本)就是华为专门做AI推理的…

2026/9/25 5:43:33 阅读更多 →
openapi-typescript Node.js API 实战指南:程序化类型生成、transform 钩子扩展与源码管线解析

openapi-typescript Node.js API 实战指南:程序化类型生成、transform 钩子扩展与源码管线解析

开发工具代码生成后端 【免费下载链接】openapi-typescript Generate TypeScript types from OpenAPI 3 specs 项目地址: https://gitcode.com/gh_mirrors/op/openapi-typescript 点击查看 免费下载 本文基于 openapi-typescript 仓库中的 Node.js API 文档&#x…

2026/9/25 5:42:32 阅读更多 →

日新闻

AI元人文:从工具使用到思维重构的深度探索

AI元人文:从工具使用到思维重构的深度探索

最近半年我一直在琢磨一件事:AI元人文到底是什么?说白了,就是“用元视角重新审视人与AI的关系”,也在“探索AI如何反向逼着我们发现自己的思考边界”。标题里的“元探索”,在我看就是一层套一层的追问——当你用AI解决…

2026/9/25 0:00:41 阅读更多 →
Python+CNN车牌识别实战:从数据预处理到模型训练与部署

Python+CNN车牌识别实战:从数据预处理到模型训练与部署

简介:基于Python与卷积神经网络的车牌识别项目,面向计算机视觉初学者及智能交通开发者,目标是帮助用户掌握从数据预处理、模型构建到实际部署的完整流程。压缩包共25个文件,包含jpg/png图像样本、py训练脚本、md说明文档、dat数据…

2026/9/25 0:00:41 阅读更多 →
Vim基础操作全攻略:保存退出、模式切换与高频命令实战

Vim基础操作全攻略:保存退出、模式切换与高频命令实战

1. 项目概述1.1 核心需求解析今天聊聊Vim。写这个题目的原因是:几乎每个后端开发者、运维人员、数据工程师某天都会遇到一个场景——深夜加班,服务器登录界面只有黑底白字,编辑器只有vi/vim,你必须在五分钟内完成一次配置修改并保…

2026/9/25 0:00:41 阅读更多 →

周新闻

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 阅读更多 →