Skip to content

工程师如何设计一个RTOS系统

用一句话说明这篇笔记最终要解决的问题。

1. 问题与背景

企业里面真正关心的是:

为什么这个Task优先级是5?

为什么这个任务必须周期执行?

为什么这个任务不能阻塞?

为什么通信任务不能比控制任务高? 这些才是工程问题。

2. 必要基础

先重新定义:什么是实时系统? 很多人误解:实时 = 很快,其实不是。 实时系统关注的是:任务是否能在规定时间内完成。

例如: 机器人控制系统: 电机控制周期:1ms 要求:每1ms执行一次速度环计算 重点不是:“平均速度很快”。 而是:最坏情况下也不能超过1ms太多。 所以实时系统关注:Deadline(截止时间)。

3. 底层原理

假设机器人系统有: Motor_Task Vision_Task Communication_Task Display_Task

如果没有优先级:CPU不知道谁重要。 但是实际重要程度: 电机控制>通信>视觉处理>显示

所以需要告诉Scheduler,谁更应该获得CPU。

  1. 优先级不是“速度等级”,这是一个非常容易错的地方。

错误理解:Priority 5运行速度更快,不是。 正确:Priority表示CPU资源竞争时的重要程度。

例如: 两个Task: Motor_Task Priority 5 Display_Task Priority 1

如果两个同时Ready:CPU先运行Motor,但是Motor运行多久? 取决于: 是否阻塞; 是否延时; 是否被更高优先级抢占。

  1. 高优先级Task为什么不能一直while(1)?

这是工程里面非常重要的问题。

错误: void Motor_Task() { while(1) { PID_Control(); } }

Priority:10

结果: Motor_Task 一直Ready, 一直Running

那么低优先级: Vision_Task Communication_Task Display_Task 怎么办?

永远: Ready ↓ 没有机会运行

这叫Starvation(任务饥饿)

  1. 工程上Task应该怎么设计?

一个成熟嵌入式系统: 不是:“一个功能一个死循环”。 而是:按照实时性划分。

例如: 机器人系统:

          FreeRTOS


             |

    -------------------

    |        |        |

Motor Sensor Communication

Task Task Task

P5 P4 P3

Vision UI

Task Task

P2 P1

  1. 结合你的未来方向:机器人系统

比如你的电赛机械臂。

未来架构可能:

Motor_Control_Task 周期:1ms 职责:读取编码器 计算PID 更新PWM Priority:高

Vision_Task 周期:50ms 职责:K230数据解析 目标识别 Priority:中

Communication_Task 周期:100ms 职责:UART CAN BLE Priority:低 原因: 如果视觉慢一点: 机器人还能运行

但是: 如果电机控制慢: 机械臂抖动 甚至失控

  1. 工程原则 高优先级满足: 强实时; 周期固定; 延迟敏感。

例如: 电机控制; 安全监控; 急停。 中优先级:

例如: 传感器融合; 通信解析。 低优先级:

例如: UI; 日志; 存储。

  1. Priority和Blocking的关系(非常重要)

很多人认为:高优先级Task一直占CPU。 实际上优秀RTOS设计:高优先级Task应该 运行一点 ↓ 等待事件 ↓ Blocked

例如: Motor Task: while(1) { ReadEncoder(); PID(); SetPWM(); vTaskDelayUntil(1ms); }

运行:1ms一次。 剩余时间:CPU给别人。

所以:实时系统不是“让高优先级一直跑”。 而是:高优先级任务在需要的时候优先获得CPU。

  1. 现在把Scheduler完整提升一层

之前理解: Scheduler:选择最高优先级Task 现在升级: Scheduler: 在满足实时性的前提下,合理分配CPU时间

  1. 当前阶段你应该形成的工程脑图 Task设计 ↓ 任务重要程度 ↓ Priority设计 ↓ 调度策略 ↓ Blocking设计 ↓ CPU利用率 ↓ 系统实时性

  2. 对你未来项目最重要的一句话

以后做: 机器人、电机、汽车电子。

不要问“我要创建几个Task?”

应该问“这个功能的实时要求是什么?它应该什么时候运行?允许最大延迟多少?应该占什么优先级?”

这才是RTOS工程师思维。

FreeRTOS 内核与工程实践