1、调度策略概述:多核CPU架构简介、混合仪表盘系统特点、实时性与公平性权衡
各位同学,咱们今天聊聊多核CPU调度。说实话,这个题目看着挺大,但别怕。我做了十几年嵌入式系统,从单核一路干到八核,踩过的坑比你们见过的芯片都多。今天这一章,咱们先把地基打牢。
1.1 多核CPU架构,没那么神秘
多核CPU,说白了就是一个芯片里塞了好几个CPU核心。每个核心都能独立跑程序,就像工厂里多了几个工人同时干活。
常见的架构有两种:
- 对称多处理(SMP):所有核心地位平等,共享内存。我最早接触的ARM Cortex-A系列就是这种。好处是写代码简单,坏处是抢内存时容易打架。
- 非对称多处理(AMP):核心各干各的,有的跑Linux,有的跑裸机程序。我在做汽车仪表盘时用过这种方案——一个核跑HMI界面,另一个核跑实时控制,互不干扰。
关键点:混合仪表盘系统,通常采用AMP架构。为什么?因为仪表盘既要显示炫酷的动画(非实时),又要处理CAN总线上的刹车信号(强实时)。你想想看,这两件事放一个核里,万一动画卡一下,刹车延迟了,那可就出大事了。
1.2 混合仪表盘系统,到底特殊在哪?
我参与过一款量产车型的仪表盘开发。那系统有个特点——混合关键性。什么意思?就是任务分三六九等:
- 安全关键任务:车速显示、故障报警、刹车信号。这些必须准时,晚1毫秒都不行。
- 非安全关键任务:导航地图渲染、音乐播放。这些可以偶尔卡一下,用户能忍。
- 背景任务:日志记录、OTA升级包下载。有空就干,没空就等着。
嗯,这里要注意。混合仪表盘和普通手机系统最大的区别在于——你不能重启。手机死机了按电源键,车开着呢仪表盘黑了,你试试?
我的经验:我曾经在一个项目里,把导航渲染和车速显示放在同一个核上。结果导航地图更新时,CPU占用率飙到90%,车速显示延迟了200ms。测试工程师一脚油门下去,仪表盘上的速度还停在30km/h,实际已经60了。从那以后,我坚决把安全任务隔离到独立核心上。
1.3 实时性与公平性,一对冤家
做调度策略,本质上就是在做选择题。你给了实时性,公平性就得让路。反过来也一样。
咱们看个具体例子:
| 调度策略 | 实时性 | 公平性 | 适用场景 |
|---|---|---|---|
| 固定优先级(如Rate Monotonic) | 高 | 低 | 安全关键任务 |
| 时间片轮转(Round Robin) | 低 | 高 | 背景任务 |
| 最早截止时间优先(EDF) | 极高 | 中 | 混合关键性系统 |
为什么会这样?我解释一下。固定优先级调度,说白了就是给每个任务定个优先级,高优先级的先跑。这招对实时性很友好,但低优先级的任务可能永远轮不到——这就是所谓的「优先级反转」。我遇到过最夸张的一次,一个低优先级的日志任务等了整整3分钟才拿到CPU。
时间片轮转呢?大家轮流用CPU,公平得很。但实时性就差了——万一轮到刹车信号时,时间片刚好用完,得等下一轮。这在仪表盘上是要命的。
避坑指南:我曾经在一个项目里天真地用了纯EDF调度。理论上EDF能保证所有任务都在截止时间前完成,对吧?但实际跑起来,当任务数量超过某个阈值时,调度开销暴涨,反而导致大量任务超时。所以,理论归理论,工程上一定要做压力测试。
1.4 我的建议:分层调度
讲了这么多,到底怎么选?我个人习惯用分层调度的思路:
- 第一层:核心分配。把安全关键任务固定到某个核心上,用固定优先级调度。其他任务放到另一个核心上,用时间片轮转。
- 第二层:优先级管理。在安全核心上,再细分为几个优先级等级。比如刹车信号优先级最高,车速显示次之,故障诊断最低。
- 第三层:带宽预留。给安全任务预留30%的CPU余量。别问我为什么是30%,这是血的教训换来的——我曾经只留了10%,结果一次OTA升级包下载占满了CPU,安全任务差点超时。
说白了,没有完美的调度策略。只有适合你系统的策略。混合仪表盘这个场景,安全永远是第一位的。公平性?等车停稳了再说吧。
本章小结:多核架构选AMP,任务分三类(安全、非安全、背景),调度策略要优先保证实时性。下一章咱们具体聊聊「固定优先级调度」在仪表盘上的实现细节。