开发者学堂课程【嵌入式之 RFID 开发与应用2020版:Stm32 抢占和子优先级配置】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/665/detail/11155
Stm32 抢占和子优先级配置
内容介绍:
一、中断线 0 到 15
二、中断优先级
三、分配方式
一、中断线 0 到 15
上节课主要学习中断的外部中断线,包括中断符函数、中断的入口。对于外部中断来说,它提供七个入口,但中断线一共有 16 个,有些中断是复用的。
其实在这里都有中断线 0 到 15,包括这里的计算器,计算器不用了解。
二、中断优先级
接下来,看中断优先级,
中断对于官方来说,cortex- M 提供了 8 位来完成对各个中断的优先级配置,但STM32 只使用其中的四位,这也就意味着它最多可以编码出 16 种状态( 16 个优先级)。
注意:千万不要误以为 2 的四次方,而是从 0 到 15。
优先级分为抢占优先级和响应优先级。
抢占优先级很好理解,如果这四个比特位里用作抢占的就表示优先级是可打断的,优先级高可以打断优先级低的。
响应优先级又叫做子优先级或副优先级,主要是在当抢占优先级相同时,由响应优先级来决定谁先执行。
既要设置抢占优先级,又要设置响应优先级,抢占优先级和响应优先级总共四位。
STM32 提供五种分法,如果抢占优先级不占一位,四个比特位全部用于子优先级,普通型大概 60 个中断每一个都是同等级别的,它不具有嵌套的功能。也就是只有一个优先级。
子优先级不可打断,假设有 A、B 中断同时出发,一旦 A 执行,再有一个 C 中断处罚,C 的优先级就算是比A高也不能打断,要等待 A 执行完成才能去执行 C。
最后一种比较极端的情况,把四个比特位全部用作抢占优先级。也就意味着所有的中断响应级别处在同个级别,可以为不同的中断设置不同的抢占优先级,最多可以设置 16 级。比如 A 和 B 同时触发中断,A 优先级高先执行。此时 C 的优先级比 A 还要高,A 暂时被打断去执行 C。这就是所谓的抢占优先级。
一般情况,如果没有特别要求,可以设成各占两位的情况,各有四个级别(0到3)。抢占优先级可以设四级,响应优先级也可以设四个等级。
三、分配方式
大多数的情况下,其实并没有对系统进行配置,所以它会有一个默认值。通常是通过函数去配置,比如通过函数配置时,需要传递不同的( NVIC PriorityGroup_1 ),选择 Group0、1、2、3、4 里的哪个就决定了分配方式。
如果选择的是 Group1 决定抢占优先级占一位,可以签到两个优先级,而响应优先级占三位,可以设定八个响应优先级。如果你把它设成 0,那就没有抢占优先级,以此类推。
例如:
>WVIC PriorityGroupConfig(NVIC PriorityGroup_1)
抢占优先级占 1 位 (NVIC_IRQChannelPreemptionPriority)>可以设置两个抢占优先级,可嵌套两层
响应优先级占 3 位( NVIC IRQChannelSubPriority)>可以设置 8 个响应优先级
>NVIC PriorityGroupConfig NVIC PriorityGroup O 抢占优先级占 0 位
>可以设置 1 个抢占优先级,就是正在运行的这个>响应优先级占 4 位
>可以设置 16 个响应优先级,此时的中断就不可嵌套了
用前面的方法,接口在内核里,在库里面官方提供好。所以,如果要去使用接口可以搜索下。
实现的部分当然点 C 程序,把它设成五种情况,分哪一种它会告诉你,抢占优先级占 0 位,运行占 4 位,大概的分配情况。
在完成中断初始化之前,起初应该去调 NVIC_PriorityGroupConfig 函数,调完后,具体怎样去配置某个特定的中断的抢占优先级和子优先级,代码时看到底一个具体的路断怎样去配置抢占优先级和子优先级,抢占的原理就是这样。