已审浅睡眠 tickless timebase

[os].lowpower_port = "timebase" 选择维护中的 STM32F407/GD32F470 私有 FreeRTOS 绑定。默认 "custom" 保持既有应用 port 与弱 NULL 回退行为。选择还要求 tickless = true、SysTick、单一特权安全域且无 MPU profile。纯 CPU Runtime 因缺少已审 SoC timer/clock/IRQ 事实而拒绝此选择。

此绑定使用浅 Sleep,固定时钟与 1 MHz 单调 timer 持续运行。不进入 STOP、不暂停时钟、不选其他 tick 源、不配置唤醒引脚,也不声明板级电气事实。

SoC

时钟/timer

私有 compare

既有共享 owner

STM32F407

HSE8 / PLL168,TIM2 PSC83

CC1,CCR1

TIM2 update / 64-bit epoch

GD32F470

HXTAL25 / PLL200,TIMER1 PSC99

CH0,CH0CV

TIMER1 update / 64-bit epoch

Timer 已由平台 timebase 独占预留,没有输出 channel 接到引脚。Getter 仅检查既定配置:真实 PLL tuple、oscillator/source ready、mux/bus 分频、Flash latency 和 spread spectrum 关闭,以及自由向上计数、prescaler、完整 counter 范围、compare preload/output 关闭、sleep clock、overflow interrupt 和已使能 NVIC 路由。缺失事实返回 NULL,不修复或隐藏初始化。整个平台停机中 clock consumer 必须保持静止。存在 pause 或 alarm 时,还会在任何寄存器/NVIC 效果前拒绝时钟释放。

Phase、准入与失败

通用 Idle 适配持有 scheduler suspend 与进入 PRIMASK 恢复。私有 timer 回调绝不阻塞或调用内核。Alarm IRQ dispatch 在 SoC 保存掩码 guard 下运行。SysTick 每次真实周期中断只调用一次重命名后的真实内核 tick handler。

Pause 拒绝 pending 周期 tick 与仍活动的首个短间隔。可写快照须与私有保留状态、不可变绑定、MMIO 和不透明 clock-context 存储分离。已知范围、对齐和地址回绕在效果前检查;私有调用方证明不透明 clock-context 大小。成功 pause 保留周期源借用直到 resume。暂停计数记录完整微秒及剩余 core-cycle fraction。每次 capture/restore 均拒绝时钟逆跳或超过四个连续时钟微秒的观察窗口。

Alarm 使用同一启动域的绝对 deadline;准入要求严格未来时间,距当前最多 UINT32_MAX 微秒。低 32 位在一次回绕范围内匹配自由计数器。迟到 arm、compare 读回失败或 disabled-source 读回失败都不能报告准入成功。拒绝 alarm 只移除自身中断源。Timer status 是 W0C:写一保留全部其他源,包括 overflow 读与确认之间到达的 compare。

Resume 编程一个短 SysTick 间隔,证明 VAL 已消费短 reload 后,在首次 underflow 前恢复完整 LOAD。若只在首 ISR 恢复 LOAD,就可能发生第二个短间隔。包装也在内核 dispatch 前恢复完整 LOAD。亚微秒余数向上取整,误差小于一微秒,而不是依赖无法证明的近零 reload 竞态。

精度合同是量化的。1 MHz 时钟不能表示任意 core-cycle 时间戳,寄存器操作有延迟。模型在持续推进 timer 下执行 15 种 phase/latency 组合,证明这些执行位于保守的负一到正十一微秒 phase 区间。独立 capture/restore 窗口检查是运行时边界;模型不证明物理 MCU 指令延迟或全部硬件执行。重复睡眠可能累积有界 phase 偏差。更紧同步需求必须另行验证 timer compare 时钟配置,不能假定精确亚微秒 phase。

Pending tick、COUNTFLAG、迟到首次 underflow、reload 未消费或恢复控制位错误会让 resume fail-stop。Pause 回滚失败且无法恢复源时也 fail-stop。Alarm disable 失败同时保留 pause 与 alarm 所有权。Fault 状态不归还借用源、不让缺失 tick 的内核继续,也不自动回收。

成本与验证范围

选择增加一个静态私有 context。维护的 32 位 ABI 中 layout 为 16 字节,只读寄存器绑定和 port 接口面为 52 与 24 字节;这些是结构布局,不是链接镜像成本。既有 timebase、默认 request/stream 状态与 OS 对象不增加字段。默认源码选择省略公共机制、SoC 绑定及所选 IRQ 分支。四个真实生产 CMake ARM 图验证默认无新机制 TU/symbol,而选择后有两个 TU 与 strong getter。在保留 kernel startup 的同一 empty assembly、no-LTO Os/GNUArm14.3.1 下,STM32 增加 Flash 1532/RAM 16 字节,GD32 增加 Flash 1516/RAM 16 字节。这些是开发夹具差值,不是应用或硬件成本。

GoogleTest/GoogleMock 执行生产公共 C、真实 SDK 寄存器布局、真实 SoC timebase IRQ 与停机代码,覆盖 pending 到达、时钟逆跳、迟到 compare、counter wrap、disable/restore 失败、首 reload 消费、第二 pause 拒绝及共享 IRQ 标志竞态。两芯片 suite 使用外部 CPU、clock-bootstrap 和寄存器语义模型,属于软件证据。

物理 HIL 未执行。验收仍需真实板与探针:浅 Sleep 时钟连续、NVIC 唤醒、真实 capture/restore 窗口、反复睡眠的 SysTick phase/catch-up、回绕、竞争中断和负载。模型时序或 ARM 链接不能建立功耗收益、物理 WCET、IRQ 延迟或板卡就绪。