← 返回嵌入式学习资料第 14 章 · 综合设备交付

CHAPTER 14 · INTEGRATED DELIVERY

综合设备交付
让产品可以复现

把需求、软硬件边界、端到端状态、分层验证、供应链身份、发布门禁和现场恢复串成一条证据链;主机路径可以先运行,目标机边界必须诚实保留。

6 个一级单元48 个递进小节主机路径可复现

TEXTBOOK MAP

CHAPTER 14 · MAP

从系统合同到现场恢复

六个一级单元对应六种能力:定义合同、协同设计、串起业务、分层验证、守住供应链、完成发布与维护。

先把系统边界写清
  • 01 需求、预算、风险与追踪
  • 02 器件、接口、BSP 与改版
再把行为集成并验证
  • 03 数据、状态、重试与降级
  • 04 主机、仿真、HIL 与目标机
最后把产品交给现场
  • 05 SBOM、签名、密钥与响应
  • 06 发布、烧录、回滚与支持

小节数量按认知任务变化:合同、协同、集成、验证、安全和发布各自保留连续证据;每个单元都明确无目标板主机路径,并标出电源、热、总线、密钥、工厂与现场边界。

使用方式:先从左侧选择一个产品交付问题,再按合同、协同、集成、验证、安全和发布推进。每个单元底部有前后翻页;小节标题直接说明正在追踪的对象、接口、状态、测试、信任或现场动作。
主机边界:默认使用标准库清单、哈希、状态机、预算、SBOM、门禁和报告模型;没有开发板也能完成合同、接口、故障、验证和发布练习。
目标机边界:真实 SoC、DDR、引脚、电源、总线、Flash、温度、射频、密钥、烧录、断电、用户操作和现场恢复必须回到当前板卡、BSP/内核版本和官方资料。

01 · SYSTEM CONTRACT

系统合同:从需求到可验收指标

综合设备交付的第一步不是选 MCU、Linux 发行版或 OTA 框架,而是把用户动作、物理对象、运行环境、资源预算、时间窗口、失败后果和证据形式写成同一份系统合同。它把产品愿望拆成可验证需求,并为后面的软硬件协同、集成、测试、安全和发布提供稳定的编号。

看懂把用户目标拆成带对象、输入、输出和边界的断言。
说清建立需求—设计—实现—测试—发布的追踪矩阵。
开始做给每个未知项安排负责人、截止条件和安全停止动作。
官方基线SPDX Specification用固定规范描述组件、许可证、版本与供应链交付证据。锁定:3.0.1 · 核对日期:2026-09-05

14.1.1 对象和使用场景

系统合同的第一原则是先写清对象,再写清边界。这里的对象不是一句‘设备’,而是某个板卡、SoC、传感器、执行器、固件版本、分区、服务和用户动作的组合;边界则包括电源、时钟、存储、网络、温度、权限、工具链和资料版本。需求工程把人与设备之间的承诺变成可执行条目只有当对象、输入、机制、输出、时间窗口和验收人同时出现时,‘可用’才是可以重复检查的工程判断。若缺少其中一项,读者只能复述概念,不能在自己的环境中重放结果。

14.1.2 shall 句子与验收指标

系统合同要把抽象目标拆成可观察的断言。例如‘启动快’应改成‘在指定板卡、指定冷启动条件下,从复位释放到服务 readiness 的 p95 不超过某个窗口,串口和时间戳均被保存’;‘更新安全’应改成‘候选镜像来自允许来源、签名和兼容性检查通过、首次健康检查失败会回到已知可启动版本’。需求编号、验收方法、样本和版本每个断言都要有证据类型、生成命令、版本身份和不能推出的结论。

PYTHON · REQUIREMENT GATE
from delivery_model import Requirement, requirement_ok req = Requirement('REQ-BOOT-01', '冷启动进入服务', 'ready_ms', 2500, 'serial+timestamp') print(requirement_ok(req, 1840))

主机检查指标与阈值;冷启动时钟、串口、电源和真实服务仍需目标机证据。

YAML · CONTRACT SHAPE
id: REQ-BOOT-01 metric: ready_ms limit: 2500 evidence: serial+timestamp scope: board-rev-b

字段是合同形状;单位、采样窗口、板卡和版本必须按项目确认。

14.1.3 时间、功耗与资源预算

把机制和结果分开是交付记录的关键。机制描述系统为什么可能达到结果:启动阶段如何交接、接口如何编码、服务如何依赖、数据如何落盘、密钥如何验证、失败如何恢复;结果描述这一次观测到了什么。一个主机状态机、一个 QEMU smoke 或一个 CI 绿灯可以验证机制的某一部分,但不能替代真实 GPIO 电平、DDR 初始化、Flash 掉电、射频质量、热边界和量产密钥的证据。

表 1 · 系统合同:从需求到可验收指标的证据判断表
层次应留下的证据不能直接推出
断言对象/输入/输出/窗口宣传词就是指标
追踪需求→设计→测试→产物一份报告覆盖全链
变化影响/负责人/重验改需求不影响测试

14.1.4 需求来源、假设与未知

证据应形成从输入到结论的可追溯路径:需求编号指向设计决策,设计决策指向源码/配置,源码/配置指向构建产物,产物指向测试记录,测试记录指向版本与设备身份。需求编号、验收方法、样本和版本记录中至少要有采集时间、工具版本、工作负载、样本窗口、失败样例和保留期限。这样审查者可以重算指标,也可以发现某一句结论其实跨越了没有执行的目标机步骤。

