F´ (F Prime) 事件日志端口深度解析:Fw::Log 与 Fw::LogText 端口的设计、序列化与使用指南
嵌入式系统编程【免费下载链接】fprimeF´ - A flight software and embedded systems framework项目地址https://gitcode.com/gh_mirrors/fp/fprime点击查看免费下载导读本文聚焦 F´F Prime飞行软件框架中负责事件日志Event Log传输的核心接口——Fw::Log与Fw::LogText端口。作为框架遥测、命令、事件三通道中的事件通道这两个端口分别承载二进制序列化事件与可打印文本事件是组件向地面软件或日志系统上报运行时状态的标准途径。读完本文你将掌握这两个端口的参数语义、严重性severity分级体系、配套的缓冲区与字符串类型、相关配置宏以及自动代码生成器如何基于 FPP 定义生成事件上报代码的完整链路。1. 概述两类端口的分工在 F´ 框架中组件通过事件Event向外部汇报运行中发生的情况例如命令执行、告警条件、诊断信息等。事件的传递依赖两个互补的端口定义见 Fw/Log/Log.fppFw::Log端口用于传递 ISF 事件的序列化形式。它携带事件 IDid、时间标签timeTag、严重性severity以及一个包含事件参数序列化结果的缓冲区args。由于采用二进制序列化该端口是事件数据上报地面系统的主通道数据量紧凑、可直接打包进下行遥测包。Fw::LogText端口用于传递 ISF 事件的可打印文本形式。它同样携带 ID、时间标签与严重性但将事件参数格式化为一串人类可读的文本text。该端口面向开发与调试场景正如 Fw/Log/Log.fpp 中的注释所提示Use for development and debugging, turn off for flight用于开发与调试飞行时关闭。两者的存在意味着一个事件在生成时会同时广播到两条路径二进制数据供遥测与存储文本供控制台与调试工具显示。文本日志功能受配置宏FW_ENABLE_TEXT_LOGGING控制可在编译期整体关闭以节省代码空间详见第 5 节。Fw::Log 与 Fw::LogText 端口结构图2. 端口参数详解2.1 Fw::Log 端口参数Fw::Log端口共携带 4 个参数其 FPP 定义位于 Fw/Log/Log.fpp参数说明id事件标识符Event identifier类型为FwEventIdType由自动代码生成器为每个事件分配唯一 IDtimeTag事件发生的系统时间Fw.Time由组件在触发事件时记录severity事件严重性取值为Fw::LogSeverity枚举见第 3 节args事件参数的序列化结果Fw::LogBuffer引用即事件携带的业务数据注意 FPP 定义中id与severity前的$符号表示直接传递不经过序列化而timeTag与args则以ref引用方式传递避免拷贝开销体现嵌入式场景对性能的考量。2.2 Fw::LogText 端口参数参数说明id事件标识符timeTag事件发生的系统时间severity事件严重性Fw::LogSeveritytext事件的可读文本描述类型为Fw::TextLogStringref引用传递2.3 端口在组件接口中的角色在组件的 FPP 接口描述中这两类端口被统一抽象为事件端口event port。以 Fw/Interfaces/EventInterface.fppi 为例 Text event port text event port logTextOut Event port event port logOutlogOut映射到Fw::Log二进制事件logTextOut映射到Fw::LogText文本事件。组件在 FPP 中声明事件后自动代码生成器会为每个事件生成对应的输出端口实例与触发函数。3. 事件严重性分级LogSeverityFw::LogSeverity枚举完整定义于 Fw/Log/Log.fpp共 7 级从致命错误到最细粒度的诊断信息枚举值数值语义FATAL1已遇到使软件无法继续运行的条件致命、不可恢复WARNING_HI2已遇到严重失败但软件可以继续运行WARNING_LO3已遇到失败但软件基本不受影响COMMAND4与命令处理相关的活动发生ACTIVITY_HI5发生重要的标称正常事件ACTIVITY_LO6发生不重要的标称事件属于重要事件的子集DIAGNOSTIC7活动中通常无需查看的详细事件清单用于调试这一分级体系与 Fw/Log/Log.fpp 中定义的枚举完全一致FATAL 1、WARNING_HI 2、WARNING_LO 3、COMMAND 4、ACTIVITY_HI 5、ACTIVITY_LO 6、DIAGNOSTIC 7。二进制端口与文本端口共享同一枚举因此文本日志中打印的严重性名称与二进制事件中的取值严格对应便于地面软件两侧关联比对。4. 配套序列化类型4.1 Fw::LogBuffer —— 序列化事件参数的缓冲区Fw::LogBuffer用于承载事件的序列化参数见 Fw/Log/LogBuffer.hpp。它派生自Fw::SerializeBufferBase内部维护固定大小的字节数组容量由配置宏FW_LOG_BUFFER_MAX_SIZE决定见第 5 节提供getBuffAddr()/getBuffCapacity()访问内部存储以及基于SerializeBufferBase的serialize/deserialize序列化接口构造函数支持由外部数据初始化LogBuffer(const U8 *args, NATIVE_UINT_TYPE size)、默认构造、拷贝构造与赋值运算符其拷贝与赋值均会校验序列化状态并触发FW_ASSERT见 Fw/Log/LogBuffer.cpp。从实现看LogBuffer本质上是事件参数的载荷容器组件侧将各参数按类型依次序列化写入消费侧如ActiveLogger、地面链路再按相同顺序反序列化还原。其序列化类型 ID 为FW_TYPEID_LOG_BUFF。4.2 Fw::TextLogString —— 文本日志字符串Fw::TextLogString是专为文本日志消息定制的定长字符串类型见 Fw/Log/TextLogString.hpp继承自Fw::StringBase字符串容量STRING_SIZE FW_LOG_TEXT_BUFFER_SIZE默认 256 字节见第 5 节序列化类型 ID 为FW_TYPEID_LOG_STR支持从const char*、StringBase及其自身的赋值构造并重载了对应赋值运算符。其容量设计意图在 config/FpConfig.h 中有明确注释Should be large enough for format string and arguments应足够容纳格式化字符串及参数。4.3 Fw::LogStringArg —— 事件中的字符串参数类型当事件的某个参数被声明为字符串时自动代码生成器会使用Fw::LogStringArg作为其类型见 Fw/Log/LogString.hpp容量STRING_SIZE FW_LOG_STRING_MAX_SIZE默认 200 字节与TextLogString共享序列化类型 IDFW_TYPEID_LOG_STR提供完整的构造与赋值重载可直接与const char*互操作。该类型由 Fw/Log/README 明确描述为 Used by the code generator when a string argument type is declared当声明字符串参数类型时由代码生成器使用。值得注意FW_LOG_STRING_MAX_SIZE的注释还提示该常量会截断断言失败事件报告中的文件名属于嵌入式资源约束下的有意取舍。5. 相关配置宏config/FpConfig.h日志端口相关的全部可调参数集中在 config/FpConfig.h均以#ifndef包裹允许在编译前通过命令行或上层配置覆盖宏默认值说明FW_LOG_BUFFER_MAX_SIZEFW_COM_BUFFER_MAX_SIZE - sizeof(FwEventIdType) - sizeof(FwPacketDescriptorType)序列化事件参数缓冲区大小由通信缓冲大小扣除事件 ID 与包描述符后得出FW_LOG_STRING_MAX_SIZE200事件字符串参数LogStringArg的最大字节数会截断断言事件报告中的文件名FW_LOG_TEXT_BUFFER_SIZE256文本日志消息字符串TextLogString的最大字节数需能容纳格式化串与全部参数FW_ENABLE_TEXT_LOGGING1是否启用文本日志端口置 0 可关闭文本输出、节省代码空间其中FW_ENABLE_TEXT_LOGGING与FW_SERIALIZABLE_TO_STRING控制序列化对象是否生成toString()方法存在依赖关系——后者必须开启才能支持文本日志因为文本格式化需要将非基本类型参数转换为字符串。6. 自动代码生成链路事件如何被触发Fw::Log/Fw::LogText端口的实际调用由 FPP 自动代码生成器生成无需手写。以 Autocoders/Python/src/fprime_ac/generators/templates/component/cpp.tmpl 中生成的触发函数为证其典型流程为组件代码调用生成的事件触发函数如log_ACTIVITY_HI_EventName(...)生成代码首先将时间标签Fw::Time与事件参数依次序列化进Fw::LogBuffer若二进制日志端口已连接则调用m_Event_OutputPort[0].invoke(id, timeTag, Fw::LogSeverity::severity, logBuffer)cpp.tmpl当FW_ENABLE_TEXT_LOGGING开启且文本端口已连接时用snprintf按格式化字符串生成文本支持FW_OBJECT_NAMES控制是否前缀对象名存入FW_LOG_TEXT_BUFFER_SIZE大小的局部缓冲构造Fw::TextLogString后调用m_Event_OutputPort[0].invoke(id, timeTag, Fw::LogSeverity::severity, logString)cpp.tmpl。可见文本端口在生成代码中是被\#if FW_ENABLE_TEXT_LOGGING包裹的可选路径二进制端口则是无条件生成的主路径——这与第 1 节文本日志供调试、飞行时可关闭的设计目标完全吻合。7. 事件打包Fw::LogPacket当二进制事件需要发送给地面软件或测试接口时端口参数会被封装进Fw::LogPacket见 Fw/Log/LogPacket.hpp。该类派生自Fw::ComPacket构造函数将包类型置为FW_PACKET_LOG见 Fw/Log/LogPacket.cpp提供setId/setTimeTag/setLogBuffer设置端getId/getTimeTag/getLogBuffer读取端序列化时依次写入包描述符、事件 ID、时间标签与序列化参数数据其中日志缓冲数据采用仅写入内容、不写入长度的方式其注释明确说明为地面软件而设计见 Fw/Log/LogPacket.cpp反序列化时则将剩余全部字节视为日志载荷恢复为LogBuffer。该行为在单元测试 Fw/Log/test/ut/LogTest.cpp 中得到验证测试构造LogPacket写入 ID10、时间标签与序列化后的U32值 12打包进ComBuffer后再解包断言 ID、时间标签与参数值逐一还原测试还覆盖了Fw::LogStringArg的写串→序列化→反序列化→还原往返LogTest.cpp印证了第 4.3 节字符串参数类型的正确性。8. 事件日志的典型消费方Fw::Log/Fw::LogText端口被框架内的日志聚合组件消费形成完整的事件上报链路。在 Svc/ActiveLogger/ActiveLogger.fpp 等实现中ActiveLogger组件同时接入事件与文本事件端口将各组件上报的事件按严重性分级处理后转发给事件存储、文本日志器如 Svc/ActiveTextLogger、地面遥测通道等下游。这一组件发事件 → 日志端口 → ActiveLogger 聚合分发的架构正是第 2 节端口参数与第 7 节LogPacket打包能力的组合应用。9. 变更记录该端口与配套类型的演进记录如下源自 Fw/Log/docs/sdd.md日期说明2015-09-03Fw::LogBuffer初始版本2015-09-16Fw::LogStringArg初始版本供日志自动代码生成器在声明字符串参数时使用参考文件索引端口定义Fw/Log/Log.fpp设计文档Fw/Log/docs/sdd.md缓冲区实现Fw/Log/LogBuffer.hpp、Fw/Log/LogBuffer.cpp字符串类型Fw/Log/LogString.hpp、Fw/Log/TextLogString.hpp打包类型Fw/Log/LogPacket.hpp、Fw/Log/LogPacket.cpp配置宏config/FpConfig.h单元测试Fw/Log/test/ut/LogTest.cpp代码生成模板Autocoders/Python/src/fprime_ac/generators/templates/component/cpp.tmpl组件接口约定Fw/Interfaces/EventInterface.fppi赞分享嵌入式系统编程【免费下载链接】fprimeF´ - A flight software and embedded systems framework项目地址https://gitcode.com/gh_mirrors/fp/fprime点击查看免费下载相关推荐F´ 事件日志端口深度解析Fw::Log 与 Fw::LogText 的设计与使用指南F´ 事件日志端口深度解析Fw::Log 与 Fw::LogText 的设计与使用指南 事件Event是 F´F Prime飞行软件与嵌入式系统中面向嵌入式系统编程F´ 命令体系详解Fw::Cmd / Fw::CmdResponse / Fw::CmdReg 端口设计、序列化与配置指南F´ 命令体系详解Fw::Cmd / Fw::CmdResponse / Fw::CmdReg 端口设计、序列化与配置指南 本篇技术指南以 F´F Prim嵌入式系统编程F´F Prime框架核心功能解析Fw 基础架构、端口与序列化体系完全指南F´F Prime框架核心功能解析Fw 基础架构、端口与序列化体系完全指南 F´F PrimeFlight Software and Embedded嵌入式系统编程上一篇5分钟上手Intern-S2-MobiusLMDeploy部署与MTP加速实战教程下一篇PGlite 如何安装并在浏览器与 Node.js 中创建第一个数据库实例并执行查询创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

