HRTOS 架构模块

内核结构(Kernel Structure)

内核结构定义了HRTOS内部的功能分层与职责划分,是理解调度、执行与中断关系的基础模型。

结构概述

在 HRTOS 中,Kernel 结构不是静态模块划分,而是一个运行时控制体系。 它通过调度器、中断系统与通信机制的协同,实现对“CPU执行权”的持续控制。

这种结构的本质不是“模块组合”,而是一个循环控制系统: 事件驱动 → 调度决策 → 执行切换 → 状态反馈 → 再次调度

这种运行时结构与传统软件分层最大的不同,在于它强调“谁触发谁回到内核”,而不是“谁调用谁”。调度层、中断层、通信层并不是并列服务模块,它们更像是围绕同一控制核心展开的不同入口和不同反馈路径。

因此讨论内核结构时,重点不应只放在模块名称上,而应放在“控制权如何流动”。哪些对象只读、哪些对象只由内核写入、哪些状态可以在中断中被短暂观察但不能直接修改,这些约束共同决定了结构是否真的稳定。结构越像受控对象图,系统越容易在复杂场景下保持一致时序。

Kernel 设计目标

Kernel 的目标不是提升执行速度,而是建立“可预测执行模型”。

在实时系统中,关键指标不是吞吐量,而是: 调度延迟上界(Worst-case latency)

因此 Kernel 必须保证:

- 任意时刻都有明确可运行任务
- 高优先级任务可立即抢占
- 状态切换路径可追踪
- 中断不会破坏调度一致性

因此 Kernel 设计目标可以进一步归纳为:最短决策路径、最小共享状态、最少不可重入区域和最清晰的故障边界。只有满足这些条件,调度延迟和上下文切换成本才不会随着系统规模扩大而失控。

共享状态越少、临界区越短、层间语义越清晰,内核就越容易被 tracing、审计和形式化分析工具解释。对 RTOS 而言,这种“易解释性”本身就是核心质量属性。

设计目标还包含一个常被忽视的点:结构必须天然适配故障定位。也就是说,当系统出现 missed deadline、异常抢占或恢复延迟时,团队能够根据结构分层迅速判断问题落在入口、中间决策还是恢复阶段,而不是在多条耦合路径之间反复猜测。

核心结构层

在工程落地时,四层结构通常还会映射为不同的数据对象:调度层维护就绪集合,执行层维护上下文镜像,中断层维护入口优先级和嵌套状态,通信层维护等待队列与唤醒关系。结构清晰意味着每类对象的所有权清晰,调试和验证成本会显著下降。

如果从控制链路看,这四层并不是串联关系,而是“事件入口 + 决策核心 + 执行实施 + 状态反馈”的闭环角色分工。它们共同围绕同一组核心状态对象运转,因此边界清晰比接口丰富更重要。

从工程案例看,很多高可靠产品会刻意让这四层的数据边界非常保守。例如中断层只产生事件和最小上下文,通信层只维护等待关系,真正影响系统运行权的写操作全部集中在调度层和执行层完成。这样做的代价是接口看起来不够“灵活”,但换来的是关键路径极易审计。

结构关系

HRTOS 内核运行本质是一个闭环控制系统:

① 事件触发(中断 / 系统调用 / 任务状态变化)

② 进入调度入口(Kernel Entry)

③ 就绪队列评估(Ready Queue Scan)

④ 调度决策(Priority / Preemption Decision)

⑤ 上下文切换(Context Switch)

⑥ 任务执行(Task Running)

⑦ 状态反馈(阻塞 / 就绪 / 事件触发)

⑧ 回归内核循环

这条闭环还隐藏着一个重要约束:每次状态反馈都必须能够重新落入统一的就绪判断模型。无论是中断解除阻塞、超时到期还是信号量释放,最终都必须把任务状态变更收敛为“是否进入 ready set”这一类标准事件。

从验证路径看,结构关系页的价值在于帮助团队把 tracing 点布在真正重要的状态交汇处,而不是平均分散到各个模块。只有抓住交汇点,才能看清延迟是在哪里被放大。

结构关系的另一个价值,在于把“状态变化”转译为“预算变化”。一次阻塞不是单纯的状态标签变化,而是把未来的执行机会转移给其他任务;一次唤醒也不只是把任务放回 ready set,而是重新定义了接下来几个调度点的优先级竞争关系。理解这种关系,才能真正看懂内核结构为何必须围绕时间控制来组织。

系统本质

Kernel 并不是“执行代码的地方”,而是一个持续运行的决策器(Decision Engine)。

所有任务执行,本质上都是: 调度器不断重新分配 CPU 使用权的结果

因此 HRTOS 的实时性,本质由 Kernel 决策路径长度决定,而不是 CPU 性能决定。

从控制理论角度看,Kernel 更像一个离散事件控制器。它不直接计算业务输出,而是不断根据事件输入修正系统下一时刻的执行状态;RTOS 的实时性并不是 CPU 跑得多快,而是这个控制器的状态转移是否稳定、简短且可证明。

这也解释了为什么内核结构设计往往偏保守。稳定、可验证和可追踪的控制路径,比在核心层引入更多动态机制更有价值,因为每一个额外的不确定分支都会扩大验证成本。

因此好的内核结构常常给人一种“克制感”:对象数有限、入口少、路径短、异常处理也尽量回到既有状态机,而不是另起一套旁路逻辑。

换言之,结构设计越接近少数稳定对象驱动多数行为,系统越容易保持长期一致的确定性。

结构一旦失去这种集中性,确定性就会迅速稀释。

这也是 RTOS 内核宁愿少做,也不愿在核心路径上做不透明抽象的原因。

实际项目中,优秀的内核结构往往表现出一种非常明确的取舍:愿意在外围层做复杂适配,不愿在控制核心里引入额外的不确定分支。因为外围复杂度通常可以通过异步化、分层化或降级策略处理,而核心路径复杂度一旦失控,就会直接破坏系统实时性假设。

如果把内核结构放进产品生命周期看,还会发现一个额外优势:结构越稳定,跨版本行为越容易保持一致。实时系统最怕的不是单次功能错误,而是一次看似无害的结构变更悄悄改变了关键路径分支数、共享状态数量或恢复次序。保守的结构模型恰恰能把这类风险尽可能提前暴露出来。

这也是为什么很多成熟 RTOS 会严格区分“核心结构层”和“扩展适配层”。前者追求少对象、短路径、强约束;后者负责把产品差异、驱动差异和协议差异隔离在外。只要这种分层清晰,系统即使不断增长功能,也不至于把所有复杂度都挤进内核中心。

若从团队协作角度再看一步,结构稳定还意味着职责稳定。调度、驱动、协议和验证人员都能围绕固定边界工作,而不会在版本迭代中不断重新争论“这件事到底归谁管、应当在哪一层处理”。这种职责稳定性本身就是 RTOS 工程成功的重要基础。

所以,内核结构页并不只服务内核开发者,它同样服务所有需要和实时主路径打交道的角色。结构一旦清楚,新增能力就更容易被放在正确位置;结构一旦模糊,任何优化都可能只是把复杂度从一层挪到另一层。

换句话说,结构设计越能把复杂度挡在外围,内核越能把确定性留在中心。这种“把不确定性拒之门外”的能力,正是实时内核结构最核心的工程价值。