14.1.5 追踪矩阵与变更影响

风险管理不是把所有异常都归为‘偶发’。先描述触发条件,再判断影响、发生可能性和可探测性,最后指定预防、检测、降级和恢复动作。指标缺失会把隐患推到现场如果风险没有负责人、门禁或停止条件,它就只是备注;如果只有风险分数没有现场动作,分数也不能让设备回到安全态。对执行器、电源、网络凭据和更新槽位,默认动作应优先保护人身、数据和旧版本可启动性。

图 1.1 · 系统合同:从需求到可验收指标的判断路径每一格都要有自己的条件。
目标用户/场景
约束资源/时间
证据测试/记录
交付版本/责任

从左到右是思考顺序,不是把主机、目标机、工厂和现场证据压缩成一个“通过”。

14.1.6 风险、降级与安全态

主机练习可以从一个小的确定性模型开始:解析 manifest,检查字段,计算摘要,推进状态机,注入超时、截断、重复、缺失和版本不兼容,然后断言系统拒绝危险输入并保留原因。练习的价值不在于假装模拟了芯片,而在于让读者先把输入、输出、错误码和证据格式固定下来。合同也适用于协议、CI 和现场运维迁移到目标板时,要把模型通过的字段与仍需测量的硬件事实逐项对照,不能把‘脚本通过’改写成‘产品通过’。

14.1.7 验收样本与统计窗口

交付包应让另一个人从干净目录开始,而不是依赖作者电脑里的缓存和记忆。README 要说明 Python 版本、安装命令、测试命令、预期输出、可选工具、目标机前置条件和恢复方式;manifest 要列出版本、来源、摘要、许可证和兼容性;evidence 要保存实际运行记录和未执行项。对外发布前再检查压缩包内容、相对路径、可执行权限、换行符和秘密是否被误打包。

14.1.8 本节交付:系统合同卡

复盘时采用单变量改变:保留上一份输入、产物、日志和设备身份,只替换一个条件,例如更换候选版本、缩短超时、断开网络或模拟掉电。比较最后成功阶段、错误分类、状态迁移和恢复动作,才能说明因果。不要同时换 bootloader、内核、rootfs、供电、配置和测试板;那样即使现象改变,也无法知道是哪一个条件造成改变。最后把未知项、停止条件和下一步实验写入交付记录。

CHECKPOINT 14.1把“怎样把‘产品可用’写成跨硬件、固件和现场都能复查的合同?”写成一份可复查记录

请围绕“系统合同:从需求到可验收指标”写出对象与角色、输入和前置条件、接口或状态机制、输出与完成语义、一个资源/安全约束、一个失败路径、恢复动作和对应证据。没有目标板时运行主机路径,并把未执行字段标为未执行;拥有目标机时还要补齐 SoC、板卡 rev、bootloader、内核/BSP、供电、存储、温度、负载、仪器、设备身份和观察条件。不要用一次启动、一个哈希、一个 CI 绿灯或一条现场口述覆盖没有做过的验证。

合格记录要让没有现场上下文的读者知道先查什么、先运行什么、看到什么才算通过,以及哪一句结论仍然不能推出。需求编号、版本身份、SBOM、恢复镜像、权限边界、许可证、已知限制和停止条件都是交付的一部分。

02 · HARDWARE / SOFTWARE CO-DESIGN

软硬件协同:把边界变成接口

硬件与软件不是两条在量产前才汇合的流水线。SoC 选型、内存容量、启动介质、引脚复用、电源树、时钟、总线拓扑、调试口和散热决定软件能观察和恢复到什么程度;软件的采样率、更新策略、日志预算和安全根又会反过来改变器件、分区和接口选择。

看懂用接口合同描述引脚、时钟、电源、总线和版本兼容。
说清在容量、性能、成本、功耗和可维护性之间做可追踪取舍。
开始做把未实现的目标机事实标为边界,而不是用主机结果填空。
官方基线STM32CubeG0课程设备支持、启动代码与示例的锁定来源;链接指向固定 tag。锁定:v1.6.3 · 核对日期:2026-09-05

14.2.1 系统分解与资源所有权

软硬件协同的第一原则是先写清对象,再写清边界。这里的对象不是一句‘设备’,而是某个板卡、SoC、传感器、执行器、固件版本、分区、服务和用户动作的组合;边界则包括电源、时钟、存储、网络、温度、权限、工具链和资料版本。接口的每一列都既有逻辑语义也有物理前置条件只有当对象、输入、机制、输出、时间窗口和验收人同时出现时,‘可用’才是可以重复检查的工程判断。若缺少其中一项,读者只能复述概念,不能在自己的环境中重放结果。

14.2.2 引脚复用与电气合同

系统合同要把抽象目标拆成可观察的断言。例如‘启动快’应改成‘在指定板卡、指定冷启动条件下,从复位释放到服务 readiness 的 p95 不超过某个窗口,串口和时间戳均被保存’;‘更新安全’应改成‘候选镜像来自允许来源、签名和兼容性检查通过、首次健康检查失败会回到已知可启动版本’。原理图、BOM、波形和版本矩阵每个断言都要有证据类型、生成命令、版本身份和不能推出的结论。

PYTHON · INTERFACE DIGEST
from delivery_model import interface_digest fields = {'board': 'rev-b', 'i2c': '400kHz', 'vdd': '3.3V'} print(interface_digest(fields))

主机确认接口清单稳定;电平、波形、时钟抖动和器件容差仍需目标机测量。

