一、任务调度策略:让运动控制卡“忙而不乱”
大家好,我是老张。在工业自动化这行摸爬滚打了十几年,今天跟大伙聊聊运动控制里的核心问题——任务调度。
你想想看,一块运动控制卡,要同时处理位置环、速度环、电流环,还得响应上位机指令、处理IO中断、做轨迹规划。这么多任务挤在一块,谁先谁后?搞不好就“打架”。
我刚开始做嵌入式运动控制时,就吃过这个亏。当时一个三轴平台,跑着跑着突然抖动,查了三天,最后发现是任务调度出了问题——一个高优先级的急停任务被低优先级的通信任务堵住了。嗯,从那以后,我对调度策略就特别上心。
1.1 优先级抢占调度:谁急谁先上
这是最直观的策略。每个任务分配一个优先级,高优先级的任务可以打断低优先级任务的执行。
在运动控制里,我一般这样分配:
- 最高优先级: 位置环中断、急停处理、限位信号
- 中等优先级: 速度环、电流环、编码器采样
- 低优先级: 通信处理、状态上报、日志记录
举个例子,当伺服驱动器检测到过流,这个中断任务的优先级必须最高。它一触发,其他任务都得让路。我曾经在一个项目中,把通信任务优先级设高了,结果急停信号响应延迟了2ms,差点撞机。教训深刻啊。
1.2 时间片轮转:大家轮流来
这种策略适合那些“没有谁特别紧急”的场景。每个任务分配一个固定时间片,轮流执行。
在运动控制中,我通常把时间片轮转用在非实时任务上。比如:
- 上位机指令解析
- 状态数据打包
- 非关键参数更新
这些任务可以容忍几十毫秒的延迟,用时间片轮转最合适。但注意,千万别把位置环这种硬实时任务放进去。我见过有人把电流环采样放在时间片轮转里,结果电机一跑就震荡——时间片切换的抖动直接反映在电流波形上。
1.3 单调速率调度(RMS):周期越短,优先级越高
RMS是一种经典的实时调度算法。它的核心思想很简单:任务的周期越短,优先级越高。
在运动控制中,各个任务的周期通常是固定的:
| 任务 | 典型周期 | RMS优先级 |
|---|---|---|
| 电流环 | 50μs | 最高 |
| 速度环 | 200μs | 高 |
| 位置环 | 1ms | 中 |
| 轨迹规划 | 5ms | 低 |
| 通信处理 | 10ms | 最低 |
你看,电流环周期最短,优先级最高。这符合直觉——越需要快速响应的任务,越要优先处理。
RMS有一个重要的可调度性条件:所有任务的CPU利用率之和不能超过某个上限。对于n个任务,这个上限是 n(2^(1/n)-1)。当n很大时,这个值趋近于69.3%。
说白了,就是CPU不能太忙,得留点余量。我一般控制在60%以内,留出10%的余量应对突发情况。
1.4 最早截止时间优先(EDF):谁最急,谁先跑
EDF是另一种经典算法。它不看周期,只看“截止时间”——哪个任务离截止时间最近,哪个优先级最高。
EDF理论上更灵活,CPU利用率可以接近100%。但实际应用中,我很少用它做运动控制的主调度策略。为什么?
- 实现复杂: 需要动态计算每个任务的截止时间,系统开销大
- 不可预测: 一旦过载,多个任务同时错过截止时间,系统行为难以预测
- 抖动问题: 动态优先级切换会导致任务执行时间抖动,对运动控制影响大
不过,EDF在特定场景下很有用。比如,当多个非周期任务同时到达时,用EDF可以保证最紧急的那个先被处理。
1.5 调度策略在运动控制中的应用
说了这么多理论,咱们看看实际怎么用。下面是一个典型的运动控制任务调度架构:
// 伪代码:运动控制任务调度框架
void main_loop() {
while(1) {
// 1. 硬实时任务(优先级抢占)
if (current_loop_timer_irq) {
current_loop(); // 电流环,50μs周期
}
if (velocity_loop_timer_irq) {
velocity_loop(); // 速度环,200μs周期
}
if (position_loop_timer_irq) {
position_loop(); // 位置环,1ms周期
}
// 2. 软实时任务(时间片轮转)
run_non_realtime_tasks(); // 通信、日志等
// 3. 突发任务(EDF辅助)
handle_async_events(); // 急停、限位等
}
}
这个架构里,我把任务分成了三层:
- 硬实时层: 用RMS调度,周期越短优先级越高。这部分是运动控制的“心脏”,必须保证确定性。
- 软实时层: 用时间片轮转,处理那些可以容忍延迟的任务。
- 突发层: 用EDF思想,处理非周期事件。比如急停信号来了,它的截止时间就是“立即”,所以优先级最高。
这种混合调度策略,我在多个项目中验证过,效果不错。既保证了硬实时任务的确定性,又兼顾了系统的灵活性。
1.6 知识体系总览
下面这张图,是我对本章知识体系的总结。你可以看到,调度策略不是孤立的技术,它和任务特性、硬件资源、实时性要求紧密相关。
这张图展示了调度策略和运动控制任务之间的关系。你可以看到,不同的任务特性决定了不同的调度策略选择。没有银弹,只有最适合的方案。
公众号:蓝海资料掘金营,微信deep3321