ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

F´ 指令序列文件全指南:用 fprime-seqgen 将 .seq 文本编译为可执行的二进制序列

F´ 指令序列文件全指南:用 fprime-seqgen 将 .seq 文本编译为可执行的二进制序列 F´ 指令序列文件全指南用 fprime-seqgen 将 .seq 文本编译为可执行的二进制序列【免费下载链接】fprimeF´ - A flight software and embedded systems framework项目地址: https://gitcode.com/GitHub_Trending/fpr/fprimeF´F Prime飞行软件框架内置了一套轻量级指令序列command sequence机制允许把一系列 F´ 指令按照绝对时间或相对时间编排成文本文件再借助fprime-seqgen工具与飞行软件指令字典dictionary编译为最小化的二进制格式上传后由Svc::CmdSequencer组件执行。读完本文你将掌握.seq序列文件的完整语法时间前缀、注释、各类参数类型、fprime-seqgen的编译与上传流程、cmdSeq.CS_RUN等运行指令的用法以及序列时间基准time base与二进制文件格式的底层细节。本文以 docs/user-manual/gds/seqgen.md 为骨架结合仓库内 Svc::CmdSequencer 组件设计文档、Ref 参考工程的集成测试与真实.seq示例文件展开说明。F´ 序列机制概述F´ 支持一种非常基础的序列格式序列文件按行列出指令每条指令带有一个时间参数绝对时间或相对时间、一个指令助记符mnemonic以及可选的指令参数。编译时fprime-seqgen使用 F´ 的指令字典dictionary把人类可读的文本翻译成最小化的二进制格式供上传和运行使用。运行二进制序列时由飞行系统中定义的任意一个指令序列器Command Sequencer实例接收*.CS_RUN指令来启动执行。序列机制涉及三个标准组件均可查看仓库内的设计文档Svc::CmdSequencer 组件设计文档负责读入、校验并逐步派发序列中的指令Svc::CmdDispatcher 组件设计文档负责接收并分派单条指令及其响应Svc::SeqDispatcher 组件设计文档负责管理多个指令序列器实例。[!NOTE] 用户可以创建多个 CmdSequencer 组件实例并用一个 Svc::SeqDispatcher 统一管理便于并行运行多个序列或按子系统组织序列。在 Ref 参考工程中cmdSeq实例在 TestDeploymentsProject/Ref/Top/instances.fpp 中定义instance cmdSeq: Svc.CmdSequencer base id 0x10006000并在 TestDeploymentsProject/Ref/Top/topology.fpp 中接入rateGroup2Comp.RateGroupMemberOut[0] - cmdSeq.schedIn定时端口与指令派发/响应链路。编写 F´ 序列文件F´ 序列文件由若干条指令组成。每条指令以时间参数开头随后是指令助记符最后是指令参数如有。下面是最简单的绝对时间指令示例A2015-075T22:32:40.123 cmdDisp.CMD_NO_OPA表示绝对时间absolute后接日历时间cmdDisp.CMD_NO_OP是字典中指令的完整助记符组件实例名.指令名。[!NOTE] 时间格式与时间基准的完整说明见下文 时间细节 一节。相对时间指令以R开头表示相对前一条指令或序列起点的时间偏移。带参数的相对时间指令示例如下R01:00:01.050 CMD_NO_OP_STRING Awesome string! ; And a nice comment too一个文本文件可包含多条这类指令通常以.seq作为扩展名。注释以分号;开头分号后的内容在行内任意位置都会被忽略注意上例中注释紧跟在参数之后。[!TIP] 需要以序列方式批量加载星上参数时可以直接从一个 JSON 参数文件生成序列文件参见 How-To: 批量加载参数。指令参数类型指令可以接受多种参数类型简单参数字符串、数字、布尔值R01:00:01.050 CMD_NO_OP_STRING Awesome string! R00:00:00 CMD_WITH_NUMBER 42 R00:00:00 CMD_WITH_BOOL true数组参数使用方括号R00:00:00 CMD_WITH_ARRAY [1, 2, 3, 4] R00:00:00 CMD_WITH_STRING_ARRAY [alpha, beta, gamma]结构体/对象参数使用花括号键名不加引号R00:00:00 CMD_WITH_STRUCT {fieldName: value, count: 10} R00:00:00 CMD_WITH_NESTED {outer: {inner: 5}, flag: true}多个参数之间用逗号分隔可混合不同类型的参数R00:00:00 CMD_MULTI_ARG simple, [1, 2, 3], {key: value}仓库 Ref 工程的集成测试 TestDeploymentsProject/Ref/test/int/test_seq_complex.seq 给出了真实可用的复杂参数示例覆盖结构体、数组以及“结构体嵌套数组与结构体”的混合场景; Simple struct R00:00:00 Ref.typeDemo.CHOICE_PAIR {firstChoice: ONE, secondChoice: TWO} ; Simple Array R00:00:00 Ref.typeDemo.CHOICES [TWO, BLUE] ; A complex struct of structs and arrays R00:00:00 Ref.typeDemo.GLUTTON_OF_CHOICE {tooManyChoices: [[ONE, BLUE], [TWO, RED]], separateChoice: ONE, choicePair: {firstChoice: ONE, secondChoice: ONE}, choiceAsMemberArray: [2, 5]}由此可见枚举值如ONE、TWO、BLUE、RED、嵌套数组与嵌套结构体均可在序列文件中直接书写。编译样例序列fprime-seqgen命令把.seq文本文件编译为 F´ 飞行软件可执行的二进制格式。使用时需要提供飞行软件字典路径与文本序列文件路径。下面的命令用 Ref 工程的字典编译样例序列注意需要先完成构建否则字典不会生成fprime-seqgen fprime/Gds/examples/simple_sequence.seq -d fprime/build-artifacts/*/Ref/dict/RefTopologyDictionary.json-d等价于--dictionary指定字典 JSON 文件路径Ref 工程构建后字典位于build-artifacts/*/Ref/dict/RefTopologyDictionary.json第一个位置参数是待编译的.seq文件未指定输出文件时默认在同目录下生成一个以.bin结尾的同名二进制文件。仓库集成测试 TestDeploymentsProject/Ref/test/int/ref_integration_test.py 演示了完整的调用形态并使用第三个位置参数显式指定输出路径subprocess.run( [ fprime-seqgen, --dictionary, str(fprime_test_api.dictionaries.dictionary_path), str(sequence), /tmp/ref_test_int.bin, ] )编译得到的二进制文件需要上传到飞行软件。考虑到文件路径长度限制本地运行时建议将其拷贝到/tmp目录集成测试中正是把输出写到/tmp/ref_test_int.bin、/tmp/ref_test_seq.bin等路径。[!NOTE]fprime-seqgen属于 F´ GDS 工具链的一部分可通过fprime-seqgen --help查看全部命令行选项见 Svc::CmdSequencer 组件设计文档。运行二进制序列上传完成后通过任意指令序列器实例的.CS_RUN指令即可运行序列。下面以 Ref 应用的cmdSeq实例为例运行位于/tmp/sample_sequence.bin的序列文件cmdSeq.CS_RUN /tmp/sample_sequence.bin[!NOTE] 样例序列因为包含相对时间指令可能运行数小时才会结束。指令序列器的指令集CS_RUN只是 Svc::CmdSequencer 提供的指令之一。该组件通过 Svc/CmdSequencer/Commands.fppi 定义了完整的控制指令集指令说明CS_RUN fileName, $block运行序列文件$block为Svc.BlockStateBLOCK阻塞等待完成 /NO_BLOCK立即返回。若已有序列在运行本指令会被拒绝并返回执行错误CS_VALIDATE fileName只校验序列文件的格式与 CRC 校验和不执行其中任何指令适合运行前先验证CS_CANCEL取消当前运行中的序列若没有序列在执行则发出警告事件但不报错CS_MANUAL进入手动单步模式随后用CS_RUN加载序列只校验并加载、不执行等待CS_STARTCS_START手动模式下执行序列的第一条指令CS_STEP手动模式下执行CS_START之后的后续指令CS_AUTO从手动模式切回自动模式加载后自动执行只能在无序列运行时可执行若序列正在执行需先CS_CANCEL再CS_AUTOCS_JOIN_WAIT等待正在运行的序列结束后再返回指令响应用于配合NO_BLOCK模式的CS_RUN若没有序列在运行则发出警告并立即返回 OK集成测试 Svc/CmdSequencer/test/int/test_cmd_sequencer.py 完整演练了CS_VALIDATE、CS_RUNBLOCK/NO_BLOCK、CS_MANUAL、CS_START、CS_STEP、CS_CANCEL、CS_AUTO的组合用法例如手动模式下“加载但不执行”使用CS_RUNNO_BLOCK随后用CS_START/CS_STEP逐条推进fprime_test_api.send_and_assert_command( fprime_test_api.get_mnemonic(Svc.CmdSequencer) . CS_MANUAL, max_delay10, ) # Load Sequence but not execute is current SEQ manual (will load sequence only) fprime_test_api.send_and_assert_command( fprime_test_api.get_mnemonic(Svc.CmdSequencer) . CS_RUN, [/tmp/ref_test_seq.bin, NO_BLOCK], max_delay5, )关于序列运行的行为Svc::CmdSequencer 组件设计文档 中的需求条目明确序列文件需通过 CRC 校验ISF-CMDS-002、收到失败指令状态即中止序列ISF-CMDS-004、提供取消指令ISF-CMDS-005以及可配置的每指令超时ISF-CMDS-006。底层FPrimeSequence类在loadFile中完成文件格式校验、CRC 比对与记录反序列化cmdResponseIn端口在指令成功时推进到下一条指令schedIn端口负责检查定时指令是否到期以及指令超时。时间细节序列文件中的时间采用多种格式表示相对时间使用 ISO_8601 时间格式亚秒可选绝对时间使用 ISO_8601 序数日期day of year一年中的第几天加时间格式亚秒可选。类型格式说明示例相对时间RHH:MM:SS[.sss]R后接 ISO_8601 时:分:秒可选亚秒R23:02:01.010绝对时间AYYYY-DDDTHH:MM:SS[.sss]A后接 ISO_8601 序数日期时间格式可选亚秒A2020-192T23:02:01.010[!NOTE] 相对时间不能超过 24 小时。仓库测试序列 Svc/CmdSequencer/test/int/test_seq_wait.seq 展示了相对时间的实际写法其中R00:02:00.050表示相对上一条指令延时 2 分钟 50 毫秒; A test sequence ; R00:00:00 cmdDisp.CMD_NO_OP ; Lets try out some commands with arguments R00:00:01.050 cmdDisp.CMD_NO_OP_STRING SEQ WAIT 2 MINS! ; R00:02:00.050 cmdDisp.CMD_NO_OP_STRING SEQ after 2mins! ; R00:00:01.050 cmdDisp.CMD_NO_OP_STRING SEQ DONE !绝对时间与时间同步风险由于序列可以指定绝对时间若飞行软件的时间未与已知时钟源同步运行绝对时间序列可能存在危险。例如在系统启动早期、尚未从硬件时钟或系统时间源获取时间之前运行序列可能不安全。时间基准Time Base序列可以携带一个预期的时间基准若飞行软件上报的时间系统处于不同时间基准则该序列不会运行。例如使用TB_SC_TIME航天器时间的序列在飞行软件仍使用原始处理器时间、尚未与已知时间源同步时会被阻止运行。可用时间基准如下时间基准值说明TB_PROC_TIME1仅上报原始处理器时间时运行TB_WORKSTATION_TIME2与测试工作站时间同步时运行用于测试TB_SC_TIME3与航天器时间同步时运行TB_FPGA_TIME4与 FPGA/硬件时钟同步时运行TB_DONT_CARE0xFFFF无论飞行软件时间基准如何都运行[!NOTE] 上表描述的是这些时间基准的典型用途实际语义可由项目自行定义例如TB_SC_TIME也可能来源于互联网时间源。时间基准与“不关心”标记0xFFFF会原样写入二进制序列文件的头部字段见下文格式说明。二进制序列格式F Prime Sequence Format了解二进制格式有助于排查序列问题。按 Svc::CmdSequencer 组件设计文档 的规范F´ 序列文件由头部 记录列表 CRC 校验值组成所有数字均以**大端序big-endian**存储头部Header头部字段大小字节说明File Size4头部之后指令记录缓冲区的字节数Number of records4文件中的记录条数Time Base2序列时间基准0xFFFF 不关心即上文的TB_DONT_CAREContext1序列上下文项目自定义0xFF 不关心记录Records每条记录格式如下记录字段大小字节说明Descriptor1记录类型0 绝对时间指令1 相对时间指令2 序列结束Command Time8指令起始时间依描述符为相对或绝对时间前 4 字节为秒后 4 字节为微秒Record Size4指令缓冲区大小Command Buffer 4包含指令包描述符、指令操作码以及零个或多个序列化参数的缓冲区CRC 校验值文件最后 4 字节是对整个文件计算的 CRC由Utils/Hash.hpp计算。CmdSequencer 在加载时即完成 CRC 比对对应需求 ISF-CMDS-002校验失败将拒绝加载。fprime-seqgen的作用正是把本文所述的文本语法时间描述符、助记符、参数翻译成上述二进制布局R/A前缀决定 Descriptor 取 1 或 0文本时间被编码为秒 微秒参数按 F´ 序列化格式写入 Command Buffer最后附加 CRC。场景用序列批量加载参数How-To: 批量加载参数 介绍了fprime-prm-write工具除了生成 PrmDb 直接加载的.dat文件外还可以生成.seq指令序列文件通过 CmdSequencer 批量派发参数设置指令。两种方式都支持全部 F´ 参数类型字符串、数字、布尔、枚举、数组、结构体且.seq方式会生成包含复杂参数语法如数组[1, 2, 3]、结构体{field: value}的序列文件与本指南所述的语法完全一致。若配合--defaults标志工具还会把所有带默认值的参数一并写入序列相当于重置全部参数为默认值除 JSON 中显式指定的参数外。这为“上电后通过序列一键恢复参数配置”提供了标准路径。验证与测试仓库为序列生成与执行提供了完善的集成测试可作实操参考TestDeploymentsProject/Ref/test/int/ref_integration_test.pytest_seqgen与test_seqgen_complex_args分别用简单与复杂参数.seq文件调用fprime-seqgen生成.bin再通过Ref.cmdSeq.CS_RUNBLOCK模式执行Svc/CmdSequencer/test/int/test_cmd_sequencer.py覆盖从生成.seq、编译、上传、CS_AUTO自动运行到手动单步模式的完整链路样例序列文件TestDeploymentsProject/Ref/test/int/test_seq.seq、TestDeploymentsProject/Ref/test/int/test_seq_complex.seq、Svc/CmdSequencer/test/int/test_seq_wait.seq。小结与注意事项回顾编写、编译、运行 F´ 序列的关键要点语法R/A时间前缀 助记符 参数;为注释相对时间不得超过 24 小时参数支持字符串、数字、布尔、枚举、数组[...]、结构体{...}及混合多参数复杂参数可参考 test_seq_complex.seq编译fprime-seqgen 序列文件 -d 字典路径字典需先构建生成输出默认与序列同目录的.bin文件上传二进制序列上传前建议放到/tmp受文件路径长度限制运行cmdSeq.CS_RUN 路径配合CS_VALIDATE预校验、CS_CANCEL中止、CS_MANUAL/CS_START/CS_STEP单步执行时间绝对时间序列有赖于飞行软件时间与已知时间源同步必要时用TB_DONT_CARE0xFFFF绕过时间基准限制或为序列显式指定期望的时间基准。如需深入了解底层实现可继续阅读 Svc::CmdSequencer 组件设计文档 中的组件接口与数据格式章节以及 Svc::CmdDispatcher 组件设计文档。【免费下载链接】fprimeF´ - A flight software and embedded systems framework项目地址: https://gitcode.com/GitHub_Trending/fpr/fprime创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表