C · RESOURCE OWNER
typedef struct { const char *owner; unsigned long base; unsigned irq; } resource_owner_t; /* board revision and electrical limits stay in the BSP contract */

结构展示资源所有权;地址、IRQ、引脚和电气限制必须来自当前板卡资料。

14.2.3 时钟、复位与电源时序

把机制和结果分开是交付记录的关键。机制描述系统为什么可能达到结果:启动阶段如何交接、接口如何编码、服务如何依赖、数据如何落盘、密钥如何验证、失败如何恢复;结果描述这一次观测到了什么。一个主机状态机、一个 QEMU smoke 或一个 CI 绿灯可以验证机制的某一部分,但不能替代真实 GPIO 电平、DDR 初始化、Flash 掉电、射频质量、热边界和量产密钥的证据。

表 2 · 软硬件协同:把边界变成接口的证据判断表
层次应留下的证据不能直接推出
资源所有者/范围/版本地址清单就是电气合同
接口pin/clock/power/bus参考设计无需复核
边界BSP/driver/application板卡改版透明兼容

14.2.4 存储、内存与带宽预算

证据应形成从输入到结论的可追溯路径:需求编号指向设计决策,设计决策指向源码/配置,源码/配置指向构建产物,产物指向测试记录,测试记录指向版本与设备身份。原理图、BOM、波形和版本矩阵记录中至少要有采集时间、工具版本、工作负载、样本窗口、失败样例和保留期限。这样审查者可以重算指标,也可以发现某一句结论其实跨越了没有执行的目标机步骤。

14.2.5 总线拓扑与协议版本

风险管理不是把所有异常都归为‘偶发’。先描述触发条件,再判断影响、发生可能性和可探测性,最后指定预防、检测、降级和恢复动作。错误边界会在量产后变成返工如果风险没有负责人、门禁或停止条件,它就只是备注;如果只有风险分数没有现场动作,分数也不能让设备回到安全态。对执行器、电源、网络凭据和更新槽位,默认动作应优先保护人身、数据和旧版本可启动性。

图 2.1 · 软硬件协同:把边界变成接口的判断路径每一格都要有自己的条件。
硬件器件/电源
接口pin/bus/clock
软件BSP/driver
验证波形/温升

从左到右是思考顺序,不是把主机、目标机、工厂和现场证据压缩成一个“通过”。

14.2.6 BSP、HAL 与驱动边界

主机练习可以从一个小的确定性模型开始:解析 manifest,检查字段,计算摘要,推进状态机,注入超时、截断、重复、缺失和版本不兼容,然后断言系统拒绝危险输入并保留原因。练习的价值不在于假装模拟了芯片,而在于让读者先把输入、输出、错误码和证据格式固定下来。协同合同也适用于云端 API 和模块化系统迁移到目标板时,要把模型通过的字段与仍需测量的硬件事实逐项对照,不能把‘脚本通过’改写成‘产品通过’。

14.2.7 板卡改版与兼容矩阵

交付包应让另一个人从干净目录开始,而不是依赖作者电脑里的缓存和记忆。README 要说明 Python 版本、安装命令、测试命令、预期输出、可选工具、目标机前置条件和恢复方式;manifest 要列出版本、来源、摘要、许可证和兼容性;evidence 要保存实际运行记录和未执行项。对外发布前再检查压缩包内容、相对路径、可执行权限、换行符和秘密是否被误打包。

14.2.8 本节交付:协同接口卡

复盘时采用单变量改变:保留上一份输入、产物、日志和设备身份,只替换一个条件,例如更换候选版本、缩短超时、断开网络或模拟掉电。比较最后成功阶段、错误分类、状态迁移和恢复动作,才能说明因果。不要同时换 bootloader、内核、rootfs、供电、配置和测试板;那样即使现象改变,也无法知道是哪一个条件造成改变。最后把未知项、停止条件和下一步实验写入交付记录。

CHECKPOINT 14.2把“硬件选择和软件架构怎样共同决定可维护、可测试和可恢复的产品?”写成一份可复查记录

请围绕“软硬件协同:把边界变成接口”写出对象与角色、输入和前置条件、接口或状态机制、输出与完成语义、一个资源/安全约束、一个失败路径、恢复动作和对应证据。没有目标板时运行主机路径,并把未执行字段标为未执行;拥有目标机时还要补齐 SoC、板卡 rev、bootloader、内核/BSP、供电、存储、温度、负载、仪器、设备身份和观察条件。不要用一次启动、一个哈希、一个 CI 绿灯或一条现场口述覆盖没有做过的验证。

合格记录要让没有现场上下文的读者知道先查什么、先运行什么、看到什么才算通过,以及哪一句结论仍然不能推出。需求编号、版本身份、SBOM、恢复镜像、权限边界、许可证、已知限制和停止条件都是交付的一部分。

03 · END-TO-END INTEGRATION

端到端集成:数据、状态与故障

集成阶段要把启动链、驱动、协议、业务状态、存储、服务和外部系统串起来。单元测试分别通过并不等于端到端行为正确:数据可能单位错、时间戳漂移、队列溢出、重试重复执行、状态机卡死,或在网络和电源变化时触发危险动作。

看懂用数据字典、状态机和时间线描述完整业务路径。
说清让超时、重试、断线、重复和部分完成都有明确语义。
开始做保留跨层关联 ID,使故障能从输出追到输入。
官方基线STM32CubeG0课程设备支持、启动代码与示例的锁定来源;链接指向固定 tag。锁定:v1.6.3 · 核对日期:2026-09-05

