1.1 什么是实时:截止期、确定性与抖动 本节摘要:实时性描述的不是速度而是承诺——任务必须在截止期之前完成,且每一次都完成。本节给出截止期、确定性、抖动三个核心定义,并提供一套把需求归类的判定方法,为全书后续机制讨论立好标尺。 「抖动」是工控现场的老工程师最恨的一个词:他们不在乎系统平均能跑多快,在乎的是「上一次 3 毫秒、这一次 30 毫秒」这种说不清的波动。这个口语化的抱怨,恰好指向了实时性定义的核心。本节是全书第一节,任务是把你头脑里「实时等于快」的直觉替换成可度量的工程概念——后面所有章节的机制,都是在为这几个概念服务。 先把三个词分开 截止期(deadline):任务从被触发到必须完成的时间上限。
本节摘要:实时性描述的不是速度而是承诺——任务必须在截止期之前完成,且每一次都完成。本节给出截止期、确定性、抖动三个核心定义,并提供一套把需求归类的判定方法,为全书后续机制讨论立好标尺。
「抖动」是工控现场的老工程师最恨的一个词:他们不在乎系统平均能跑多快,在乎的是「上一次 3 毫秒、这一次 30 毫秒」这种说不清的波动。这个口语化的抱怨,恰好指向了实时性定义的核心。本节是全书第一节,任务是把你头脑里「实时等于快」的直觉替换成可度量的工程概念——后面所有章节的机制,都是在为这几个概念服务。
截止期(deadline):任务从被触发到必须完成的时间上限。电机控制环里每次 PWM 周期开始前必须算好下一拍的占空比,这个「下一拍开始前」就是截止期。截止期可以是绝对的(每天零点前出报表),更常见的是相对的(被中断唤醒后 2 毫秒内输出结果)。
确定性(determinism):给定相同的输入与起始状态,系统的时间行为是否可预测。注意确定性与速度无关:一颗跑 48MHz 的单片机,若每次中断响应都稳定在固定周期数上,它比一颗「平均很快但偶尔卡顿」的 1GHz 处理器更实时。通用操作系统做不到确定性,根源不在代码质量,而在设计目标——缓存、预取、动态调频、后台守护任务,每一个提升平均性能的手段都在给最坏情况埋雷。
抖动(jitter):同一事件多次发生时,响应时间的波动幅度。设响应时间的观测序列为 r 的若干次取值,抖动常用最大值减最小值或标准差刻画。对一个周期 10 毫秒的采样任务,启动时刻若在 9.99 到 10.03 毫秒之间漂移,抖动就是 40 微秒——这个数字直接进入你的控制环路带宽预算。
三个词合起来才是完整的实时定义:在所有可能的情况下,包括最坏情况,任务都能在截止期前完成。最坏情况执行时间(WCET)因此成了实时系统的基石指标,它是本册反复出现的行话。
判定标准只有一条:错过截止期会发生什么。
下面这张图直观展示了两种系统的差别:软实时系统追求分布的中心位置靠左(平均快),硬实时系统追求分布的右边缘可控(最坏情况有界)。

一个常见的误判是把「偶尔超时」当成软实时问题。判断依据不是超时频率,而是超时后果:哪怕一年才发生一次,只要那一次会撞坏设备或伤人,它就是硬实时需求,就必须按最坏情况做设计与验证。
拿一个具体数字把它走通。某振动监测设备要求以固定周期采样:采样周期 T 等于 10 毫秒,即每 10 毫秒要完成一次「读传感器、滤波、更新显示缓冲」的完整动作,产品定义的截止期 D 为 8 毫秒(留出余量给更紧急的告警任务)。
在 RTOS 下这个周期任务通常这样写:
/* 周期性采样任务:用绝对延时锚定节拍,避免误差累积 */ void SamplingTask(void *arg) { TickType_t xLastWakeTime = xTaskGetTickCount(); const TickType_t xPeriod = pdMS_TO_TICKS(10); /* 10 毫秒周期 */ for (;;) { uint16_t raw = ADC_Read(CH_VIBRATION); /* 读传感器 */ int32_t filt = IIR_Filter(raw); /* 滤波,纯计算 */ Display_Push(filt); /* 写共享缓冲,需互斥 */ vTaskDelayUntil(&xLastWakeTime, xPeriod); /* 睡到下一拍 */ } }
vTaskDelayUntil 与 vTaskDelay 的区别值得停一下:前者按「上一次该醒的时刻」推算下一次唤醒,节拍不会漂移;后者按「现在」往后推,每一拍都会把前面浪费的时间累加进周期,采集时间线越跑越歪。很多「莫名其妙的采样抖动」,根源就是把 Until 写成了普通 Delay。
测得的执行时间数据:滤波在数据平稳时 0.6 毫秒,冲击到来时达到 1.8 毫秒;写显示缓冲因要与 GUI 任务争抢互斥量,最坏多等 2.5 毫秒。于是 WCET 约 4.3 毫秒,小于 8 毫秒截止期,单个任务看是可行的。但这只是可行性分析的第一步——它还没算上被更高优先级任务抢占的时间。完整的响应时间分析在 3.2 节展开,这里先记住方法骨架:执行时间取最坏,加上一切可能的抢占与阻塞,再去和截止期比。
拿到新需求时,按下面的顺序提问,基本能完成归类:
把这份清单的结论写进设计文档,后面选操作系统、定优先级、做测试预算时,它就是依据。需求阶段的含糊,会在联调阶段加倍偿还。