中断和优先级

《CM3权威指南》讲解的是Cortex-M3内核的整个体系,例如指令集、异常、 MPU等,《CM3编程手册》
中则是关于STM32F10/20/21/L1系列使用到的Cortex-M3的内容。换句话说《CM3编程手册》 是《CM3权威指南》的一个子集,本章内容就是参考这两个手册,对于本章没提到的内容,读者可自行阅读这两个手册扩展学习。
Cortex-M3内核有256种异常和中断,其中编号1~15是系统异常, 16~256是外部中断所如此多的中断, 导致了一些新问题。 比如两个中断同时发生,应该先执行哪个中断任务?又比如一个中断发生了,又来了一个更紧急的中断,是该继续执行原来的中断,还是执行新的紧急中断?
针对这些问题, Cortex-M3内核有一个专门管理中断的外设NVIC( Nested Vectored Interrupt Controller,嵌套向量中断控制器), 通过优先级控制中断的嵌套和调度。 NVIC是一个总的中断控制器, 无论是来在内核的异常还是外设的外部中断, 都由NVIC统一进行管理。
在这里插入图片描述
在这里插入图片描述
举个例子,假设将优先级分组(PRIGROUP)设置为2,此时每个中断可设置抢占优先级范围为0~32,
子优先级范围为0~8,比如某中断的抢占优先级为2,子优先级为3。
所有可编程的中断都需要指定抢占优先级和子优先级,抢占优先级决定是否可以产生中断嵌套,子优先
级决定中断响应顺序,若两种优先级一样则看中断在中断异常表中的位置,越靠前越先响应。
抢占优先级高(值小)的中断可以中断抢占优先级低(值大)的中断处理函数,进而执行高优先级的中
断处理函数,执行完毕后再继续执行被中断的低优先级的处理函数。
当两个中断的抢占优先级相同时,即这两个中断将没有嵌套关系,当一个中断到来后,若此时CPU正在 处理另一个中断,则这个后到来的中断就要等到前一个中断处理函数处理完毕后才能被处理,当这两个中断 同时到达,则中断控制器会根据它们的子优先级决定先处理哪个。 如果两个中断的优先级都设置为一样了,那么谁先触发的就谁先执行;如果是同时触发的,那么就根据 中断异常表的位置(靠前)来决定谁先执行。
在大概了解Cortex-M3内核的异常和中断及其优先级之后,再来看看STM32对Cortex-M3的这些异常和 中断做了哪些裁剪,又有何特点?

Cortex-M3设计有256种中断,但大多数MCU都用不到这么多中断,
启动文件“startup_stm32f103xb.s”,可以看到定义的中断向量表,
在这里插入图片描述
可以看到第2~16行,为10个系统异常,剩下的全为外部中断。同时这里还定义了所有的中断处理函数名字,当外设产生中断时,则跳到中断向量表中对应中断处理函数位置,比如发生RTC中断事件,则跳到22行 执行“RTC_IRQHandler()”函数内容。

同样,STM32F103也继承了Cortex-M3的中断优先级规则,因为中断少了很多,中断优先级也用不了那 么多,只使用了PRI_n的Bits[7:0]中的Bits[7:4]设置优先级,因此优先级分组为表 10.2.2 所示。
在这里插入图片描述
可见STM32F103系列最多有16级可编程优先级,STM32F103不使用PRIGROUP来命名分组,而采用
NVIC_PRIORITYGROUP_x 的方式命名,即 NVIC_PRIORITYGROUP_0 对 应 PRIGROUP 为 7 , 在
“stm32f1xx_hal_cortex.h”有相关定义,如代码段 10.2.2 所示。
代码段 10.2.2 优先级分组定义(stm32f1xx_hal_cortex.h)
在这里插入图片描述
通常中断优先级分组只会设置一次, 它针对的是系统中所有的中断。 后续设置某个中断的中断优先级
时, 只需要在这个组规定的抢占优先级数和子优先级级数范围内分配优先级级数。 后续代码中,不应该再修
改中断优先级分组,否则导致中断顺序不按预期触发。
这里默认设置的优先级分组为NVIC_PRIORITYGROUP_4, 则后续使用“ HAL_NVIC_SetPriority()”函数设置优先级时,抢占优先级的范围是0~15, 子优先级的值只能选择0。
在这里插入图片描述STM32中断重点理解中断优先级分组, 然后根据中断优先级分组确定抢占优先级级数和子优先级级数。
体现在编程里,就是根据中断需求, 先使用“HAL_NVIC_SetPriorityGrouping()”函数设置中断优先级分组,
再使用“ HAL_NVIC_SetPriority()”函数设置不同中断的抢占优先级级数和子优先级级数。
假设中断A的抢占优先级比中断B的抢占优先级高,两个中断同时发生,那么中断A优先执行。
假设中断A的抢占优先级和中断B的抢占优先级一样,两个中断同时发生,那么子优先级高的中断优先
执行。
假设中断A的抢占优先级比中断B的抢占优先级高,中断B先发生,随后A也发生,那么将暂停中断B,
先执行中断A, A执行完后,再回来执行中断B,最后执行主程序,这种效果即中断嵌套。
假设中断A的抢占优先级比中断B的抢占优先级一样,中断A的子优先级比中断B的子优先级高,中断B
先发生,随后A也发生,那么中断A将等待中断B执行完后,才会执行中断A,即子优先级不能中断嵌套。
假设中断A的抢占优先级和中断B的抢占优先级一样,且子优先级也一样,两个中断同时发生,那么根
据前面表 10.2.1 顺序,排在前面的先执行。
总结中断是否会优先执行依据:首先是抢占先式优先级等级,其次是子优先级等级,只有抢占优先级才
可能出现中断嵌套。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吴凯你在想啥呢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值