14.3.1 数据字典和单位

端到端集成的第一原则是先写清对象,再写清边界。这里的对象不是一句‘设备’,而是某个板卡、SoC、传感器、执行器、固件版本、分区、服务和用户动作的组合;边界则包括电源、时钟、存储、网络、温度、权限、工具链和资料版本。完整业务链的正确性来自跨层不变量而不是某个函数返回值只有当对象、输入、机制、输出、时间窗口和验收人同时出现时,‘可用’才是可以重复检查的工程判断。若缺少其中一项,读者只能复述概念,不能在自己的环境中重放结果。

14.3.2 时间戳、序列与关联 ID

系统合同要把抽象目标拆成可观察的断言。例如‘启动快’应改成‘在指定板卡、指定冷启动条件下,从复位释放到服务 readiness 的 p95 不超过某个窗口,串口和时间戳均被保存’;‘更新安全’应改成‘候选镜像来自允许来源、签名和兼容性检查通过、首次健康检查失败会回到已知可启动版本’。帧、状态、关联 ID 和输出测量每个断言都要有证据类型、生成命令、版本身份和不能推出的结论。

PYTHON · STATE REPLAY
from delivery_model import transition state = 'READY' for event in ('SENSOR_SAMPLE', 'NETWORK_LOST', 'RECOVERED'): state = transition(state, event) print(state)

主机重放状态和故障;传感器噪声、总线仲裁和执行器动作仍需目标机。

JSON · EVENT FRAME
{"schema":"device.event.v1","seq":42,"kind":"sample","unit":"degC","value":23.5,"correlation_id":"job-7"}

帧示例固定字段与单位;端序、CRC、链路时序和真实数据质量要在设备上验收。

14.3.3 状态机与不变量

把机制和结果分开是交付记录的关键。机制描述系统为什么可能达到结果:启动阶段如何交接、接口如何编码、服务如何依赖、数据如何落盘、密钥如何验证、失败如何恢复;结果描述这一次观测到了什么。一个主机状态机、一个 QEMU smoke 或一个 CI 绿灯可以验证机制的某一部分,但不能替代真实 GPIO 电平、DDR 初始化、Flash 掉电、射频质量、热边界和量产密钥的证据。

表 3 · 端到端集成:数据、状态与故障的证据判断表
层次应留下的证据不能直接推出
数据schema/unit/seq/time消息到达就是成功
状态invariant/timeout/retry重试天然幂等
输出actuator/quality/fault驱动通过就是业务通过

14.3.4 队列、背压与丢弃策略

证据应形成从输入到结论的可追溯路径:需求编号指向设计决策,设计决策指向源码/配置,源码/配置指向构建产物,产物指向测试记录,测试记录指向版本与设备身份。帧、状态、关联 ID 和输出测量记录中至少要有采集时间、工具版本、工作负载、样本窗口、失败样例和保留期限。这样审查者可以重算指标,也可以发现某一句结论其实跨越了没有执行的目标机步骤。

14.3.5 超时、重试与幂等

风险管理不是把所有异常都归为‘偶发’。先描述触发条件,再判断影响、发生可能性和可探测性,最后指定预防、检测、降级和恢复动作。跨层丢失上下文会让定位变慢如果风险没有负责人、门禁或停止条件,它就只是备注;如果只有风险分数没有现场动作,分数也不能让设备回到安全态。对执行器、电源、网络凭据和更新槽位,默认动作应优先保护人身、数据和旧版本可启动性。

图 3.1 · 端到端集成:数据、状态与故障的判断路径每一格都要有自己的条件。
输入sensor/frame
状态event/queue
决定policy/command
输出actuator/evidence

从左到右是思考顺序,不是把主机、目标机、工厂和现场证据压缩成一个“通过”。

14.3.6 部分失败与降级模式

主机练习可以从一个小的确定性模型开始:解析 manifest,检查字段,计算摘要,推进状态机,注入超时、截断、重复、缺失和版本不兼容,然后断言系统拒绝危险输入并保留原因。练习的价值不在于假装模拟了芯片,而在于让读者先把输入、输出、错误码和证据格式固定下来。端到端方法可迁移到任何事件驱动系统迁移到目标板时,要把模型通过的字段与仍需测量的硬件事实逐项对照,不能把‘脚本通过’改写成‘产品通过’。

14.3.7 端到端延迟与质量指标

交付包应让另一个人从干净目录开始,而不是依赖作者电脑里的缓存和记忆。README 要说明 Python 版本、安装命令、测试命令、预期输出、可选工具、目标机前置条件和恢复方式;manifest 要列出版本、来源、摘要、许可证和兼容性;evidence 要保存实际运行记录和未执行项。对外发布前再检查压缩包内容、相对路径、可执行权限、换行符和秘密是否被误打包。

14.3.8 本节交付:集成场景卡

复盘时采用单变量改变:保留上一份输入、产物、日志和设备身份,只替换一个条件,例如更换候选版本、缩短超时、断开网络或模拟掉电。比较最后成功阶段、错误分类、状态迁移和恢复动作,才能说明因果。不要同时换 bootloader、内核、rootfs、供电、配置和测试板;那样即使现象改变,也无法知道是哪一个条件造成改变。最后把未知项、停止条件和下一步实验写入交付记录。

CHECKPOINT 14.3把“一条从传感器到执行器的业务链,怎样在不同状态和故障下保持可解释?”写成一份可复查记录

