第六章 · 中断、时钟与输入输出 本章要回答的三个问题:中断服务程序里哪些事能做、哪些绝不能做,为什么?系统的节拍从哪来,毫秒级与微秒级的定时需求分别该怎么满足?外部设备的数据搬运怎么设计,才不会把截止期拖垮? 为什么会有这一章 前四章的机制都发生在「任务世界」里,本章跨过边界,面对处理器与外设的交界处——这是实时系统里时间刻度最细的地方。中断延迟以微秒计,节拍以毫秒计,一次不当的驱动设计却能把毫秒级的阻塞传遍整个任务世界。很多在任务层面百思不解的抖动,答案都在这一章的范围里:某个中断服务程序里偷偷调了阻塞函数,某个外设驱动在关中断状态下搬运了四百字节数据。 本章四节按信号流方向排列:外部事件先撞上中断机制(6.1),时间性的事件由时钟与定时器生成(6.
本章要回答的三个问题:中断服务程序里哪些事能做、哪些绝不能做,为什么?系统的节拍从哪来,毫秒级与微秒级的定时需求分别该怎么满足?外部设备的数据搬运怎么设计,才不会把截止期拖垮?
前四章的机制都发生在「任务世界」里,本章跨过边界,面对处理器与外设的交界处——这是实时系统里时间刻度最细的地方。中断延迟以微秒计,节拍以毫秒计,一次不当的驱动设计却能把毫秒级的阻塞传遍整个任务世界。很多在任务层面百思不解的抖动,答案都在这一章的范围里:某个中断服务程序里偷偷调了阻塞函数,某个外设驱动在关中断状态下搬运了四百字节数据。
本章四节按信号流方向排列:外部事件先撞上中断机制(6.1),时间性的事件由时钟与定时器生成(6.2),数据要进出设备则经过 I/O 模型(6.3)与文件系统、网络栈(6.4)。读完本章,第一章里那句「中断与时钟组件负责发现时间到了」就完整落地了。
| 节号 | 回答的问题 | 关键产出 |
|---|---|---|
| 6.1 中断机制 | 事件如何进入系统,延迟由哪几段构成 | 延迟构成清单与嵌套、屏蔽的规则 |
| 6.2 时钟与定时器 | 节拍从哪来,各级定时的精度边界 | 节拍配置准则与定时器选型阶梯 |
| 6.3 实时 I/O 模型 | 数据搬运的几种姿势与代价 | 四种搬运方式对比与选型流程 |
| 6.4 文件系统与网络栈 | 重型组件怎么用才不伤实时 | 隔离设计与缓冲策略 |
需要 2.1 节的两条内核链路(时钟链路、信号量链路)与 4.2 节的队列管线——本章的很多规则就是那两条链路的延伸。
从外设引脚到任务代码,一个事件要走完整条链路。链路上每一站的时间消耗都有界且可测,实时分析做的就是把各段加起来:
图里从顶到底的时间跨度通常只有几十微秒,但任何一站失控——中断被屏蔽太久、服务程序太长、队列太深——都会把这几十微秒放大成任务世界的毫秒级抖动。
中断与时钟解决「事件与时间」,下一章把视野拉宽到系统级:多个处理器核怎么协同守住各自的截止期、电池供电的设备怎么在守住截止期的同时把功耗压到最低、以及当截止期关系人身安全时整个开发流程要怎么升级。
与内存预算对应,第六章的方法落成中断预算:每个中断一行,列出触发速率、服务时长上界、允许延迟、优先级档位。汇总时做两个校验。守恒校验:所有中断的「速率乘时长」之和加上所有任务的利用率,不得超过处理器总数——单核系统就是不得超过一。优先级校验:从最高档开始逐档计算「本档及以下所有中断被更高档打断后的最坏延迟」,与该档的允许延迟对照,超了就调档或压服务时长。
这份预算还有个容易忽视的消费者:低功耗设计。7.2 节的平均电流算式里,活跃时间主要由中断与任务唤醒构成,中断预算表里的速率列直接决定电池寿命。省电设计的源头常常不是电源管理代码,而是砍掉几个本不该存在的中断。