嵌入式系统编程【免费下载链接】fprimeF´ - A flight software and embedded systems framework项目地址https://gitcode.com/gh_mirrors/fpri/fprime点击查看免费下载导读本文围绕 F´F Prime飞行软件框架中**事件Events**的声明、自动编码与字典生成链路展开以仓库中Autocoders/Python/test/event_string测试模块及其生成的组件字典 TestLog.md 为主线完整讲解如何通过 XML 描述一个带多个参数的事件、由自动编码器Autocoder生成类型安全的发送/接收代码以及事件字典表格中每一列的来源与含义。读完本文你将掌握在 F´ 中定义自定义事件、理解其 ID/严重级别/格式化字符串语义并在接收端正确反序列化事件参数的完整实战方法。一、事件机制与自动编码器在 F´ 中的地位在 F´ 框架中**事件Event**是组件向地面系统或日志系统报告运行状态、告警与故障的核心通道与遥测Telemetry、命令Command并列为组件三大对外接口。一个事件通常包含唯一 ID、严重级别Severity、格式化字符串以及一组有序参数。F´ 的自动编码器Autocoder负责把 XML 描述或新版 FPP 描述翻译成类型安全的 C 基类代码。仓库中Autocoders/Python/test/event_string就是专用于验证事件字符串参数event string自动编码正确性的测试模块其产物之一即组件字典 TestLog.md。该模块的核心输入是 TestComponentAi.xml编码生成TestComponentAc.hpp/cpp后再与手写的组件实现Impl一起编译构成完整的收发链路。从 CMakeLists.txt 可以看到该模块的构建组织方式SOURCE_FILES同时包含 XML 输入文件与手写 C 实现register_fprime_module()注册主模块register_fprime_ut()注册单元测试模块并通过EXCLUDE_FROM_ALL TRUE将其排除在默认全量构建之外仅供自动编码器回归测试使用。二、组件 XML 中的事件定义字段与语义逐项解析事件的源头在 TestComponentAi.xml。组件名为TestLog位于命名空间Somewhere类型为被动组件kindpassive。事件定义如下events !-- A test event -- event id100 nameSomeEvent severityACTIVITY_LO format_string My Event %d [%s] %d comment A 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各属性语义如下属性/子元素取值本例含义id100事件唯一标识符由组件字典登记对应字典中 ID 列100 (0x64)nameSomeEvent事件名称会拼接到生成的发送函数名中severityACTIVITY_LO严重级别F´ 支持COMMAND、ACTIVITY_LO、ACTIVITY_HI、WARNING_LO、WARNING_HI、FATAL等枚举影响日志归类与地面显示format_stringMy Event %d [%s] %d人类可读格式化模板占位符与参数一一对应%d对应 I32、%s对应字符串、%d对应 U8commentA test event事件说明出现在字典的描述列arg namearg1/arg2/arg3参数名出现在字典的参数名列arg typeI32 / string / U8参数类型string需配合size指定最大长度arg size15字符串参数最大字符容量决定字典中Fw::LogStringArg的15arg commentThe I32 command argument等参数说明出现在字典的参数描述列值得注意本例arg2的类型是 XML 中的string但自动编码后生成代码与字典中实际对应的 C 类型是Fw::LogStringArg见下文第四节。这正是该测试模块命名为event_string的原因——它专门验证事件字符串参数的编码、序列化与字典登记是否正确。组件还通过import_port_type引入了事件收发所需的端口类型Fw/Log/LogPortAi.xml二进制日志端口、Fw/Log/LogTextPortAi.xml文本日志端口以及Fw/Time/TimePortAi.xml时间源端口并在ports中以role属性LogEvent、LogTextEvent、TimeGet声明它们。这些端口是事件能携带时间戳并送达日志系统的前提。三、事件字典 TestLog.md 解读每一列从哪来关联文档 TestLog.md 是自动编码器为TestLog组件生成的事件字典Component Dictionary全文即一张事件列表表Event NameIDDescriptionArg NameArg TypeArg SizeDescriptionSomeEvent100 (0x64)A test eventarg1I32The I32 command argumentarg2Fw::LogStringArg15The F32 command argumentarg3U8The U8 command argument逐列溯源如下Event Name / ID来自 XML 的nameSomeEvent与id1000x64是 100 的十六进制表示便于地面系统以十六进制 ID 检索。Description来自事件级commentA test event。Arg Name / Arg Type / Arg Size来自args中各arg的定义。arg2的 C 类型被生成器映射为Fw::LogStringArgsize15被登记为参数大小 15。参数 Description来自各arg的comment。这种字典是地面站GDS解析下行事件、以及文档化组件接口的标准交付物。读者在自己的组件中声明事件后即可通过自动编码流程得到同格式的字典文件用于地面配置与团队协作查阅。四、自动生成的发送侧代码log_ACTIVITY_LO_SomeEvent事件定义经自动编码器处理后会在生成的组件基类Somewhere::TestLogComponentBase文件TestComponentAc.hpp/cpp由 XML 在构建期生成中产生一个类型安全的发送方法方法名由日志前缀 严重级别 事件名拼接而成。手写实现 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); }关键点命名规范log_ 严重级别大写枚举名 _ 事件名即log_ACTIVITY_LO_SomeEvent。如果你的事件严重级别是WARNING_HI生成的方法名即为log_WARNING_HI_EventName。类型安全三个形参I32、Fw::LogStringArg、U8与 XML 声明一一对应编译期即校验调用方传参类型。字符串包装调用方通过Fw::LogStringArg arg(Log Something)构造字符串参数见 main.cpptoChar()用于取 C 字符串打印。生成的基类内部会自动① 为事件打上来自TimeGet端口的时间戳② 将参数序列化进Fw::LogBuffer③ 通过LogEvent端口Fw::Log与LogTextEvent端口Fw::LogText分发事件。五、接收侧解析逆序反序列化与日志输出事件接收端由手写的TestLogRecvImpl演示。它继承自LogTextImpl见 TestLogRecvImpl.hpp其基类定义位于Autocoders/Python/test/log_tester/TestTextLogImpl.hpp并实现日志端口回调 TestLogRecvImpl.cppvoid 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); }这里体现了 F´ 序列化缓冲区的一个核心约定参数按声明顺序写入arg1→arg2→arg3读取时必须逆序反序列化arg3→arg2→arg1如同栈式出栈。代码注释// deserialize them in reverse order正是对这一规则的显式强调。若顺序颠倒将得到错位或越界的解析结果。同时可以看到回调中能拿到事件的 ID、时间标签由TimeGet端口注入含时基与秒/微秒与严重级别枚举值。六、把收发两端接起来端口连接与测试驱动main.cpp 演示了完整的事件链路装配过程TestLogImpl testImpl(TestLogImpl); testImpl.init(); TestLogRecvImpl logRecv(TestLogRecv); logRecv.init(); TestTimeImpl timeSource(TimeComp); timeSource.init(); testImpl.set_Log_OutputPort(0, logRecv.get_logRecvPort_InputPort(0)); testImpl.set_Time_OutputPort(0, timeSource.get_timeGetPort_InputPort(0)); testImpl.set_LogText_OutputPort(0, logRecv.get_textLogRecvPort_InputPort(0)); timeSource.setTime(Fw::Time(TB_NONE, 2, 3)); Fw::LogStringArg arg(Log Something); testImpl.sendEvent(20, arg, 40);装配要点发送组件TestLogImpl的三个输出端口Log、LogText、Time分别接到接收组件logRecv与时间源组件timeSource的输入端口上时间源TestTimeImpl位于Autocoders/Python/test/time_tester通过setTime(Fw::Time(TB_NONE, 2, 3))预先注入时间标签事件发送时即携带该时间调用sendEvent(20, arg, 40)后事件沿端口链下行接收端打印Received log 100, Time (...) severity ...与逆序解析出的Args: 20 Log Something 40。单元测试方面test/ut/main.cpp 使用自动编码器生成的 GTest 基类Somewhere::TestLogGTestBase构造测试器验证生成代码的接口形态生成模板中对字符串参数的实例化可见于 test/cpp.tmplFw::LogStringArg ${arg_name};。该模块的构建依赖Autocoders/Python/test/log_tester与Autocoders/Python/test/time_tester两个测试辅助模块见 CMakeLists.txt。七、实战小结在自有组件中声明并验证一个事件结合上述链路在 F´ 中落地一个自定义事件的最小步骤为声明在组件 XML 的events中给出id、name、severity、format_string并为每个参数声明name、type字符串需size与comment生成运行自动编码流程该测试模块在构建时通过register_fprime_module自动执行得到组件基类与事件字典TestLog.md发送在组件实现中调用log_SEVERITY_EventName(arg1, arg2, ...)字符串参数用Fw::LogStringArg包装接收在日志接收回调中按逆序deserialize事件参数并借助id、timeTag、severity组织日志输出核对对照生成的字典确认事件 ID、参数类型与格式化字符串完全一致保证地面系统与固件侧解析不产生歧义。掌握这一从 XML 到字典、再到收发代码的完整闭环即可在 F´ 项目中快速、规范地扩展自定义事件并为地面监控与故障排查提供结构化依据。赞分享嵌入式系统编程【免费下载链接】fprimeF´ - A flight software and embedded systems framework项目地址https://gitcode.com/gh_mirrors/fpri/fprime点击查看免费下载相关推荐F´ 事件日志Event Log机制深度解析从 XML 定义、自动代码生成到 Component DictionaryF´ 事件日志Event Log机制深度解析从 XML 定义、自动代码生成到 Component Dictionary 导读 本文以 F´F Prime嵌入式系统编程F´ 组件事件字典Event Component Dictionary全解析从 XML 定义到自动生成的 Markdown 字典F´ 组件事件字典Event Component Dictionary全解析从 XML 定义到自动生成的 Markdown 字典 本文围绕 F´F Pr嵌入式系统编程F´ 事件Event组件字典与日志系统实战解析从 XML 定义到 TestLog 自动生成文档F´ 事件Event组件字典与日志系统实战解析从 XML 定义到 TestLog 自动生成文档 F´F Prime是一个由 NASA 喷气推进实验室开嵌入式系统编程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考