想象你是一家公司的总台(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 无抢占功能

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