打印

GD32的抢占优先级和响应优先级辨析

[复制链接]
2721|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sunmeat|  楼主 | 2015-3-12 10:27 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
ic, ni, vi
本帖最后由 sunmeat 于 2015-3-12 10:40 编辑

本帖子的框架基于零死角玩转STM32,但是基于GD的内容。里面的截图都来自GD32的数据手册,于STM32无关。


NVIC_Init()函数中NVIC_InitTypeDef结构体的定义如下:


GD32 的中断向量具有两个属性,一个为抢占属性,另一个为响应属性,其属性编号越小,表明它的优先级别越高。
沙发
sunmeat|  楼主 | 2015-3-12 10:36 | 只看该作者
抢占,是指打断其它中断的属性,即因为具有这个属性,会出现嵌套中断(在执行中断服务函数 A 的过程中被中断 B 打断,执行完中断服务函数 B 再继续执行中断服务函数 A),抢占属性由 NVIC_IRQChannelPreemptionPriority的参数配置。

使用特权

评论回复
板凳
sunmeat|  楼主 | 2015-3-12 10:37 | 只看该作者
而响应属性则应用在抢占属性相同的情况下,当两个中断向量的抢占优先级相同时,如果两个中断同时到达,则先处理响应优先级高的中断,响应属性由 NVIC_IRQChannelSubPriority的参数配置。

使用特权

评论回复
地板
sunmeat|  楼主 | 2015-3-12 10:41 | 只看该作者
例如,现在有三个中断向量:

若内核正在执行 C 的中断服务函数,则它能被抢占优先级更高的中断 A 打断,由于 B 和 C 的抢占优先级相同,所以 C 不能被 B 打断。但如果 B 和 C 中断是同时到达的,内核就会首先响应响应优先级别更高的 B 中断。

使用特权

评论回复
5
sunmeat|  楼主 | 2015-3-12 10:46 | 只看该作者
本帖最后由 sunmeat 于 2015-3-12 11:20 编辑

在配置优先级的时候,还要注意一个很重要的问题,中断种类的数量。NVIC 只可以配置 16种中断向量的优先级,也就是说,抢占优先级和响应优先级的数量由一个 4 位的数字来决定, 把这个 4 位数字的位数分配成抢占优先级部分和响应优先级部分。有 5 组分配方式:

****这个分组方式由SCB_AIRC(Application Interrupt and Reset Control 应用中断和复位控制寄存器)这个寄存器决定,准确的说,由这个寄存器中的三位决定。由下图可以看出。

第 0 组: 所有 4 位用来配置抢占优先级,即 NVIC 配置的 24 =16 种中断向量都是只有抢占属性,没有响应属性。



使用特权

评论回复
6
sunmeat|  楼主 | 2015-3-12 10:47 | 只看该作者
第 1 组:最高 1 位用来配置抢占优先级,低 3 位用来配置响应优先级。表示有 21=2 种级别的抢占优先级(0 级, 1 级),有 23=8 种响应优先级,即在 16种中断向量之中,有 8 种中断,其抢占优先级都为 0 级,而它们的响应优先级分别为 0~7,其余 8 种中断向量的抢占优先级则都为 1 级,响应优先级别分别为 0~7。

使用特权

评论回复
7
sunmeat|  楼主 | 2015-3-12 10:48 | 只看该作者
第 2 组: 2 位用来配置抢占优先级, 2 位用来配置响应优先级。即 22=4 种抢占优先级, 22=4 种响应优先级。

使用特权

评论回复
8
sunmeat|  楼主 | 2015-3-12 10:48 | 只看该作者
第 3 组:高 3 位用来配置抢占优先级,最低 1 位用来配置响应优先级。即有 8 种抢占优先级, 2 种响应 2 优先级。

使用特权

评论回复
9
sunmeat|  楼主 | 2015-3-12 10:48 | 只看该作者
第 4 组:所有 4 位用来配置响应优先级。即 16 种中断向量具有都不相同的响应优先级。

使用特权

评论回复
10
sunmeat|  楼主 | 2015-3-12 10:57 | 只看该作者
要配置这些优先级组,可以采用库函数 NVIC_PriorityGroupConfig(),可输入的参数为 NVIC_PriorityGroup_0 ~ NVIC_PriorityGroup_4,分别为以上介绍的 5 种分配组。

使用特权

评论回复
11
sunmeat|  楼主 | 2015-3-12 11:21 | 只看该作者
于是,有读者觉得疑惑了,如此强大的GD32,所有 GPIO 都能够配置成外部中断, USART、 ADC 等外设也有中断,而 NVIC 只能配置 16 种中断向量,那在某个工程中使用了超过 16 个的中断怎么办呢?注意 NVIC 能配置的是 16种中断向量,而不是 16个,当工程之中有超过 16 个中断向量时,必然有 2 个以上的中断向量是使用相同的中断种类,而具有相同中断种类的中断向量不能互相嵌套。

使用特权

评论回复
12
smilingangel| | 2015-3-14 22:13 | 只看该作者
这个就是说优先级的有主从之分的呗。。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

208

主题

2132

帖子

13

粉丝