⚙️ 第十一章 访问硬件的方法
📄 一句话概括

实时处理的意思是规定时间内必须响应;而计算机里的【时间】本身,就是靠定时器中断滴答出来的。

📝 本节和前面几节的关系

11.3 讲了中断是什么,这一节讲它最常用的一种:给整台机器定节拍。

一、实时不是快,是准时

很多人把实时理解成【很快】——不对。 实时的意思是:在规定的时间内必须给出响应,晚一秒都不行,早了也没意义。 所以硬实时系统第一目标是【一定按时】,为此宁可牺牲平均速度。 机械臂、刹车控制、心电图仪器——这些场合晚一点就是事故。

二、计算机的时间是怎么来的

计算机里的【时间】不是凭空知道的——它靠一种中断滴答出来:定时器中断。 每隔固定时间(比如几毫秒),定时器拉起一次中断,操作系统借机更新时钟。 但它更重要的用途是:给操作系统一个抢回控制权的机会。 时间片到了就切换下一个程序——这就是【看似同时运行多个程序】的底层机制。 另外,各种超时、动画、心跳,也都靠这个统一节拍。

三、实测这个节拍准不准

用 Python 模拟【每 5 毫秒必须做一次】,看看实际抖动有多大。 平均间隔能压到 5 毫秒,但每一拍都会有一点偏差——这就是抖动。 普通操作系统是软实时:这点偏差无所谓,因为它要照顾的是【总体吞吐】。 换成硬实时系统,偏差就得压到微秒级——代价是别的事情都要让路。

四、中断还有优先级

设备那么多,同时来中断怎么办?所以中断分优先级。 鼠标键盘优先——人的操作等不起,卡一下立刻被察觉。 磁盘拷贝垫底——它慢一点没人看得出来。 所以中断优先级表,本质上是一张【谁更等不起】的排序表。

五、动手 Demo:通过中断实现实时处理

实时处理的意思是规定时间内必须响应,而计算机的时间本身靠定时器中断滴答出来。 实测一下这个节拍的抖动有多大。

import time
n, interval = 20, 0.005
stamps, t0 = [], time.perf_counter()
for i in range(n):
    target = t0 + (i + 1) * interval
    while time.perf_counter() < target:
        pass
    stamps.append(time.perf_counter() - t0)
errs = [abs(stamps[i] - (i + 1) * interval) for i in range(n)]
print("平均间隔", stamps[-1] / n * 1000, "毫秒")
print("最大偏差", max(errs) * 1000, "毫秒")

实跑输出:

--------------------------------------------------------------------
通过中断实现实时处理
--------------------------------------------------------------------

**实时处理的意思是:规定时间内必须响应。**
  计算机里的【时间】本身就是靠一种中断滴答出来的——**定时器中断。**

  它的作用不止报时:
    **给操作系统一个抢回控制权的机会。**
    **时间片到了就换下一个程序**——这就是【看似同时运行】的底层机制。
    **给各种超时、动画、心跳提供统一的节拍。**

  实测一下这个节拍准不准——用 Python 模拟【每 5 毫秒必须做一次】:

    计划间隔                5.0 毫秒
    实测平均间隔            5.000 毫秒
    最大偏差(抖动)        0.013 毫秒
    总耗时                  100.0 毫秒

  **平均间隔很准,但每一拍都有一点偏差**——实测最大 0.013 毫秒,这就是抖动。
  在普通系统上(软实时)这点偏差无所谓;**但机械臂、刹车控制这类场景就不行。**
  所以有【硬实时】系统:**它的第一目标不是快,而是【一定按时】。**

  中断还有优先级——**鼠标键盘优先、磁盘拷贝垫底**,
  因为人的操作等不起,而磁盘慢一点没人察觉。

实测:平均间隔稳稳是 5 毫秒,但每一拍都有一点偏差——这就是抖动。 普通系统是软实时(这点偏差无所谓);硬实时系统要求偏差压到微秒级。

30 秒实验

  1. 把间隔改成 1 毫秒再跑一次,看偏差是变大还是变小。
  2. 想一想:为什么游戏里【掉帧】比【画质差】更让人难受。

常见误区

  1. 以为实时就是快。它的意思是【一定按时】。
  2. 以为定时中断只用来报时。它更是操作系统抢回控制权的机会。
自测三问(点开对答案) 1. 实时处理的准确含义是什么? —— 在规定时间内必须给出响应,重点是准时而不是快。 2. 定时器中断有什么用? —— 提供统一节拍:更新时间、让操作系统抢回控制权做任务切换、支撑超时与心跳。 3. 软实时和硬实时的差别在哪? —— 软实时容忍少量抖动、优先总体吞吐;硬实时要求偏差极小,宁可牺牲平均性能。

相关笔记