请围绕“端到端集成:数据、状态与故障”写出对象与角色、输入和前置条件、接口或状态机制、输出与完成语义、一个资源/安全约束、一个失败路径、恢复动作和对应证据。没有目标板时运行主机路径,并把未执行字段标为未执行;拥有目标机时还要补齐 SoC、板卡 rev、bootloader、内核/BSP、供电、存储、温度、负载、仪器、设备身份和观察条件。不要用一次启动、一个哈希、一个 CI 绿灯或一条现场口述覆盖没有做过的验证。

合格记录要让没有现场上下文的读者知道先查什么、先运行什么、看到什么才算通过,以及哪一句结论仍然不能推出。需求编号、版本身份、SBOM、恢复镜像、权限边界、许可证、已知限制和停止条件都是交付的一部分。

04 · VERIFICATION AND VALIDATION

验证与确认:从主机到现场

验证回答‘实现是否满足规定’,确认回答‘规定的东西是否解决了真实问题’。综合设备需要分层测试:纯函数和状态机在主机,接口和启动在仿真或 QEMU,驱动和时序在 HIL/实验室,温度、电源、射频、机械、长期运行和用户流程在目标机。每层都应明确能证明什么、不能证明什么。

看懂建立从快速检查到现场演练的分层门禁。
说清用确定性样本、边界样本和故障注入覆盖关键路径。
开始做把目标机未执行项显式保留,避免用绿色 CI 过度宣称。
官方基线SPDX Specification用固定规范描述组件、许可证、版本与供应链交付证据。锁定:3.0.1 · 核对日期:2026-09-05

14.4.1 验证与确认的区别

验证与确认的第一原则是先写清对象,再写清边界。这里的对象不是一句‘设备’,而是某个板卡、SoC、传感器、执行器、固件版本、分区、服务和用户动作的组合;边界则包括电源、时钟、存储、网络、温度、权限、工具链和资料版本。分层测试让每个问题在最便宜且最有解释力的层被发现只有当对象、输入、机制、输出、时间窗口和验收人同时出现时,‘可用’才是可以重复检查的工程判断。若缺少其中一项,读者只能复述概念,不能在自己的环境中重放结果。

14.4.2 测试金字塔与门禁顺序

系统合同要把抽象目标拆成可观察的断言。例如‘启动快’应改成‘在指定板卡、指定冷启动条件下,从复位释放到服务 readiness 的 p95 不超过某个窗口,串口和时间戳均被保存’;‘更新安全’应改成‘候选镜像来自允许来源、签名和兼容性检查通过、首次健康检查失败会回到已知可启动版本’。测试命令、种子、设备身份和边界每个断言都要有证据类型、生成命令、版本身份和不能推出的结论。

PYTHON · TEST MATRIX
from delivery_model import test_verdict print(test_verdict(100, 101, tolerance=2)) print(test_verdict(100, 105, tolerance=2))

主机验证判定逻辑;仪器精度、负载、温度和目标机重复性仍需补证。

SHELL · CLEAN RUN
python -m venv .venv python -m pip install --upgrade pip python run_all_tests.py python -m pip check

命令适用于实验包主机路径;不代表交叉工具链、QEMU 或板卡已经可用。

14.4.3 边界、性质与黄金样本

把机制和结果分开是交付记录的关键。机制描述系统为什么可能达到结果:启动阶段如何交接、接口如何编码、服务如何依赖、数据如何落盘、密钥如何验证、失败如何恢复;结果描述这一次观测到了什么。一个主机状态机、一个 QEMU smoke 或一个 CI 绿灯可以验证机制的某一部分,但不能替代真实 GPIO 电平、DDR 初始化、Flash 掉电、射频质量、热边界和量产密钥的证据。

表 4 · 验证与确认:从主机到现场的证据判断表
层次应留下的证据不能直接推出
层级host/QEMU/HIL/target仿真等于现场
样本normal/boundary/fault覆盖率等于正确性
结论evidence/scope/stop重试绿色可消除失败

14.4.4 QEMU、仿真与 HIL 边界

证据应形成从输入到结论的可追溯路径:需求编号指向设计决策,设计决策指向源码/配置,源码/配置指向构建产物,产物指向测试记录,测试记录指向版本与设备身份。测试命令、种子、设备身份和边界记录中至少要有采集时间、工具版本、工作负载、样本窗口、失败样例和保留期限。这样审查者可以重算指标,也可以发现某一句结论其实跨越了没有执行的目标机步骤。

14.4.5 故障注入和可恢复性

风险管理不是把所有异常都归为‘偶发’。先描述触发条件,再判断影响、发生可能性和可探测性,最后指定预防、检测、降级和恢复动作。错层验证会制造虚假的信心如果风险没有负责人、门禁或停止条件,它就只是备注;如果只有风险分数没有现场动作,分数也不能让设备回到安全态。对执行器、电源、网络凭据和更新槽位,默认动作应优先保护人身、数据和旧版本可启动性。

图 4.1 · 验证与确认:从主机到现场的判断路径每一格都要有自己的条件。
主机fast/deterministic
仿真shape/timing
目标机physical/fault
现场user/long-run

从左到右是思考顺序,不是把主机、目标机、工厂和现场证据压缩成一个“通过”。

14.4.6 重复性、随机种子与 flaky

主机练习可以从一个小的确定性模型开始:解析 manifest,检查字段,计算摘要,推进状态机,注入超时、截断、重复、缺失和版本不兼容,然后断言系统拒绝危险输入并保留原因。练习的价值不在于假装模拟了芯片,而在于让读者先把输入、输出、错误码和证据格式固定下来。分层门禁同样适用于数据管道和服务发布迁移到目标板时,要把模型通过的字段与仍需测量的硬件事实逐项对照,不能把‘脚本通过’改写成‘产品通过’。

