4. 实时模型概述
在实时模型与I/O映射工程中,实时模型描述的是“任务何时被释放、何时必须完成、以及系统依据什么来推进执行”的抽象规则。它决定了I/O采样、控制计算与输出刷新之间的时序关系,也直接影响抖动、延迟与可预测性。工程上最常见的四类模型是:周期任务模型、偶发任务模型、事件驱动模型与时间触发模型。它们并非互斥,实际系统常以组合方式出现,例如时间触发调度器承载周期任务,同时用事件驱动处理报警与故障。
核心原理:释放条件与时限约束
实时任务通常用释放时间、执行时间、相对时限与周期/最小间隔来描述。周期任务模型假设任务以固定周期T重复释放,每次释放后必须在相对时限D内完成,典型约束为D≤T。偶发任务模型不要求固定周期,只约束相邻两次释放的最小间隔,因此更适合处理“可能发生但不会密集发生”的请求。事件驱动模型强调由外部事件(中断、信号、消息到达)触发执行,响应性高但负载不确定。时间触发模型则相反,所有动作由全局时间轴预先编排,任务在确定的时间槽内执行,通信也按时间槽进行,因而具有最强的可预测性。
四类模型对比与适用场景
| 模型 | 释放方式 | 时间约束 | 可预测性 | 典型场景 |
|---|---|---|---|---|
| 周期任务模型 | 固定周期T | D≤T,抖动受限 | 高 | PID控制回路、周期采样 |
| 偶发任务模型 | 随机到达,最小间隔Tmin | D可小于Tmin | 中高 | 按键、限位触发、诊断请求 |
| 事件驱动模型 | 中断/消息触发 | 依赖优先级与抢占 | 中低 | 报警、通信收包、故障处理 |
| 时间触发模型 | 全局时间槽 | 固定偏移与窗口 | 极高 | 安全联锁、分布式同步控制 |
方法流程:从模型选择到I/O映射
- 识别I/O类型:模拟量采样、数字量输入、脉冲计数、通信报文分别对应不同释放语义。
- 确定时限:根据控制带宽与安全要求,给出采样周期、计算时限与输出刷新窗口。
- 选择模型:周期回路用周期任务;随机输入用偶发任务;紧急信号用事件驱动;安全关键用时间触发。
- 分配优先级与时间槽:周期任务按速率单调分配优先级;时间触发任务按时间轴分配偏移,避免冲突。
- 映射到I/O:将输入采样、计算、输出刷新绑定到同一任务或同一时间槽,减少跨任务抖动。
- 验证:用响应时间分析或时间槽仿真检查最坏情况,确认无超时与资源冲突。
案例:电机控制中的混合模型
某伺服驱动器需要每1ms采样电流并执行电流环,每10ms执行速度环,同时响应过流中断与上位机参数下发。合理的映射是:电流环与速度环作为周期任务,分别以1ms和10ms释放;过流保护作为事件驱动任务,优先级最高,触发后立即封锁PWM;参数下发作为偶发任务,最小间隔约束为20ms,避免频繁写Flash。若将参数下发也做成周期任务,会造成无谓的CPU占用;若将过流保护做成周期任务,则响应延迟可能超过安全时限。
任务配置示例(伪代码)
task current_loop : period=1ms, deadline=1ms, priority=10
task speed_loop : period=10ms, deadline=10ms, priority=8
task overcurrent : event=IRQ, deadline=50us, priority=15
task param_update : sporadic, min_interval=20ms, deadline=5ms, priority=5
io_map:
ADC_Current -> current_loop.input
PWM_Output -> current_loop.output
Encoder -> speed_loop.input
Fault_Pin -> overcurrent.trigger
误区与复盘
复盘时应重点检查三件事:第一,每个任务的释放条件是否与I/O物理特性一致,例如数字输入抖动是否需要消抖后再触发;第二,最坏情况执行时间是否留有余量,通常建议CPU利用率不超过70%;第三,跨模型交互是否引入额外抖动,例如事件驱动任务唤醒周期任务时,应使用信号量或消息队列而非忙等。只有把模型选择、优先级分配与I/O映射统一考虑,才能让实时系统既满足时限,又保持工程可维护性。