嵌入式系统编程【免费下载链接】fprimeF´ - A flight software and embedded systems framework项目地址https://gitcode.com/gh_mirrors/fpri/fprime点击查看免费下载本篇技术指南以 F´F Prime开源仓库中 docs/doxygen/mainpage.md 为骨架系统梳理 F´ 自动生成文档的导航结构并深入剖析其背后的软件分层Fw框架核心、Os操作系统抽象、Svc标准服务组件、Drv硬件驱动与Utils通用工具。读完本文你将掌握 F´ 各包的职责边界、核心端口/类在源码中的实际落点以及如何顺着 Doxygen 文档树快速定位到具体的组件实现与测试代码。一、mainpage.mdF´ 软件描述文档的总入口mainpage.md是 F´ 工程 Doxygen 文档生成体系的主页面mainpage。文件首行的\mainpage指令声明了它在 Doxygen 文档树中的根节点地位随后的一段文字明确了该文档的性质This is the F´ automatically generated documentation. The below guides represent the software description documentation (SDD) for the F´ components.也就是说这份文档是 F´软件描述文档SDD与C 代码文档Namespace 与 Classes 部分的统一入口。文件通过\page与\subpage指令将全部内容划分为五大包package包名文档定位原文职责概括FwCore classes, components, and ports框架核心支撑框架运行的基础类、组件与端口含各类组件的基类与系统核心类型OsOperating system abstraction layer操作系统抽象层互斥量、队列、任务、文件系统等 OS 功能SvcStandard components标准服务组件命令与数据处理组件用于构建更完整的应用DrvDrivers for hardware functions硬件驱动含示例块驱动及 Linux 硬件驱动UtilsClasses for general applications通用工具类面向各种用途的通用类这种组织方式与仓库目录一一对应Fw/、Os/、Svc/、Drv/、Utils/五个顶层目录构成了 F´ 源码阅读与二次开发的地图。二、Fw 包框架核心类、组件与端口mainpage 对Fw包的定位是提供支撑 F´ 的核心类、组件与端口是组件构建的基类所在并特别强调Fw::Types提供了系统中的核心类型。它通过 11 个\subpage展开以下子主题每个子主题都能在源码中找到精确对应2.1 Buffer可序列化缓冲区与 BufferSend/BufferGet 端口FwBufferSerializableBufferGetBufferSend对应 Fw/Buffer/ 目录。其 FPP 模型 Fw/Buffer/Buffer.fpp 定义了type Buffer缓冲区类型port BufferSend(ref fwBuffer: Fw.Buffer)用于发送缓冲区的输出端口port BufferGet($size: U32) - Fw.Buffer按指定大小获取缓冲区的输入端口。缓冲区正是 F´ 组件间传递数据块如遥测包、文件传输数据的标准载体BufferSend与BufferGet形成了借出—归还的典型缓冲管理模型与Svc::BufferManager组件配合实现缓冲池分配。2.2 Cmd命令注册、发送与响应三端口FwCmdFwCmdResponseFwCmdReg对应 Fw/Cmd/Cmd.fpp是 F´ 命令链路的核心接口定义包含port CmdReg(opCode: FwOpcodeType)组件向命令分发器注册自身可处理的命令码port Cmd(opCode, cmdSeq: U32, ref args: CmdArgBuffer)命令分发器向组件下发命令参数经CmdArgBuffer序列化传递enum CmdResponse命令响应状态码取值OK 0、INVALID_OPCODE 1、VALIDATION_ERROR 2、FORMAT_ERROR 3、EXECUTION_ERROR 4、BUSY 5覆盖了命令生命周期中未注册、校验失败、反序列化失败、执行失败、组件忙等全部失败形态port CmdResponse(opCode, cmdSeq, response: CmdResponse)组件向分发器回送执行结果。这套端口被 Svc/CmdDispatcher/ 的CommandDispatcher实现用于将地面指令路由到目标组件并汇总响应。2.3 Com通信包缓冲传递端口FwComPort对应 Fw/Com/Com.fpp定义了数据流遥测下行、上行指令包等传递的通用端口port Com( ref data: ComBuffer Buffer containing packet data context: U32 Call context value; meaning chosen by user )context参数由用户自定义含义如区分通道或方向是下行数据链中连接各处理组件如ComQueue、Framer、GroundInterface的标准接口。2.4 FilePacket文件传输的分组协议FwFilePacketClasses对应 Fw/FilePacket/ 目录。从源码 Fw/FilePacket/FilePacket.hpp 看Fw::FilePacket是一个union 联合体定义了文件传输的四种分组类型typedef enum { T_START 0, //! 起始包 T_DATA 1, //! 数据包 T_END 2, //! 结束包 T_CANCEL 3 //! 取消包 } ...其下配套StartPacket、DataPacket、EndPacket、CancelPacket、Header、PathName等实现类构成完整的文件上行/下行分包协议被 Svc/FileDownlink/ 与 Svc/FileUplink/ 组件实际使用。2.5 Log/LogText事件日志与文本日志双端口FwLogLogText对应 Fw/Log/Log.fpp是 F´ 事件Event报告模型的定义enum LogSeverity事件严重等级FATAL 1致命不可恢复、WARNING_HI 2严重但可恢复、WARNING_LO 3、COMMAND 4指令活动、ACTIVITY_HI 5、ACTIVITY_LO 6、DIAGNOSTIC 7诊断信息port Log($id, ref timeTag: Fw.Time, $severity, ref args: LogBuffer)携带序列化参数的二进制事件端口port LogText($id, ref timeTag, $severity, ref $text: Fw.TextLogString)携带文本消息的文本事件端口文档注释特别提示用于开发与调试飞行时关闭。日志消费方包括 Svc/ActiveLogger/二进制事件记录与 Svc/ActiveTextLogger/、Svc/PassiveConsoleTextLogger/文本输出到控制台或文件。2.6 Obj 与 Port对象注册与端口基类FwObjClasses对应 Fw/Obj/ 目录。基类Fw::ObjBase见 Fw/Obj/ObjBase.hpp是整个ISF 对象类层次的根基按编译开关决定是否存储对象名FW_OBJECT_NAMES 1与提供对象注册FW_OBJECT_REGISTRATION 1SimpleObjRegistry提供最简单的对象注册表实现。FwPortClasses对应 Fw/Port/ 目录。Fw::PortBase见 Fw/Port/PortBase.hpp继承自ObjBase是所有端口的公共基类核心成员是连接对象指针m_connObj并提供了isConnected()连接状态查询当FW_PORT_TRACING 1时还支持全局/单端口调用追踪setTrace、ovrTrace。其派生体系InputPortBase/OutputPortBase/InputSerializePort/OutputSerializePort构成了 F´ 类型化端口机制的基础——正是这种类型化端口连接为系统提供了 README 所称的强编译期正确性保证。2.7 Prm、Time、Tlm参数、时间与遥测端口FwPrmGetPrmSet对应 Fw/Prm/Prm.fpp定义参数**读取PrmGet与写入PrmSet**端口参数值经PrmBuffer序列化由 Svc/PrmDb/ 参数数据库组件实现持久化。FwTimePort对应 Fw/Time/Time.fpp定义port Time(ref $time: Fw.Time)将Fw::Time见 Fw/Time/Time.hpp时间标签注入各组件时间源通常由 Svc/Time/ 或 Svc/LinuxTime/ 提供。FwTlmPort对应 Fw/Tlm/Tlm.fpp定义遥测通道上报Tlm($id, ref timeTag, ref val: TlmBuffer)与按 ID 读取TlmGet两个端口是 Svc/TlmChan/ 遥测通道存储与 Svc/TlmPacketizer/ 遥测组包的关键接口。2.8 Types全系统核心类型FwTypeClasses对应 Fw/Types/ 目录是 mainpage 特别点名的核心。其关键组件包括序列化框架Fw::Serializable见 Fw/Types/Serializable.hpp定义了纯虚接口serialize/deserialize以及SerializeStatus状态枚举——FW_SERIALIZE_OK、FW_SERIALIZE_FORMAT_ERROR、FW_SERIALIZE_NO_ROOM_LEFT、FW_DESERIALIZE_BUFFER_EMPTY、FW_DESERIALIZE_FORMAT_ERROR、FW_DESERIALIZE_SIZE_MISMATCH、FW_DESERIALIZE_TYPE_MISMATCH覆盖了序列化/反序列化的全部成败形态配套的SerializeBufferBase提供对U8/I8/U16/I16/U32/I32/U64/I64/F32/F64/bool/指针/原始缓冲的按位序列化重载且 16/32/64 位整数均受FW_HAS_16_BIT、FW_HAS_32_BIT、FW_HAS_64_BIT编译开关控制——这正是 F´ 支持从 8 位 MCU 到 64 位多核处理器跨平台的关键设计。字符串体系String、StringType、EightyCharString、InternalInterfaceString等长度受限字符串类型分配器抽象MemAllocator及MallocAllocator、MmapAllocator实现类型定义BasicTypes.hpp、PolyType多态类型、SerialBuffer等。三、Os 包操作系统抽象层mainpage 对Os包的定位是为 F´ 提供互斥量、队列、任务与文件系统等基本系统功能。该包以公共实现 平台后端的两段式设计著称从 Os/Queue.hpp 的注释即可印证实现分两部分QueueCommon.cpp存放与 OS 无关的共享代码.cpp文件存放 OS 特定后端如Posix/Queue.cpp。3.1 Queue组件间消息队列队列是 F´ 组件间消息传递的底层机制。Os::Queue见 Os/Queue.hpp提供QueueStatus状态枚举QUEUE_OK、QUEUE_NO_MORE_MSGS、QUEUE_UNINITIALIZED、QUEUE_SIZE_MISMATCH、QUEUE_SEND_ERROR、QUEUE_RECEIVE_ERROR、QUEUE_INVALID_PRIORITY、QUEUE_EMPTY_BUFFER、QUEUE_FULL、QUEUE_UNKNOWN_ERRORQueueBlocking阻塞模式QUEUE_BLOCKING收消息阻塞等待/QUEUE_NONBLOCKING无消息立即返回create(name, depth, msgSize)创建队列send/receive支持序列化缓冲与原始字节两种载荷形态另提供getNumMsgs、getMaxMsgs高水位等诊断查询。平台实现分散在 Os/Posix/IPCQueue.cpp、Os/Pthreads/含 FIFO/优先级两种缓冲队列以及 Os/MacOs/IPCQueueStub.cpp 等文件中。3.2 Task任务/线程抽象Os::Task见 Os/Task.hpp抽象线程创建与调度TaskStatus枚举覆盖TASK_OK、TASK_INVALID_PARAMS、TASK_INVALID_STACK、TASK_UNKNOWN_ERROR、TASK_INVALID_AFFINITY、TASK_DELAY_ERROR、TASK_JOIN_ERROR、TASK_ERROR_RESOURCES、TASK_ERROR_PERMISSION推荐签名start(name, routine, arg, priority, stackSize, cpuAffinity, identifier)并保留一个被DEPRECATED标记的旧签名以提示迁移提供delay、join、suspend、resume、isStarted、CPU 亲和性设置与任务注册表TaskRegistry机制。平台后端见 Os/Posix/Task.cpp、Os/Pthreads/、Os/Baremetal/Task.cpp 等。此外mainpage 中以\subpage OsQueue单列队列主题其余 OS 能力互斥量 Os/Mutex.hpp、文件系统 Os/FileSystem.hpp、目录 Os/Directory.hpp、文件 Os/File.hpp、看门狗 Os/WatchdogTimer.hpp、系统资源 Os/SystemResources.hpp同样遵循该抽象模式。四、Svc 包标准服务组件库mainpage 指出Svc提供命令与数据处理组件用于构建更完整的应用。它通过 25 个\subpage展开与仓库Svc/目录逐项对应可以归纳为几大类命令与序列链路SvcCmdDispatcherComponent→ Svc/CmdDispatcher/命令分发中枢将Fw.Cmd端口收到的指令按 opcode 路由到注册组件SvcCmdSequencerComponent与SvcAMPCSSequenceClass→ Svc/CmdSequencer/命令序列器可加载.fseq序列文件样例见 Svc/CmdSequencer/samples/顺序/时间触发执行支持 AMPCS 序列格式对应 Svc/CmdSequencer/FPrimeSequence.cpp 等实现SvcPingPort→ Svc/Ping/、SvcWatchDogPort→ Svc/WatchDog/、SvcSchedPort→ Svc/Sched/分别为健康检查的 Ping 端口、看门狗端口与周期性调度端口。遥测、参数与健康SvcTlmChanComponent→ Svc/TlmChan/遥测通道数据库SvcTlmPacketizerComponent与SvcTlmPacketizerComponentDictionary→ Svc/TlmPacketizer/按字典将通道组包下行SvcPrmDbComponent→ Svc/PrmDb/参数数据库SvcPolyDbComponent→ Svc/PolyDb/、SvcPolyPort→ Svc/PolyIf/多态参数读写SvcHealthComponent→ Svc/Health/组件健康监控基于 Ping 心跳。日志与会话SvcActiveLoggerComponent→ Svc/ActiveLogger/、SvcActiveTextLoggerComponent→ Svc/ActiveTextLogger/、SvcPassiveConsoleTextLoggerComponent→ Svc/PassiveConsoleTextLogger/事件日志三类消费组件SvcAssertFatalAdapterComponent→ Svc/AssertFatalAdapter/将断言失败适配为致命事件。数据上下行与帧协议SvcFileUplinkComponent→ Svc/FileUplink/、SvcFileDownlinkComponent→ Svc/FileDownlink/、SvcFileManagerComponent→ Svc/FileManager/文件传输与文件系统操作SvcFramerComponent→ Svc/Framer/、SvcDeframerComponent→ Svc/Deframer/、SvcFramingProtocol→ Svc/FramingProtocol/帧封装/解帧与可插拔帧协议如 CCSDSSvcGenericHubComponent→ Svc/GenericHub/、SvcGenericRepeaterComponent通用数据汇聚与转发SvcFatalPort→ Svc/Fatal/、SvcFatalHandlerComponent→ Svc/FatalHandler/致命错误上报与处理如落盘记录SvcBufferManagerComponent→ Svc/BufferManager/缓冲池管理。驱动辅助与时间SvcRateGroupDriverComponent→ Svc/RateGroupDriver/将速率组Rate Group驱动的周期信号分发给多个 Svc/ActiveRateGroup/SvcActiveRateGroupComponentSvcLinuxTimeComponent→ Svc/LinuxTime/Linux 时间源SvcStaticMemoryComponent→ Svc/StaticMemory/静态内存段管理。以上每个组件目录内均同时存在.fpp模型文件接口定义、ComponentImpl.cpp/.hpp实现与test/或docs/单元测试与文档例如Svc/BufferManager.fpp、Svc/CmdDispatcher.fpp等构成模型—实现—验证的完整开发闭环。五、Drv 包硬件驱动mainpage 对Drv的定位是提供支撑各种硬件功能的驱动含示例块驱动以及支持 Linux 硬件功能的各类驱动。其 7 个\subpage对应如下DrvBlockDriverComponent→ Drv/BlockDriver/示例块驱动组件含遥测Drv/BlockDriver/Tlm.fppi与事件定义是编写驱动组件的最佳参照DrvByteStreamDriverModel→ Drv/ByteStreamDriverModel/字节流驱动模型定义了驱动领域的标准端口与状态。从 Drv/ByteStreamDriverModel/ByteStreamDriverModel.fpp 可见SendStatusSEND_OK 0发送成功/SEND_RETRY 1应重试/SEND_ERROR 2发送出错重试可能成功RecvStatusRECV_OK 0/RECV_ERROR 1PollStatusPOLL_OK 0成功收到数据/POLL_RETRY 1暂无数据稍后再试/POLL_ERROR 2以及ByteStreamSend、ByteStreamRecv端口。这一模型为上层组件与底层串口/网络驱动解耦提供了统一契约DrvIp→ Drv/Ip/TCP/UDP 套接字公共实现Drv/Ip/IpSocket.hpp、Drv/Ip/SocketReadTask.hpp 等DrvTcpClient→ Drv/TcpClient/、DrvTcpServer→ Drv/TcpServer/、DrvUdp→ Drv/Udp/TCP 客户端/服务端与 UDP 组件DrvUartFramerComponent对应 Linux UART 驱动 Drv/LinuxUartDriver/含事件 Drv/LinuxUartDriver/Events.fppi 与遥测 Drv/LinuxUartDriver/Telemetry.fppi。仓库Drv/目录还包含GpioDriverPorts、I2cDriverPorts、SpiDriverPorts端口定义以及 Drv/LinuxGpioDriver/、Drv/LinuxI2cDriver/、Drv/LinuxSpiDriver/ 等 Linux 驱动实现与 RPI 示例部署RPI/README.md中的嵌入式场景配套。六、Utils 包通用工具类Utils提供面向各种用途的通用类mainpage 列出四个主题UtilsHashClass→ Utils/Hash/哈希工具CRC 等与 Utils/CRCChecker.hpp 配合用于文件校验UtilsLockGuardClass→ Utils/LockGuard.hppRAII 风格的锁守卫简化互斥量生命周期管理UtilsRateLimiterClass→ Utils/RateLimiter.hpp速率限制器UtilsTokenBucketClass→ Utils/TokenBucket.hpp令牌桶限流器类内定义了MAX_TOKEN_BUCKET_TOKENS 1000的令牌上限基于时间戳依赖 Fw/Time/Time.hpp计算令牌补充速率用于平滑突发流量。从源码结构可以推断Utils的设计目标是提供与具体组件解耦、可在任意 F´ 应用中直接复用的基础能力Utils/test/与Utils/Types/目录则为这些工具提供了单元测试与配套类型。七、如何高效使用这份文档地图顺着\subpage找源码mainpage 中的每个 subpage 名称如SvcCmdDispatcherComponent都对应仓库中一个组件目录如Svc/CmdDispatcher/。阅读任意组件的docs/子目录即可获得该组件的 SDD阅读.fpp文件可查看接口模型。以端口类型为线索追踪数据流F´ 组件间通信全部经过Fw包定义的类型化端口Buffer、Cmd、Com、Log、Tlm、Time、Prm、Sched、Ping等。遇到这个组件和谁连接的问题可在对应.fpp中搜索端口名或查看拓扑文件如 Ref/Top/topology.fpp、RPI/Top/topology.fpp中的连接声明。结合示例部署阅读仓库自带 Ref标准参考应用演示多数系统组件的接线方式与 RPI树莓派嵌入式示例两个可构建部署是理解 mainpage 所列组件如何协作的活教材安装与构建步骤见 docs/INSTALL.md。注意配置开关的裁剪Fw与Os的诸多能力如对象名、对象注册、端口追踪、16/32/64 位序列化由 config/FpConfig.hpp 与 config/FpConfig.fpp 中的编译宏控制跨平台移植时需核对FW_OBJECT_NAMES、FW_PORT_TRACING、FW_HAS_16_BIT等宏的取值。八、总结docs/doxygen/mainpage.md虽然只是 Doxygen 的一页导航但它精确勾勒了 F´ 的架构骨架Fw提供类型化端口与序列化核心Os屏蔽操作系统差异Svc提供开箱即用的服务组件Drv统一硬件访问模型Utils沉淀通用工具。以该页面为索引配合各包源码Fw/Buffer.fpp、Fw/Cmd.fpp、Os/Queue.hpp、Svc/CmdDispatcher.fpp、Drv/ByteStreamDriverModel.fpp等逐一印证即可快速建立对整个框架的完整认知并为后续的组件开发、移植与系统集成打下坚实基础。赞分享嵌入式系统编程【免费下载链接】fprimeF´ - A flight software and embedded systems framework项目地址https://gitcode.com/gh_mirrors/fpri/fprime点击查看免费下载相关推荐F´ 飞行软件框架 C/C 文档生成系统从 Doxygen 主页面到五大核心包的架构导航F´ 飞行软件框架 C/C 文档生成系统从 Doxygen 主页面到五大核心包的架构导航 F´Flight Software and Embedded嵌入式系统编程F´F Prime框架全面导读从 NASA 深空起源到组件化飞行软件架构F´F Prime框架全面导读从 NASA 深空起源到组件化飞行软件架构 F´F Prime是 NASA 喷气推进实验室JPL为小型航天任务打造的嵌入式系统编程Awakened PoE Trade伪属性处理复杂物品修饰符的智能分组算法Awakened PoE Trade伪属性处理复杂物品修饰符的智能分组算法 在《Path of Exile》这款复杂的ARPG游戏中装备和物品往往包含大量复上一篇Wireshark VXLAN协议分析终极指南解密虚拟扩展局域网下一篇Android应用启动优化UltimateAndroidReference中的启动优化工具创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