14.4.7 覆盖率、指标和停止条件

交付包应让另一个人从干净目录开始,而不是依赖作者电脑里的缓存和记忆。README 要说明 Python 版本、安装命令、测试命令、预期输出、可选工具、目标机前置条件和恢复方式;manifest 要列出版本、来源、摘要、许可证和兼容性;evidence 要保存实际运行记录和未执行项。对外发布前再检查压缩包内容、相对路径、可执行权限、换行符和秘密是否被误打包。

14.4.8 本节交付:分层验证卡

复盘时采用单变量改变:保留上一份输入、产物、日志和设备身份,只替换一个条件,例如更换候选版本、缩短超时、断开网络或模拟掉电。比较最后成功阶段、错误分类、状态迁移和恢复动作,才能说明因果。不要同时换 bootloader、内核、rootfs、供电、配置和测试板;那样即使现象改变,也无法知道是哪一个条件造成改变。最后把未知项、停止条件和下一步实验写入交付记录。

CHECKPOINT 14.4把“怎样安排主机、仿真、实验室和目标机证据,既高效又不越界?”写成一份可复查记录

请围绕“验证与确认:从主机到现场”写出对象与角色、输入和前置条件、接口或状态机制、输出与完成语义、一个资源/安全约束、一个失败路径、恢复动作和对应证据。没有目标板时运行主机路径,并把未执行字段标为未执行;拥有目标机时还要补齐 SoC、板卡 rev、bootloader、内核/BSP、供电、存储、温度、负载、仪器、设备身份和观察条件。不要用一次启动、一个哈希、一个 CI 绿灯或一条现场口述覆盖没有做过的验证。

合格记录要让没有现场上下文的读者知道先查什么、先运行什么、看到什么才算通过,以及哪一句结论仍然不能推出。需求编号、版本身份、SBOM、恢复镜像、权限边界、许可证、已知限制和停止条件都是交付的一部分。

05 · SUPPLY CHAIN AND SECURITY

安全与供应链:版本、来源与密钥

安全不是发布前贴上的标签,而是从依赖选择、源码获取、构建环境、SBOM、签名、密钥保管、调试口、工厂身份到更新撤销的一条链。供应链证据要同时回答‘用了什么’‘从哪来’‘谁批准’‘如何验证’和‘出了问题怎样止损’。

看懂为源码、依赖、产物和配置建立可审计身份。
说清区分完整性、真实性、机密性、授权和可撤销性。
开始做把密钥、SBOM、许可证、调试入口和漏洞响应纳入门禁。
官方基线SPDX Specification用固定规范描述组件、许可证、版本与供应链交付证据。锁定:3.0.1 · 核对日期:2026-09-05

14.5.1 依赖、来源与版本锁定

安全与供应链的第一原则是先写清对象,再写清边界。这里的对象不是一句‘设备’,而是某个板卡、SoC、传感器、执行器、固件版本、分区、服务和用户动作的组合;边界则包括电源、时钟、存储、网络、温度、权限、工具链和资料版本。每个产物都需要可追踪身份和可撤销的信任关系只有当对象、输入、机制、输出、时间窗口和验收人同时出现时,‘可用’才是可以重复检查的工程判断。若缺少其中一项,读者只能复述概念,不能在自己的环境中重放结果。

14.5.2 SBOM 与许可证证据

系统合同要把抽象目标拆成可观察的断言。例如‘启动快’应改成‘在指定板卡、指定冷启动条件下,从复位释放到服务 readiness 的 p95 不超过某个窗口,串口和时间戳均被保存’;‘更新安全’应改成‘候选镜像来自允许来源、签名和兼容性检查通过、首次健康检查失败会回到已知可启动版本’。SBOM、来源摘要、签名和密钥角色每个断言都要有证据类型、生成命令、版本身份和不能推出的结论。

PYTHON · SBOM CHECK
from delivery_model import sbom_entry, sbom_ok entries = [sbom_entry('demo', '1.0.0', 'MIT', 'https://example.invalid/demo')] print(sbom_ok(entries))

主机检查来源、版本和许可证字段;签名、密钥注入和调试锁需要目标机/工厂证据。

JSON · RELEASE IDENTITY
{"version":"14.0.0","source_commit":"abc123","sbom":"SPDX-2.3","signature":"detached.sig","rollback_index":7}

manifest 记录身份关系;真正的信任根、计数器和撤销策略须按产品安全架构验证。

14.5.3 哈希、签名与信任根

把机制和结果分开是交付记录的关键。机制描述系统为什么可能达到结果:启动阶段如何交接、接口如何编码、服务如何依赖、数据如何落盘、密钥如何验证、失败如何恢复;结果描述这一次观测到了什么。一个主机状态机、一个 QEMU smoke 或一个 CI 绿灯可以验证机制的某一部分,但不能替代真实 GPIO 电平、DDR 初始化、Flash 掉电、射频质量、热边界和量产密钥的证据。

表 5 · 安全与供应链:版本、来源与密钥的证据判断表
层次应留下的证据不能直接推出
组成source/dependency/SBOM扫描一次永远有效
信任hash/sign/key摘要就是批准
响应revoke/rollback/support漏洞只需发公告

14.5.4 安全启动和测量启动

