首页/新闻资讯/正文详情

F´ (F Prime) 事件日志端口深度解析:Fw::Log 与 Fw::LogText 端口的设计、序列化与使用指南

发布时间:2026/9/24 19:05:27 来源:云帆数科 栏目:资讯中心
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:27

opencodex Codex 账号添加 UX 修复:移除 window.open 弹窗、服务端 openUrl 与登录链接复制兜底
opencodex Codex 账号添加 UX 修复:移除 window.open 弹窗、服务端 openUrl 与登录链接复制兜底

【免费下载链接】opencodex Universal provider proxy for OpenAI Codex & Claude Code — use any LLM (Claude, Gemini, Grok, DeepSeek, Ollama…) with Codex CLI, App, SDK, and Claude Code 项目地址: https://gitcode.com/gh_mirrors/ope/opencodex 点击… · 2026/9/24 19:05:21

AI心理健康社交平台技术拆解:情绪识别与风险预警实践
AI心理健康社交平台技术拆解:情绪识别与风险预警实践

1. 项目概述:为什么AI会进入心理健康社交平台今年我开始认真复盘一个做了近一年的项目——AI驱动的心理健康社交支持平台。这名字听着很“概念”,说白了就是:一个用户可以在里面匿名倾诉、互相支持的社区,同时AI在背后做情绪识别、… · 2026/9/24 19:05:21

Yii 2 向后兼容(BC)策略完全指南:从版本承诺到接口与类的兼容性判定规则
Yii 2 向后兼容(BC)策略完全指南:从版本承诺到接口与类的兼容性判定规则

后端Web框架 【免费下载链接】yii2 Yii 2: The Fast, Secure and Professional PHP Framework 项目地址: https://gitcode.com/gh_mirrors/yi/yii2 点击查看 免费下载 本篇指南以 Yii 2 框架核心团队维护的《Backwards Compatibility》(英文版 / 俄文版… · 2026/9/24 19:36:47

Word打开显示只读的6大真实原因与精准修复方案
Word打开显示只读的6大真实原因与精准修复方案

1. 为什么Word一打开就“锁住”了?这不是Bug,而是系统在悄悄告诉你某些事 你双击一个Word文档,界面右上角赫然显示“只读”,标题栏还跟着加了个【只读】后缀——哪怕你刚新建的文件、本地保存的文档、甚至U盘里拷出来的文件&#… · 2026/9/24 19:36:47

AI原生数据治理选型指南:五大平台能力分化与决策框架
AI原生数据治理选型指南:五大平台能力分化与决策框架

1. 当数据治理撞上AI原生,选型逻辑为什么突然变了过去几年做数据治理,大家聊得最多的是元数据采集覆盖率、血缘解析准确率、数据质量规则跑批时长这些指标。但从2025年下半年开始,我陆续参与了几个大型企业的数据平台升级评审,发现… · 2026/9/24 19:36:40

GNG生长型神经气体网络:自适应聚类的动态拓扑解法
GNG生长型神经气体网络:自适应聚类的动态拓扑解法

1. 什么是GNG生长型神经气体网络?它为什么能甩开K-means和DBSCAN几条街? “GNG生长型神经气体网络”——光看这名字,很多人第一反应是:又一个拗口的学术黑话。但如果你正在处理客户分群、异常检测、传感器数据压缩,或者… · 2026/9/24 19:36:40

MySQL状态查看与Navicat连接排查:从SHOW STATUS到Access denied实战
MySQL状态查看与Navicat连接排查:从SHOW STATUS到Access denied实战

说实话,这节MySQL课的后两节,信息量比前面几节加起来都大。老师先带我们把SHOW STATUS过了一遍,然后现场演示了 Navicat 链接 MySQL 的完整流程,下课的时候还有一半人卡在 Access denied 上——包括我。回来我花了一整个晚上把课堂… · 2026/9/24 19:36:40

acore-db-app:Python封装库,让AzerothCore数据库操作化繁为简
acore-db-app:Python封装库,让AzerothCore数据库操作化繁为简

维护AzerothCore服务端的朋友应该都有过这种经历:开发到后期,各种数据修复、批量任务、跨库同步的需求接踵而来,每天不是在写SQL,就是在写连接数据库的Python脚本。我自己的痛点是,pymysql裸用起来倒是不难&#xff0c… · 2026/9/24 19:36:40

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

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

1D-CNN时间序列建模实战:从Conv1d原理到工业落地
1D-CNN时间序列建模实战:从Conv1d原理到工业落地

简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26

柔软的L:汉语语流中被忽视的舌肌张力控制
柔软的L:汉语语流中被忽视的舌肌张力控制

1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码