capa 还是 YARA:先定“查能力“还是“配样本“,再谈怎么选

capa 还是 YARA:先定“查能力“还是“配样本“,再谈怎么选

capa 还是 YARA:先定"查能力"还是"配样本",再谈怎么选 【免费下载链接】capa The FLARE teams open-source tool to identify capabilities in executable files. 项目地址: https://gitcode.com/GitHub_Trending/ca/capa 你…

2026/9/24 19:05:39 阅读更多 →
工业异物检测数据集实战:VOC/YOLO格式转YOLOv8训练全流程

工业异物检测数据集实战:VOC/YOLO格式转YOLOv8训练全流程

简介:该数据集面向工业流水线皮带传送带场景的异物检测任务,包含一百一十张传送带图片,统一标注为异常(anomaly)类别,共一百九十一个矩形框。数据采用Pascal VOC与YOLO双格式,提供对应的xml标注…

2026/9/24 19:05:39 阅读更多 →
WebRTC+WebSocket 低延迟可视化大屏实时联动实战

WebRTC+WebSocket 低延迟可视化大屏实时联动实战

做可视化大屏最怕客户来一句“我要实时”。数据指标用定时器轮询还能凑合,可一旦牵扯到视频画面,整个技术选型都会跟着变。我最近做的园区监控大屏项目,就是把 WebRTC 低延迟视频流和 WebSocket 实时状态通道接在一起,最终把端到端…

