ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

F´(fprime)Svc::ComLogger 组件指南:从 redo 构建目标到源码级日志落盘原理

F´(fprime)Svc::ComLogger 组件指南:从 redo 构建目标到源码级日志落盘原理 嵌入式系统编程【免费下载链接】fprimeF´ - A flight software and embedded systems framework项目地址https://gitcode.com/gh_mirrors/fp/fprime点击查看免费下载导读本文以 F´ 开源仓库中 Svc/ComLogger/README.md 为骨架系统梳理Svc::ComLogger通信组件Com 缓冲日志组件的构建目标体系与运行机制。文档核心内容是该组件遗留的 redo 构建系统目标all、clean、Dictionary、Docs等及TARGET/MODE环境变量语义在此基础上本文结合仓库内 FPP 定义、C 实现、事件/命令定义与单元测试进一步还原组件的落盘格式、文件滚动策略、哈希校验与错误处理细节帮助读者既能在旧式 redo 构建下完成组件产出物构建也能在现行 CMake/fprime-util 体系下正确配置与使用该组件。一、组件定位与文档背景Svc::ComLogger是 F´ 框架中的一个 active 组件职责是“将传入的 Com 缓冲Fw.Com持续写入磁盘文件”常用于飞行软件中把遥测/通信包原始字节落盘保存。其 FPP 定义位于 Svc/ComLogger/ComLogger.fpp声明如下端口与接口comInasync inputFw.Com通信数据输入pingIn/pingOutSvc.Ping健康检查回环cmdRegOut/cmdIn/cmdResponseOut命令注册、接收与响应logOut/LogText事件与文本事件输出timeCaller时间获取。README.md 自述“This is the build directory for the ISF ComLogger component”即该文档是组件在ISF旧式 redo 构建系统下的构建目录说明罗列了可用的 redo 目标。需要特别说明的是README 中描述的 redo 构建方式是历史遗留体系当前仓库已全面迁移至 CMake fprime-util 构建见组件 CMakeLists.txt本文后续会在第四节说明现行构建方法而 redo 目标作为原文档核心内容将完整保留并逐项展开。二、redo 构建目标体系原文档核心内容原文档将构建目标分为“主目标Main targets”与“辅助目标Helper targets”两类本节完整继承并补充参数语义。2.1 环境变量TARGET 与 MODE所有主目标的产物路径都遵循Build/$TARGET/$MODE/...模板其中两个环境变量的语义为变量可选值未设置时的默认行为TARGETDarwin、Linux、CORTEX160使用原生环境Darwin 或 LinuxMODEUnit、Integration、Flight默认Unit即若不显式设置例如在 Linux 主机上直接执行redo all等价于构建Build/Linux/Unit/lib.a。2.2 主目标Main targetsall构建组件静态库目标Build/$TARGET/$MODE/lib.a是整个组件构建的汇总入口。clean清理当前目录及其子目录中的构建产物。Dictionary生成Dictionary目录内含一份供 ISF 地面支持设备GSE使用的字典文件。Docs生成Docs目录内含 ISF 风格的组件文档。html生成docs/ComLogger.html注意原文档此处未闭合反引号实际含义为在docs目录产出 HTML 格式组件说明。Interface生成Interface目录内含 ASTERIA 风格的组件接口描述。NCSL生成NCSL目录内含非注释源码行数Non-Commented Source Lines统计。README.md重新生成这份 README 文件本身。report生成ComLoggerComponentReport.txt组件报告。2.3 辅助目标Helper targets辅助目标由主目标在内部调用仅在开发或调试构建系统时才需要手动触发default.a构建组件库目标Build/target/mode/lib.a。default.ncsl.txt生成一份 NCSL 统计文件。default.o构建形如Build/target/mode/path/file.o的中间目标文件其中path可以为空。事实边界提示以上 redo 目标是 README.md 的原文描述。当前仓库中并未包含 redo 构建脚本default.do等该类目标仅适用于历史上搭载 ISF/redo 体系的工程目录在 fprime 主仓库内组件的实际构建请以第四节 CMake 方式为准。三、源码级机制ComLogger 如何工作原文档只描述构建未涉及组件运行细节以下内容均来自仓库源码作为对文档主题的纵深扩充。3.1 构造与初始化参数组件头文件 ComLogger.hpp 定义了两个构造函数与init_log_fileComLogger(const char* compName, const char* filePrefix, U32 maxFileSize, bool storeBufferLength true); ComLogger(const char* compName); void init_log_file(const char* filePrefix, U32 maxFileSize, bool storeBufferLength true);参数语义来自头文件注释filePrefix文件名的前缀字符串例如thermal_telemetrymaxFileSize单个文件在关闭并换新文件前允许达到的最大字节数storeBufferLength若为true在写入每条 Com 缓冲内容前先写入其 16 位长度若为false则只写缓冲本身。后者适用于系统能保证所有缓冲等长、或地面上可用 ID 反推长度、从而省去长度开销的场景。实现细节ComLogger.cppinit_log_file断言incomingFilePrefix非空当storeBufferLength为真时断言maxFileSize sizeof(U16)即文件容量必须能容纳长度字段前缀字符串长度若超出内部缓冲区会触发FW_ASSERT防止文件名溢出。3.2 数据通路comIn 处理链comIn_handlerComLogger.cpp是核心入口其处理逻辑为取缓冲实际长度size32因磁盘上只用 16 位保存长度故断言size32 65536并截断为U16 size若当前文件处于OPEN态计算projectedByteCount m_byteCount size若storeBufferLength为真还需加上长度字段占用一旦超出m_maxFileSize即调用closeFile()滚动换文件若文件处于CLOSED态调用openFile()打开新文件文件打开成功则调用writeComBufferToFile落盘。3.3 文件名与哈希校验文件openFileComLogger.cpp使用组件timeCaller端口获取时间戳并生成文件名prefix_timeBase_seconds_microseconds.com同时生成同名但追加Utils::Hash::getFileExtensionString()后缀的哈希校验文件.sha之类。文件通过Os::File::open(..., Os::File::OPEN_WRITE)创建打开失败时触发FileOpenError事件。closeFileComLogger.cpp与析构函数在文件关闭时调用writeHashFile后者使用Os::ValidateFile::createValidation为数据文件生成校验文件以便地面端校验传输/存储完整性。3.4 存储格式与长度前缀writeComBufferToFileComLogger.cpp展示了两种盘上格式storeBufferLength true先序列化 2 字节的U16长度再写缓冲内容storeBufferLength false仅写缓冲原始字节。写盘统一经由writeToFileComLogger.cpp其通过m_file.write完成写入并核对实际写入字节数写失败且此前未报错时触发FileWriteError事件。值得注意的是FileOpenError与FileWriteError都带有事件节流同一错误只上报一次避免磁盘故障时形成正反馈事件风暴源码注释明确说明“otherwise a positive feedback event loop can occur”。3.5 命令与事件命令定义见 Svc/ComLogger/Commands.fppi仅一条异步命令CloseFileopcode 0x00用于强制关闭当前打开的文件对应CloseFile_cmdHandler见 ComLogger.cpp。事件定义见 Svc/ComLogger/Events.fppi事件id级别含义FileOpenError0x00warning high打开文件失败携带错误号与文件名FileWriteError0x01warning high写入失败携带错误号、已写/待写字节数与文件名FileValidationError0x02warning low校验文件生成失败FileClosed0x03diagnostic文件成功关闭FileNotInitialized0x04warning low未调用init_log_file就尝试打开文件throttle 5其中FileNotInitialized对应m_initialized标志使用仅传组件名的构造函数后若未调用init_log_fileopenFile会拒绝工作并发出该事件ComLogger.cpp。四、现行构建方式CMake 与单元测试虽然 README 描述的是 redo 体系但当前仓库使用 F´ 标准的 CMake 构建。组件 CMakeLists.txt 将ComLogger.fpp与ComLogger.cpp注册为模块源文件FPP 自动代码生成由 F´ 工具链处理并通过register_fprime_ut()注册单元测试目标。在部署目录中即可用 fprime-util 构建并运行# 构建组件/部署Linux 原生目标 fprime-util build # 构建并运行组件单元测试 fprime-util build --ut fprime-util check --utfprime-util的用法可参考 docs/UsersGuide/user/fprime-util.md。单元测试位于 Svc/ComLogger/test/ut/入口 ComLoggerMain.cpp覆盖场景与文档/实现相互印证testLogging/testLoggingWithInit带初始化参数含长度前缀的日志落盘testLoggingNoLengthstoreBufferLengthfalse时不写长度的落盘路径openError/writeError文件打开与写入失败路径及事件触发closeFileCommand通过sendCmd_CloseFile下发CloseFile命令验证文件关闭逻辑ComLoggerTester.cppnoInitError未初始化时打开文件应产生FileNotInitialized事件。五、使用建议与注意事项文件滚动策略maxFileSize决定单文件容量上限配合comIn入口的预判逻辑超限时自动关闭并依据时间戳生成新文件需要人工控制分段时可下发CloseFile命令即时落盘并生成校验文件。长度前缀取舍若遥测流中缓冲大小不固定建议保留storeBufferLengthtrue默认以便地面端按长度字段切分记录若已能保证缓冲等长或具备其他长度推导手段可关闭以省去每帧 2 字节开销。文件系统前提组件依赖Os::File与Os::ValidateFile见 Os/ValidateFile.hpp进行写盘与校验因此目标平台需提供对应 OSAL 实现如 Linux 下由 Os/Linux 提供在无文件系统平台如某些嵌入式环境使用前需评估适配性。构建体系差异本文第二节的 redo 目标仅适用于 ISF 遗留工程在 fprime 主仓库中请使用第四节所述 CMake/fprime-util 流程二者产物与命令不同切勿混淆。综上Svc::ComLogger是一个结构简单但职责清晰的落盘组件comIn接收缓冲、按长度前缀规则序列化、按容量滚动文件、关闭时生成哈希校验并以事件方式暴露全部异常路径。理解其构建目标与实现细节有助于在 F´ 部署中正确地接入、验证与地面端解析该组件的日志产物。赞分享嵌入式系统编程【免费下载链接】fprimeF´ - A flight software and embedded systems framework项目地址https://gitcode.com/gh_mirrors/fp/fprime点击查看免费下载相关推荐F´ (F Prime) ComLogger 组件深度指南Com 数据流落盘、日志轮转与校验文件机制F´ F Prime ComLogger 组件深度指南Com 数据流落盘、日志轮转与校验文件机制 Svc::ComLogger 是 F´F Prime飞行嵌入式系统编程F´ 框架 Svc::DpWriter 数据产品落盘组件完全指南从端口设计到文件格式与实战拓扑F´ 框架 Svc::DpWriter 数据产品落盘组件完全指南从端口设计到文件格式与实战拓扑 本篇技术指南聚焦 F´F Prime飞行软件与嵌入式系统框嵌入式系统编程使用 fprime-python 在 F´F Prime中开发 Python 组件从建模、实现到部署的完整指南使用 fprime python 在 F´F Prime中开发 Python 组件从建模、实现到部署的完整指南 本指南围绕 F´ 飞行软件与嵌入式系统框架嵌入式系统编程上一篇DevSecOps实践指南How They SRE中的安全自动化方案下一篇eBay SRE团队的终极指南如何快速定位并解决JVM非堆内存溢出问题创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表