证据应形成从输入到结论的可追溯路径:需求编号指向设计决策,设计决策指向源码/配置,源码/配置指向构建产物,产物指向测试记录,测试记录指向版本与设备身份。SBOM、来源摘要、签名和密钥角色记录中至少要有采集时间、工具版本、工作负载、样本窗口、失败样例和保留期限。这样审查者可以重算指标,也可以发现某一句结论其实跨越了没有执行的目标机步骤。

14.5.5 密钥角色、注入和轮换

风险管理不是把所有异常都归为‘偶发’。先描述触发条件,再判断影响、发生可能性和可探测性,最后指定预防、检测、降级和恢复动作。信任链断点会让修复变成紧急返厂如果风险没有负责人、门禁或停止条件,它就只是备注;如果只有风险分数没有现场动作,分数也不能让设备回到安全态。对执行器、电源、网络凭据和更新槽位,默认动作应优先保护人身、数据和旧版本可启动性。

图 5.1 · 安全与供应链:版本、来源与密钥的判断路径每一格都要有自己的条件。
来源source/dependency
构建provenance/SBOM
信任key/signature
响应revoke/recover

从左到右是思考顺序,不是把主机、目标机、工厂和现场证据压缩成一个“通过”。

14.5.6 调试口、权限和最小暴露

主机练习可以从一个小的确定性模型开始:解析 manifest,检查字段,计算摘要,推进状态机,注入超时、截断、重复、缺失和版本不兼容,然后断言系统拒绝危险输入并保留原因。练习的价值不在于假装模拟了芯片,而在于让读者先把输入、输出、错误码和证据格式固定下来。供应链治理也适用于网站和实验包迁移到目标板时,要把模型通过的字段与仍需测量的硬件事实逐项对照,不能把‘脚本通过’改写成‘产品通过’。

14.5.7 漏洞、撤销与回滚保护

交付包应让另一个人从干净目录开始,而不是依赖作者电脑里的缓存和记忆。README 要说明 Python 版本、安装命令、测试命令、预期输出、可选工具、目标机前置条件和恢复方式;manifest 要列出版本、来源、摘要、许可证和兼容性;evidence 要保存实际运行记录和未执行项。对外发布前再检查压缩包内容、相对路径、可执行权限、换行符和秘密是否被误打包。

14.5.8 本节交付:供应链安全卡

复盘时采用单变量改变:保留上一份输入、产物、日志和设备身份,只替换一个条件,例如更换候选版本、缩短超时、断开网络或模拟掉电。比较最后成功阶段、错误分类、状态迁移和恢复动作,才能说明因果。不要同时换 bootloader、内核、rootfs、供电、配置和测试板;那样即使现象改变,也无法知道是哪一个条件造成改变。最后把未知项、停止条件和下一步实验写入交付记录。

CHECKPOINT 14.5把“怎样让读者和现场相信交付物来自允许来源、没有越界功能且可以撤销?”写成一份可复查记录

请围绕“安全与供应链:版本、来源与密钥”写出对象与角色、输入和前置条件、接口或状态机制、输出与完成语义、一个资源/安全约束、一个失败路径、恢复动作和对应证据。没有目标板时运行主机路径,并把未执行字段标为未执行;拥有目标机时还要补齐 SoC、板卡 rev、bootloader、内核/BSP、供电、存储、温度、负载、仪器、设备身份和观察条件。不要用一次启动、一个哈希、一个 CI 绿灯或一条现场口述覆盖没有做过的验证。

合格记录要让没有现场上下文的读者知道先查什么、先运行什么、看到什么才算通过,以及哪一句结论仍然不能推出。需求编号、版本身份、SBOM、恢复镜像、权限边界、许可证、已知限制和停止条件都是交付的一部分。

06 · RELEASE AND FIELD

发布与现场:可恢复的产品交付

交付的终点不是生成一个 ZIP 或刷入一次镜像,而是让不同角色在明确权限下完成同一条可复查路径。发布包要包含版本清单、构建与测试证据、目标机说明、恢复介质、回滚策略、SBOM/签名、已知限制和支持窗口;现场流程还要处理断电、网络中断、批次差异和用户误操作。

看懂设计从干净主机到现场设备的最短可复现路径。
说清让发布门禁同时检查功能、安全、合规、恢复和可维护性。
开始做明确读者没有目标板时可完成什么,拥有什么设备时还要补什么。
官方基线SPDX Specification用固定规范描述组件、许可证、版本与供应链交付证据。锁定:3.0.1 · 核对日期:2026-09-05

14.6.1 发布角色与环境

发布与现场的第一原则是先写清对象,再写清边界。这里的对象不是一句‘设备’,而是某个板卡、SoC、传感器、执行器、固件版本、分区、服务和用户动作的组合;边界则包括电源、时钟、存储、网络、温度、权限、工具链和资料版本。发布是一项跨角色的操作合同而不是一个文件名只有当对象、输入、机制、输出、时间窗口和验收人同时出现时,‘可用’才是可以重复检查的工程判断。若缺少其中一项,读者只能复述概念,不能在自己的环境中重放结果。

14.6.2 manifest、版本和包结构

系统合同要把抽象目标拆成可观察的断言。例如‘启动快’应改成‘在指定板卡、指定冷启动条件下,从复位释放到服务 readiness 的 p95 不超过某个窗口,串口和时间戳均被保存’;‘更新安全’应改成‘候选镜像来自允许来源、签名和兼容性检查通过、首次健康检查失败会回到已知可启动版本’。manifest、烧录、健康、回滚和支持记录每个断言都要有证据类型、生成命令、版本身份和不能推出的结论。