2026/9/24 19:05:39 阅读更多 →

最新新闻

MySQL高负载I/O故障全链路排查与优化实战

MySQL高负载I/O故障全链路排查与优化实战

凌晨两点十六分,监控大屏上的MySQL IOPS曲线突然拉成一条垂直的直线,告警声把值班室的安静撕得粉碎。那条从10点开始缓慢抬升的紫色线条,在那一刻直接冲上了磁盘性能的上限刻度,数据库的活跃会话数同步飙到400,大量业务…

2026/9/24 19:49:18 阅读更多 →
企业级数据库工具怎么选?Navicat与NineData对比分析

企业级数据库工具怎么选?Navicat与NineData对比分析

做过十来年数据库运维和研发,Navicat 基本是很多人电脑里的“标配”,从连 MySQL、Oracle 到日常看数据、导数据,确实顺手。但这两年我越来越多地被企业客户问到同一个问题:团队规模上来之后,Navicat 还够用吗&#xff…

2026/9/24 19:49:18 阅读更多 →
MySQL高负载I/O故障根因分析:从系统层到InnoDB的排查与优化

MySQL高负载I/O故障根因分析:从系统层到InnoDB的排查与优化

这事发生在上个月,客户的线上MySQL实例连续两天在业务高峰时段崩溃报警,从应用侧看就是大量请求超时,接口P99延迟从原本的80ms直接飙到3s以上。我看了一眼监控面板,CPU 80%以上,磁盘I/O util触顶100%,iowai…

