4. 实时模型概述

在实时模型与I/O映射工程中,实时模型描述的是“任务何时被释放、何时必须完成、以及系统依据什么来推进执行”的抽象规则。它决定了I/O采样、控制计算与输出刷新之间的时序关系,也直接影响抖动、延迟与可预测性。工程上最常见的四类模型是:周期任务模型、偶发任务模型、事件驱动模型与时间触发模型。它们并非互斥,实际系统常以组合方式出现,例如时间触发调度器承载周期任务,同时用事件驱动处理报警与故障。

核心原理:释放条件与时限约束

实时任务通常用释放时间、执行时间、相对时限与周期/最小间隔来描述。周期任务模型假设任务以固定周期T重复释放,每次释放后必须在相对时限D内完成,典型约束为D≤T。偶发任务模型不要求固定周期,只约束相邻两次释放的最小间隔,因此更适合处理“可能发生但不会密集发生”的请求。事件驱动模型强调由外部事件(中断、信号、消息到达)触发执行,响应性高但负载不确定。时间触发模型则相反,所有动作由全局时间轴预先编排,任务在确定的时间槽内执行,通信也按时间槽进行,因而具有最强的可预测性。

关键判据:若系统要求“最坏情况响应时间可证明”,优先时间触发或周期任务;若要求“对随机请求快速反应”,事件驱动或偶发任务更合适;若两者兼有,应采用分层调度:时间触发层负责关键周期回路,事件驱动层负责非关键异步处理。

四类模型对比与适用场景

模型 释放方式 时间约束 可预测性 典型场景
周期任务模型 固定周期T D≤T,抖动受限 高 PID控制回路、周期采样
偶发任务模型 随机到达,最小间隔Tmin D可小于Tmin 中高 按键、限位触发、诊断请求
事件驱动模型 中断/消息触发 依赖优先级与抢占 中低 报警、通信收包、故障处理
时间触发模型 全局时间槽 固定偏移与窗口 极高 安全联锁、分布式同步控制

方法流程:从模型选择到I/O映射

  1. 识别I/O类型:模拟量采样、数字量输入、脉冲计数、通信报文分别对应不同释放语义。
  2. 确定时限:根据控制带宽与安全要求,给出采样周期、计算时限与输出刷新窗口。
  3. 选择模型:周期回路用周期任务;随机输入用偶发任务;紧急信号用事件驱动;安全关键用时间触发。
  4. 分配优先级与时间槽:周期任务按速率单调分配优先级;时间触发任务按时间轴分配偏移,避免冲突。
  5. 映射到I/O:将输入采样、计算、输出刷新绑定到同一任务或同一时间槽,减少跨任务抖动。
  6. 验证:用响应时间分析或时间槽仿真检查最坏情况,确认无超时与资源冲突。
四类实时模型的时间轴与触发关系 时间 周期任务 T=10ms T=10ms T=10ms T=10ms 固定释放,抖动小 偶发任务 到达 到达 到达 最小间隔Tmin约束 事件驱动 中断 消息 报警 异步触发,响应快 时间触发 槽1 槽2 槽3 槽4 槽5 全局时间轴,偏移固定 0ms 20ms 40ms 60ms 80ms

案例:电机控制中的混合模型

某伺服驱动器需要每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

误区与复盘

常见误区一:把“事件驱动”等同于“实时性最好”。事件驱动响应快,但若事件密集到达且优先级配置不当,会造成低优先级任务饥饿,最坏响应时间反而不可控。误区二:认为周期任务一定比偶发任务安全。周期任务若周期设置过大,会漏掉快速变化;若过小,则CPU利用率飙升。误区三:时间触发模型不需要优先级。时间触发依赖全局时间槽,若时间槽分配冲突或时钟同步失败,系统会整体失步,因此仍需冗余与监控。

复盘时应重点检查三件事:第一,每个任务的释放条件是否与I/O物理特性一致,例如数字输入抖动是否需要消抖后再触发;第二,最坏情况执行时间是否留有余量,通常建议CPU利用率不超过70%;第三,跨模型交互是否引入额外抖动,例如事件驱动任务唤醒周期任务时,应使用信号量或消息队列而非忙等。只有把模型选择、优先级分配与I/O映射统一考虑,才能让实时系统既满足时限,又保持工程可维护性。