PYTHON · RELEASE GATE
from delivery_model import release_gate print(release_gate(host_ok=True, target_ok=False, recovery_image=True, sbom_ok=True, known_limits=['RF not run']))

主机提醒门禁缺口;目标机、工厂烧录、断电恢复和现场 runbook 不能由模型伪造。

SHELL · PACKAGE CHECK
python run_all_tests.py python -c "import json; print(json.load(open('examples/release_manifest.json'))['version'])" python -m pip check

命令确认包能运行;版本、签名、设备身份和支持窗口仍要由发布流程补齐。

14.6.3 烧录、身份与工厂记录

把机制和结果分开是交付记录的关键。机制描述系统为什么可能达到结果:启动阶段如何交接、接口如何编码、服务如何依赖、数据如何落盘、密钥如何验证、失败如何恢复;结果描述这一次观测到了什么。一个主机状态机、一个 QEMU smoke 或一个 CI 绿灯可以验证机制的某一部分,但不能替代真实 GPIO 电平、DDR 初始化、Flash 掉电、射频质量、热边界和量产密钥的证据。

表 6 · 发布与现场:可恢复的产品交付的证据判断表
层次应留下的证据不能直接推出
包manifest/docs/testsZIP 就是产品
设备flash/health/identity刷入成功就是交付
现场observe/recover/runbook工程师口述足够

14.6.4 健康检查与升级窗口

证据应形成从输入到结论的可追溯路径:需求编号指向设计决策,设计决策指向源码/配置,源码/配置指向构建产物,产物指向测试记录,测试记录指向版本与设备身份。manifest、烧录、健康、回滚和支持记录记录中至少要有采集时间、工具版本、工作负载、样本窗口、失败样例和保留期限。这样审查者可以重算指标,也可以发现某一句结论其实跨越了没有执行的目标机步骤。

14.6.5 断电、网络中断与回滚

风险管理不是把所有异常都归为‘偶发’。先描述触发条件,再判断影响、发生可能性和可探测性,最后指定预防、检测、降级和恢复动作。不可恢复的升级会把软件错误变成硬件返修如果风险没有负责人、门禁或停止条件,它就只是备注;如果只有风险分数没有现场动作,分数也不能让设备回到安全态。对执行器、电源、网络凭据和更新槽位,默认动作应优先保护人身、数据和旧版本可启动性。

图 6.1 · 发布与现场:可恢复的产品交付的判断路径每一格都要有自己的条件。
主机README/tests
产物manifest/SBOM
设备flash/health
现场rollback/support

从左到右是思考顺序,不是把主机、目标机、工厂和现场证据压缩成一个“通过”。

14.6.6 日志、指标与远程支持

主机练习可以从一个小的确定性模型开始:解析 manifest,检查字段,计算摘要,推进状态机,注入超时、截断、重复、缺失和版本不兼容,然后断言系统拒绝危险输入并保留原因。练习的价值不在于假装模拟了芯片,而在于让读者先把输入、输出、错误码和证据格式固定下来。发布卡可以迁移到任何需要长期维护的产品迁移到目标板时,要把模型通过的字段与仍需测量的硬件事实逐项对照,不能把‘脚本通过’改写成‘产品通过’。

14.6.7 支持周期、弃用与热修复

交付包应让另一个人从干净目录开始,而不是依赖作者电脑里的缓存和记忆。README 要说明 Python 版本、安装命令、测试命令、预期输出、可选工具、目标机前置条件和恢复方式;manifest 要列出版本、来源、摘要、许可证和兼容性;evidence 要保存实际运行记录和未执行项。对外发布前再检查压缩包内容、相对路径、可执行权限、换行符和秘密是否被误打包。

14.6.8 本节交付:产品发布卡

复盘时采用单变量改变:保留上一份输入、产物、日志和设备身份,只替换一个条件,例如更换候选版本、缩短超时、断开网络或模拟掉电。比较最后成功阶段、错误分类、状态迁移和恢复动作,才能说明因果。不要同时换 bootloader、内核、rootfs、供电、配置和测试板;那样即使现象改变,也无法知道是哪一个条件造成改变。最后把未知项、停止条件和下一步实验写入交付记录。

CHECKPOINT 14.6把“一份发布包怎样让读者能运行、工厂能烧录、现场能升级并在失败后恢复?”写成一份可复查记录

请围绕“发布与现场:可恢复的产品交付”写出对象与角色、输入和前置条件、接口或状态机制、输出与完成语义、一个资源/安全约束、一个失败路径、恢复动作和对应证据。没有目标板时运行主机路径,并把未执行字段标为未执行;拥有目标机时还要补齐 SoC、板卡 rev、bootloader、内核/BSP、供电、存储、温度、负载、仪器、设备身份和观察条件。不要用一次启动、一个哈希、一个 CI 绿灯或一条现场口述覆盖没有做过的验证。

合格记录要让没有现场上下文的读者知道先查什么、先运行什么、看到什么才算通过,以及哪一句结论仍然不能推出。需求编号、版本身份、SBOM、恢复镜像、权限边界、许可证、已知限制和停止条件都是交付的一部分。

资料卡(访问日期:2026-09-05):本章对照 NIST SSDF、SPDX、U-Boot、Yocto、Buildroot、Linux Kernel、systemd、RAUC 与 MCUboot 官方资料。主机模型不替代真实 SoC、DDR、驱动、电源、Flash、密钥、烧录、温度、网络和现场恢复证据。