OS 交付范围与验证¶
当前 OS 保持公共 Wait + 后端专属显式存储。平台不创建默认 worker、不启动 scheduler、 不隐式占用 task-notification index,也不创建最大对象池。产品 composition 和恢复策略 位于独立 examples/product 工程。
当前机制的完整合同在 OS contracts,逐项实际状态在
OS01–OS55 台账。implemented 只表示代码存在,只有
与当前 clean Git/配置/dependency/工具身份绑定的实际执行才建立软件资格。
机制 |
交付边界 |
|---|---|
等待 |
单 waiter、多个合法 publisher、绝对同域 deadline、业务 predicate 权威 |
裸机 |
有界轮询,无任务仿真;睡眠须使用显式 Arch 合同 |
Native |
调用方栈、join、closable byte-copy queue、真实 monotonic 条件等待 |
FreeRTOS |
受维护九核 Port、静态对象、合法 task/IRQ 上下文、可 join 生命周期 |
直接通知 |
明示 receiver/index/生命周期,减少可选二值信号量成本 |
永久任务 |
无 join semaphore,entry 不返回且存储保留到 reset |
可关闭队列 |
独立 opt-in storage/waiters;raw queue 不承担默认关闭成本 |
Tick/配置 profile |
SoC IRQ/CPU facts 与运行时政策分离,合法 Tick 来源明确 |
低功耗 |
浅睡眠+显式 timer port;无 port 不自动睡眠 |
跟踪 |
调用方 bounded ring+weak hook,无默认大型 trace buffer |
MPU |
独立 restricted-task profile,protected metadata、显式 user linker/regions、窄 delay/tick SVC |
分离安全域 |
匹配 Secure/NS Runtime、实际 TZ-aware port、caller Secure contexts 和 Idle 存储 |
外部应用交付¶
nexus-examples/apps/uart_owner_runtime 使用生成 typed factory 的 UART face。Native
创建两个 producer 和一个 owner 的真实 pthread;FreeRTOS 创建 producer/owner/stop
coordinator 的显式静态任务;裸机用同一 owner 进行 cooperative service。三板引用
已有 console route,不定义新的接线或 provider。
关闭流程包含 stop admission、active cancel/drain、producer join、owner join、IRQ wake quiescence 和通知销毁。GoogleTest/GoogleMock 测试真实 BusOwner 和应用 shutdown 模块, mock 只替代外部 join/硬件 quiescence;覆盖阶段顺序、超时、错误、提前回收和重试。
部分启动失败分别回收已取得的资源。Native 先关闭提交、保持 owner 排空并 join
已运行任务。FreeRTOS 启动前使用 nx_freertos_task_discard_before_scheduler,先
suspend 移除内核候选 TCB 引用,再同步删除任务和完成 latch。它要求特权启动
上下文、NOT_STARTED、wrapper 尚未执行且没有未配对的 scheduler suspension;
成功后才允许复用栈、TCB 和 context。运行中任务继续使用 cooperative stop/join。
真实 POSIX kernel 回归验证逆序回收、回收存储毒化后复用、真实 scheduler 执行,
以及 scheduler 结束后拒绝 discard 已执行 wrapper,不能替代 MCU 实板验证。
Native 的显式 host 栈为三个 64 KiB buffer;应用预算相应独立增加。这是 host thread fixture 的资源,不是 MCU 栈成本。MCU 采用各 256 StackType_t word 的四任务参考预算, 声明 8-byte 对齐,仍需实板测量运行峰值,不能从启动最低容量推导。 FreeRTOS 示例停止 I/O 与发布者后保留 scheduler 所需平台时钟/Tick,coordinator 挂起; Native/裸机可继续 platform stop。产品 reset/scheduler-stop 策略单独拥有。
软件验证与实板边界¶
软件执行应包含 deadline 持续 wake、最终完成竞争、端口启动栈拒绝、Baseline IRQ 完整绑定、close/drain、任务复用、direct notification receiver/index、tickless 失败 和 trace overflow。GoogleMock 上下文模型、真实 POSIX kernel、Native 多任务示例、 九核 ABI 链接和安装 SDK 消费分别建立自己的证据。
可选 MPU 的十二个实际 ARM 软件变体和 V7/V8 host contract 已执行;当前拒绝 M0/M0+、 M7 kernel MPU 及 MPU+split。可选 split 的 31 个 Secure/NS 配对(62 ELF)覆盖当前 M23/M33/M55/M85 CPU authority 组合,并核对七个真实 SG veneers、import、上下文 ASM 与 caller Idle callback,没有默认 Secure heap/pool。split 的两个 host lease targets 分别覆盖整数和共享 FP/MVE bank 软件合同。两类都需要消费者提供明确 linker、存储 和可信生命周期;软件 fixture 的地址是 synthetic,未执行实际 MPU fault、安全归属、 跨世界启动或真实 context switch。细节见 OS contracts。
OS49–55 的物理工装定义已经可执行为 prepare/validate 工具,但硬件尚未连接,未运行
实际 IRQ→task 延迟、FP/MVE register retention、MSP/task peaks、Tick/deadline 误差、
满载生命周期、睡眠恢复或异常安全输出。准备计划保持 prepared_unbound,物理状态
保持 not_executed。计划不是测量结果,更不是 WCET、安全认证或产品 release。
python tools/hil/os_acceptance.py plan \
--resolved build/stm32-qiming-freertos/generated/resolved.json \
--report build/stm32-qiming-freertos/os-hil-plan.json
实板接入后由 station owner 配置五项明确预算 os_irq_latency、os_deadline_lateness、
os_low_power_lateness、os_lifecycle、os_fail_response;分别使用 us/us/us/count/us。
生命周期必须提供正 minimum,其他四项使用 maximum。记录与 station admission 绑定,
不能在 acquisition context 内放宽预算。
OS context 严格字段为 schema_version=1/kind=os_hil_context、admission_sha256、
workload/instrument file identities、实际 load/executor/irq_priorities/cpu_clock_hz、
features.fpu/mve、完整 stack_names 和 requirements。stack_names 列出 MSP 及该 workload
每个选定任务,raw stack trace 必须完全对应,不能只提交一个示例任务。features 与已
admission 的 CPU ABI 完全一致。
每项独立 raw trace 绑定 context SHA,保留逐样本/寄存器/stack/lifecycle/fail-stop 数据,
不能传入一个自行填写 status=passed 的摘要替代。采集时间需 fresh UTC offset。
python tools/hil/os_acceptance.py validate \
--admission station/admission.json \
--raw-evidence station/os-run.json \
--report station/os-validation.json
报告要求未使用的输出目标,旧证据与输入永不覆盖。 这些命令只读取已保留记录,绝不自动操作硬件。测量方法、观测 load、供电、安全输出和 产品验收预算由实际 station/workload 审核,不能继承主机模型或旧提交的物理资格。
显式优化成本¶
32-bit ABI 的 standard development resource probe 已测得下列对象尺寸;具体 profile、
CPU Port、枚举 ABI 和编译器改变后须重新执行成本门禁。这些是实际 ELF 对象大小,
不表示运行 cycles 或最终软件候选资格。
对象 |
RAM 字节 |
成本责任 |
|---|---|---|
等待接口面 |
16 |
保持现有公共 ABI |
普通 notify |
84 |
每对象静态 latch |
直接通知 |
16 |
receiver/index 明示,省 68 B |
可 join 任务 |
172 |
不含 caller stack |
永久任务 |
88 |
不含 caller stack,省 84 B |
原始队列 |
80 |
不含 payload |
可关闭队列 |
96 |
比 raw 多 16 B,不含 payload/waiters |
每个 concurrent queue waiter |
84 |
调用方按实际并发数提供 |
Idle TCB+默认栈 |
596 |
默认 84+512 B;profile 可以改变 |
maximum_waiters 控制 close 的 scheduler-pause 遍历预算,payload item size 控制内核
单次复制的临界区预算。不可把整个 close 遍历的时间宣称为 IRQ 屏蔽时间,也不可用
静态 instruction 数代替测量延迟。成本门禁保留各自 argv、ELF/nm/disassembly 和尺寸;
资源最小 profile 与完整能力 profile 分别比较,禁止把不同负载的图像作为同一基线。