有关抢占优先级和子优先级的概念以及该如何在程序中配置
想象你是一家公司的总台(CPU),同时有很多电话(中断请求)打进来,你需要决定先接哪个,以及接电话的过程中要不要允许更紧急的电话打断你。
1. 抢占优先级 —— “能不能打断”
这决定了中断的紧急程度。
-
数值越小,级别越高(比如 0 级最高,1 级次之,2 级更低)。
-
如果正在处理一个 1 级电话,突然来一个 0 级电话,你会立刻挂断当前电话,转去接 0 级的(这叫“抢占”或“嵌套”)。
-
如果来的是 2 级电话,你会让对方等着,等 1 级电话处理完再接。
2. 子优先级 —— “同一紧急程度下谁先接”
当两个电话的紧急程度相同(抢占优先级一样)时,谁先被接听?
-
子优先级就决定了这个先后顺序。
-
同样,数值越小,越优先接听。
-
但是,子优先级不能打断正在进行的电话。如果已经在接一个 1 级电话,又来一个也是 1 级的电话,后到的那个必须排队等待,不会打断正在进行的那个。
一个生动的例子
假设你正在办公,面前有 3 个电话:
-
电话 A:抢占优先级 0(老板打来的,最紧急)
-
电话 B:抢占优先级 1(客户打来的)
-
电话 C:抢占优先级 1(供应商打来的),且子优先级比 B 高(比如 B 子优先级 1,C 子优先级 0)
场景 1:同时响铃
-
A(0 级)最先被接,因为它级别最高。
-
接完 A 后,B 和 C 同时等待,此时子优先级起作用:C(子优先级 0)比 B(子优先级 1)优先接听。
场景 2:接 B 的时候 A 打进来
-
你正在接 B(1 级),突然 A(0 级)打进来,你会立刻挂断 B,先接 A。等 A 挂断,再回来继续 B。
-
这时如果 B 和 C 还在等,会按照子优先级决定顺序。
场景 3:接 B 的时候 C 打进来
-
你正在接 B(1 级),C(也是 1 级)打进来,由于紧急程度相同,C 不能打断 B,只能等 B 结束后再接。
拿 Cortex-M0 内核为例
Cortex-M0 内核用 4 个二进制位(bit)来表示优先级,你可以把这 4 个位分成两部分:
-
高位用于抢占优先级
-
低位用于子优先级
不同的切分方式就是“优先级分组”。比如:
-
分组 4:4 个位全给抢占优先级(0~15 级),没有子优先级。你之前用的就是这种,所有中断只有抢占优先级,没有“同时触发谁先”的问题(同时触发由硬件固定顺序决定)。
-
分组 3:高 2 位给抢占优先级(0~3 级),低 2 位给子优先级(0~3 级)。
-
分组 2:高 1 位给抢占优先级(0~1 级),低 3 位给子优先级(0~7 级)。
一句话总结:抢占优先级决定了能不能抢,子优先级决定了同级别时谁先。
有关优先级的分组可以参考下面的列表
| 分组 | 抢占优先级位数 | 抢占优先级可取范围 | 子优先级位数 | 子优先级可取范围 | 组合说明 |
|---|---|---|---|---|---|
| Group 2 (最常用) | 2 bits | 0 ~ 3 | 2 bits | 0 ~ 3 | |
| Group 1 | 1 bit | 0 ~ 1 | 3 bits | 0 ~ 7 | 抢占只能选 0/1 |
| Group 3 | 3 bits | 0 ~ 7 | 1 bit | 0 ~ 1 | 子优先级只能选 0/1 |
| Group 4 | 4 bits | 0 ~ 15 | 0 bit | 只能填 0 | 无子优先级 |
| Group 0 | 0 bit | 只能填 0 | 4 bits | 0 ~ 15 | 无抢占功能 |
更多推荐

所有评论(0)