平台如何装配与执行¶
Nexus 是静态装配的 C11 MCU 平台,将通用机制与外部产品策略分开。一份人工编写的 TOML 选择精确硬件与可选 adapter;不可变 I/O 接口面暴露所选私有提供者。应用负责执行与恢复。这些是当前设计边界,不代表整个平台已经取得物理资格。
FIG-01 表达当前各层责任。箭头描述已标明的依赖或访问,不是初始化顺序。
层 |
状态与责任 |
|---|---|
Core |
结果、绝对单调截止时间、请求发布与稳定 epoch |
Arch |
编译期 CPU 原语;输入中断掩码、屏障和可选缓存/MPU/SAU |
SoC |
精确芯片时钟、内存、启动、IRQ/DMA 和控制器实现 |
Board |
已审查 PCB 路由、晶振/安全电平事实及明确未知项 |
I/O |
类型化公共接口面与操作合同;不暴露厂商布局 |
可选 OS/owner |
显式逐对象等待、任务或共享资源执行存储 |
可选组件 |
通过窄端口实现有界算法 |
外部产品 |
main、执行任务、角色、私有 PCB、预算、分区与恢复 |
当前源码组织¶
源码树按厂家组织 MCU 系列,按指令集架构组织 CPU 实现。这些目录表达构建期所有权,不增加运行时分派或查找层。公共头文件路径、目标名称和人工配置中的系列标识保持稳定。
源码相邻合同 维护目录映射和各层 README 正文。Native 模型在 Native SoC 包下实现相同的公共 I/O 合同。共享寄存器协议算法只有在参与的 wrapper 分别确认其硅片语义后,才位于 drivers/<kind>/<ip>/。所选 SoC target 直接编译这些私有源文件;目录不会给 FIG-01 增加运行时层。跨厂家 SoC 协作保留在 soc/common/,STM32 identity 访问保留在 soc/stm32/common/。
每个家族的 configure/ 包拥有能力策略、构造器与生命周期生成;Native 使用 soc/native/configure/。显式 provider map 与共享叶子合同保留在 tools/configure/providers/。通用解析、资源仲裁、typed IR 和原子发布仍在 tools/configure/。配置测试仍在 tools/configure/tests/providers/<family>/。这些是构建期 Python 边界,独立于 C 执行路径。
通用组件与选定的 STM32 扩展具有不同的源码所有权。组件都是显式目标;芯片专用目标仍要求精确 SoC、模式和后端,其存在不会扩大公共支持矩阵。
可选网络数据与 boot 边界¶
可选网络 target 将复制 RX 与负载借用 RX 保持为独立、显式选择的协议栈配置;每个镜像选择一种配置。复制 TCP 字节接口面将已接纳的写入复制到有界协议栈存储。负载借用 RX 帧则有复制的可写前缀和不可变的 MAC 原始负载尾段。最后一次 pbuf free 标记已可归还;串行 owner 随后实际归还 MAC 借用。尚存引用或归还失败时,存储与退出责任继续保留。网络装配合同负责定义精确的公共/Storage target、容量和失败规则。这些可选组件符合 FIG-01 的组件边界,不增加 worker 或运行时注册表。
MCUboot 提供独立的控制与完整 boot target;参考配置将应用与 bootloader 链接为两个独立镜像。通用 C11 控制 target 请求或查询 trailer 状态;显式具体 Flash port 为每次 operation 使用调用方持有的 region、有效时钟和一个有限 deadline。只有独立 boot 镜像选择校验与覆盖复制代码。MCUboot 权威合同及所有权图负责定义这些依赖,以及产品复位/恢复责任。所选配置仅提供永久覆盖;部分 trailer 写入仍留下产品恢复责任,不代表有回滚。控制 API不鉴别候选字节,也不启动硬件。源码文档、软件模型和链接预算不建立新的固件候选或物理 HIL 资格。
Platform 与仅 CPU 的 Runtime¶
消费入口 |
提供的装配 |
外部责任 |
|---|---|---|
|
精确 SoC/Board 事实、所选 provider、静态 factory 与显式生命周期 |
产品源码、执行任务、预算、存储区域与恢复 |
|
Core、Arch、公共 I/O 接口面与显式选择的 OS adapter |
启动、向量、内存/时钟事实、Board 接线及具体设备 provider |
一个构建目录只接纳一份解析后的装配。不同板卡或 CPU/安全域镜像使用独立构建目录,由产品构建协调器或 CI 矩阵编排。Runtime 与 Platform 复用相同生产机制,但属于不同的消费模式。
共同 OS 边界是等待/唤醒端口。任务、队列、join 和存储 API 仍为后端专用,包括真实内核控制块类型。产品切换内核时必须显式适配生命周期;平台不提供统一对象池或隐藏调度任务。
构建期决策与运行时工作¶
TOML schema 2 是平台唯一的人工编写输入。解析器将用户意图冻结为 AuthoredAssembly;resolve_ir() 结合经审查的 SoC/Board 事实,校验模式、资源、时钟、IRQ、ABI、DMA 可达性与预算,并直接返回 ConfigurationIR。具名冻结记录为每个决策只保存一份值,不暴露 Mapping 包装接口,也不保存重复的 values。硬件事实叶数据和按键索引仍使用不可变 mapping,resolver 的局部校验草稿也可用字典。这些是明确的数据边界,不承诺为每个 JSON 字段创建独立名义类型。
Factory 和 emitter 消费同一类型化结果。to_dict() 派生 schema-1 resolved.json 审计/产物投影,绝不会将其读回为人工编写的平台输入。私有 typed source epoch 2 与该序列化格式、公共 C factory epoch 分别计代。旧 JSON 装配会被拒绝。历史证据保留原字节与只读校验。CMake 拥有源码依赖图;解析不会从设备名称发现软件,也不会生成产品 worker。
固件执行使用 C11 和必要的架构汇编。Python 在主机上校验输入并生成静态 C/H;MCU 不包含 Python 解释器。硬件算法归 C 实现:寄存器访问、准入、等待、资源取得、回滚、停止和恢复。生成器连接不可变配置、精确实例、factory getter 和固定 IRQ handler。常量地址与简短的类型化调用序列可以继续生成,不增加运行时解释器或另一层分派。
已审查的 Native 和七个 MCU 家族冷态路径将预检、资源取得、准备、启动失败清理与停止行为放在 C 中。共享增强 SPI 准入在取得资源或标记启动失败清理责任之前调用只读 C 检查。H743 fixed-run 暂停/恢复使用 C 资源 owner 和运行时租约 owner。不可达的硬件生成器与未使用的默认 MMIO 宏已删除;纯清理和有意的输出删除分别保留对照。交付完善台账分别记录实现、精确的开发执行与最终集成。
冷态收据证明调用者实际取得了哪些资源。获取被拒绝且收据为空时,不能停止或覆盖已有 owner。部分取得和恢复失败会保留原始快照及未完成的效果,供后续重试;公开外设接口的停止不会丢弃外层 Platform 租约。这些检查通过寄存器模型执行真实 C 辅助函数。Factory 查询与普通 I/O 继续使用现有直接类型化路径。
生成的静态 C 与维护中的 C 使用同一固件工具链。迁移算法改变的是维护和测试责任,并不保证所有配置的资源占用都下降。已记录的 F407 I2C owner 防护对照节省 RAM,但增加 IRQ/DMA 的 Flash 占用。链接资源成本与物理时序各自保留源码、配置和测量要求。
FIG-02 是已核对的编译图。厂商和提供者包含路径保持私有;公共消费工程获得 Nexus 类型及所选编译/链接策略。
FIG-03 表达当前生成流程。未知或冲突选择必须失败;不得通过 Kconfig/缓存/旧头文件回退修补。运行时类型化工厂查找返回已有接口面。平台显式启动成功后,普通操作通过共享 ops 表调用该实例上下文。IRQ 分发固定到提供者实例,不为每个字节重复执行工厂查找。
八个维护中的 provider 各自在 SoC package 根目录拥有纯数据 descriptor.py 元数据,位于 configure/ 之外。通用冻结 FamilyDescriptor 和显式 family-to-module map 仍在 tools/configure/providers/descriptor.py;provider loader 委托该查找,不另建 eager registry。单次 descriptor.maintained() 查找只加载所选元数据,不加载配置行为;providers.maintained() 使用该记录导入所选 configure package。显式枚举、源码快照和 SDK 清单可以读取全部元数据。descriptor 不成为第二份软件源码图。
构造器合同显式命名私有 state、definition、只读 admission、initialization、stop action 和失败初始化责任。admission、initializer 和 stop 列表使用带显式静态引用或常量的不可变 DirectCall;这些字段不能包含自由 C 表达式或 function-pointer/member-call 表达式。definition 仍是生成的静态 C 源码和固定连接;硬件算法直接维护在 C 中。C 编译器建立实际 symbol 和参数类型。模型测试和链接镜像检查仍然必要:这个窄表示不是完整 typed C AST。公共生成器不会从 family 名推断这些决策。所选 STM32F4 官方 LL 操作仍在私有 SoC 状态机内。所选 F407 UART dma-tx 在一个 owner 内使用私有 HAL 有限 TX 和分离的 LL IRQ RX;其他 UART 模式保留既有引擎。静态共享 ops factory 和公共 I/O 合同不变。当前有界的 U575 PWM/UART/RTC/GPIO、H743 SPI 和五个 SoC 的 I2C 操作改动,在既有引擎内部通过编译期选择私有 LL/HAL 调用,没有额外的运行时转发层。这些逐模式集成不会授予其他 family 资格,也不能替代最终 clean-source 证据。见官方驱动集成。
F103/GD303 legacy 选择仅在核对精确厂商寄存器、位、时钟与内存后共享私有算法。TX-only channel-DMA 实例只有紧凑 TX 前缀和 IRQ byte ring;duplex 才增加有限 RX block 扩展。所选方法与直接 IRQ 入口让普通 section GC 移除未使用的 block 代码,不增加运行时转发层或隐式模式回退。
G474 所选 ADC bulb 模式、H743 Cache/domain 政策与 U575 TZEN0 外设均遵守精确 SoC 合同。可选 H743 D2 SRAM1 在 DMA 准入前显式预算并初始化;硬件可达性本身不授权任意地址。有限 RX/ADC block 需要显式 owner service,具有 rearm 间隙。独立 TZEN1 GPIO job 把最多八条命令复制到 Secure 存储,返回后不保留 NonSecure 指针,不构成通用异步 I/O。
生命周期与失败责任¶
FIG-05 表达显式启动与逆序清理。静态接口面可以在启动前和停止后存在;其指针不授予操作未启动硬件的权限。部分失败可能留下不可逆 watchdog 效果或活跃借用。产品必须检查主要结果与清理结果,继续运行真实执行器,并保留隔离资源。平台启动从不启动调度器。
物理 Flash 报告精确 geometry 和 program_flags。ECC fresh-erase 是调用方的真实历史合同:全 FF 读回不能证明 ECC 未被编程,失败脉冲后必须重新擦除。全 FF 输入单元不产生脉冲。已启动的脉冲必须先排空才能返回;过期 deadline 只能阻止后续脉冲,不能取消正在编程的硬件。产品负责可写 region、电压、执行停顿、watchdog 与掉电策略。
可选生成的 diagnosed start/stop 入口把 phase 与 controller 位置写入调用者拥有的冷态存储。不保留 diagnostic 指针,也不替代 primary/cleanup 结果或剩余影响责任。索引含义和失败责任见诊断合同。Factory 诊断映射增加装配局部具名序号和可选不可变标签,不建立 device-ready 状态机或第二个 capability 对象。
成本与取舍¶
32 位接口面包含两个指针,占用八字节只读存储。提供者/模式的 ops 共享;精确可变状态与所选缓冲区分开。间接调用允许同一公共接口服务独立具体提供者与 GoogleMock 端口。成本是一次公共分发以及保留代码/只读表;实际 Flash/RAM 与时序必须在所选链接镜像上测量。
静态装配提前拒绝冲突,裁剪未选择驱动。它不提供热插拔发现、运行时字符串注册表、任意动态时钟变化或自动恢复策略。可选共享 owner 增加显式预算的槽与同步;直接单执行器路径不需要默认 OS 锁或执行任务。