切换主题
工程师如何设计一个RTOS系统
用一句话说明这篇笔记最终要解决的问题。
1. 问题与背景
企业里面真正关心的是:
为什么这个Task优先级是5?
为什么这个任务必须周期执行?
为什么这个任务不能阻塞?
为什么通信任务不能比控制任务高? 这些才是工程问题。
2. 必要基础
先重新定义:什么是实时系统? 很多人误解:实时 = 很快,其实不是。 实时系统关注的是:任务是否能在规定时间内完成。
例如: 机器人控制系统: 电机控制周期:1ms 要求:每1ms执行一次速度环计算 重点不是:“平均速度很快”。 而是:最坏情况下也不能超过1ms太多。 所以实时系统关注:Deadline(截止时间)。
3. 底层原理
假设机器人系统有: Motor_Task Vision_Task Communication_Task Display_Task
如果没有优先级:CPU不知道谁重要。 但是实际重要程度: 电机控制>通信>视觉处理>显示
所以需要告诉Scheduler,谁更应该获得CPU。
- 优先级不是“速度等级”,这是一个非常容易错的地方。
错误理解:Priority 5运行速度更快,不是。 正确:Priority表示CPU资源竞争时的重要程度。
例如: 两个Task: Motor_Task Priority 5 Display_Task Priority 1
如果两个同时Ready:CPU先运行Motor,但是Motor运行多久? 取决于: 是否阻塞; 是否延时; 是否被更高优先级抢占。
- 高优先级Task为什么不能一直while(1)?
这是工程里面非常重要的问题。
错误: void Motor_Task() { while(1) { PID_Control(); } }
Priority:10
结果: Motor_Task 一直Ready, 一直Running
那么低优先级: Vision_Task Communication_Task Display_Task 怎么办?
永远: Ready ↓ 没有机会运行
这叫Starvation(任务饥饿)
- 工程上Task应该怎么设计?
一个成熟嵌入式系统: 不是:“一个功能一个死循环”。 而是:按照实时性划分。
例如: 机器人系统:
FreeRTOS
|
-------------------
| | |
Motor Sensor Communication
Task Task Task
P5 P4 P3
Vision UI
Task Task
P2 P1
- 结合你的未来方向:机器人系统
比如你的电赛机械臂。
未来架构可能:
Motor_Control_Task 周期:1ms 职责:读取编码器 计算PID 更新PWM Priority:高
Vision_Task 周期:50ms 职责:K230数据解析 目标识别 Priority:中
Communication_Task 周期:100ms 职责:UART CAN BLE Priority:低 原因: 如果视觉慢一点: 机器人还能运行
但是: 如果电机控制慢: 机械臂抖动 甚至失控
- 工程原则 高优先级满足: 强实时; 周期固定; 延迟敏感。
例如: 电机控制; 安全监控; 急停。 中优先级:
例如: 传感器融合; 通信解析。 低优先级:
例如: UI; 日志; 存储。
- Priority和Blocking的关系(非常重要)
很多人认为:高优先级Task一直占CPU。 实际上优秀RTOS设计:高优先级Task应该 运行一点 ↓ 等待事件 ↓ Blocked
例如: Motor Task: while(1) { ReadEncoder(); PID(); SetPWM(); vTaskDelayUntil(1ms); }
运行:1ms一次。 剩余时间:CPU给别人。
所以:实时系统不是“让高优先级一直跑”。 而是:高优先级任务在需要的时候优先获得CPU。
- 现在把Scheduler完整提升一层
之前理解: Scheduler:选择最高优先级Task 现在升级: Scheduler: 在满足实时性的前提下,合理分配CPU时间
当前阶段你应该形成的工程脑图 Task设计 ↓ 任务重要程度 ↓ Priority设计 ↓ 调度策略 ↓ Blocking设计 ↓ CPU利用率 ↓ 系统实时性
对你未来项目最重要的一句话
以后做: 机器人、电机、汽车电子。
不要问“我要创建几个Task?”
应该问“这个功能的实时要求是什么?它应该什么时候运行?允许最大延迟多少?应该占什么优先级?”
这才是RTOS工程师思维。