2026/9/24 19:49:18 阅读更多 →
C++与Python混合编程:pybind11、ctypes、C API选型指南

C++与Python混合编程:pybind11、ctypes、C API选型指南

1. 混合编程的选型困局:为什么三种方案总让人纠结做C和Python混合开发的人,几乎都绕不开一个灵魂拷问:到底用pybind11、ctypes还是Python C API?我最早接触这个领域是做量化回测系统,核心撮合引擎用C写,策略…

2026/9/24 19:49:18 阅读更多 →
MySQL主从架构下MaxScale读写分离与高可用实战指南

MySQL主从架构下MaxScale读写分离与高可用实战指南

搞数据库的兄弟应该都有过这种体验:主从架构搭好了,读写分离却迟迟没落到位。业务代码里手动判断哪个库写、哪个库读,刚开始还行,等Server挂了一台、主从切换过几轮之后,各种连接串了、事务跑飞、延迟把从库拖垮的问题…

2026/9/24 19:49:18 阅读更多 →
MySQL 1251 报错根源与修复:认证插件兼容性实战指南

MySQL 1251 报错根源与修复:认证插件兼容性实战指南

上周五有个朋友发来一张 MySQL 报错截图: ERROR 1251 (08004): Client does not support authentication protocol requested by server; consider upgrading MySQL client 。他说密码确认了好几遍没问题,3306 端口也是通的,但不管是 Navic…

2026/9/24 19:48:17 阅读更多 →

日新闻

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