关于STM32中断优先级分组的科普,初学者常见问题解答(Q&A)

2019-07-20 23:41发布

CM3内核集成了强大的NVIC(可嵌套的向量中断控制器),
权威指南中介绍它就花了大量篇幅,
要把整个NVIC完全搞懂也不容易,
我也只学习了一点皮毛,
对于初学者来说,中断优先级分组及中断优先级设定这种基本问题是绕不开的,
刚接触NVIC的同学对此常有疑问,
本帖仅仅针对STM32中断优先级分组这一个方面,
给初学者科普一下这方面的常见问题,
老手请绕道,不过欢迎进来交流。
也可以提新的问题,我所知道的尽量解答。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
49条回答
warship
2019-07-22 03:14
本帖最后由 warship 于 2018-7-22 17:05 编辑

问题七:我们常用的4BIT优先级,分组是如何定义的?
答:前面提到过,CM3的内核是规划了用8位来表示优先级。但又允许具体的厂家可以部分实现,
这样就出现了我们常用的STM32芯片都打了对折,即只用4位来表示优先级为了最大限度的方便移植,ARM为了各系列芯片能够兼容并蓄,
定义了具体芯片的裁减原则,
可以从LSB(最低位BIT0)开始进行裁减,即:可以不实现低位,但高位必须实现。
比如只实现4位,则只有BIT7-4有用,其它位无用
但分组定义方法仍套用8位全集的,即如下:

方法0:从BIT0处进行分组,即BIT0代表子优先级,BIT1-7代表抢占优先级
方法1:从BIT1处进行分组,即BIT0、1代表子优先级,BIT2-7代表抢占优先级
方法2:从BIT2处进行分组,即3位子优先级,5位抢占优先级
方法3:从BIT3处进行分组,即4位子优先级,4位抢占优先级
方法4:从BIT4处进行分组,即5位子优先级,3位抢占优先级
方法5:从BIT5处进行分组,即6位子优先级,2位抢占优先级
方法6:从BIT6处进行分组,即7位子优先级,1位抢占优先级
方法7:从BIT7处进行分组,即8位子优先级,0位抢占优先级
由于BIT0-BIT3厂家没有实现功能,这个时候以上方法3-方法0的实际效果是一样的,
都是BIT4-7为抢占级,
只有从方法4 开始才会体现出区别,
小于等于方法3,子优先级实际位数都是0(如:方法3理论上是定义了4位子优先级,参见上面的定义),
因这些位不存在(厂家没有实现功能),可看作理论上有,实际上没有
方法4:从BIT4开始表示子优先级,即1位(理论上是5位)子优先级,3位抢占优先级
方法5:从BIT5开始表示子优先级,即2位(理论上是6位)子优先级,2位抢占优先级
方法6:从BIT6开始表示子优先级,即3位(理论上是7位)子优先级,1位抢占优先级
方法7:从BIT5开始表示子优先级,即4位(理论上是8位)子优先级,0位抢占优先级



这样,对于4位优先级的系统,则实际退化成只有五种分组:
分组4:从BIT4开始表示子优先级,即0位子优先级,4位抢占优先级(对应上面的方法3,设置SCB->AIRCR的BIT10:8为011
分组3:从BIT4开始表示子优先级,即1位子优先级,3位抢占优先级(对应上面的方法4,设置SCB->AIRCR的BIT10:8为100
分组2:从BIT5开始表示子优先级,即2位子优先级,2位抢占优先级(对应上面的方法5,设置SCB->AIRCR的BIT10:8为101
分组1:从BIT6开始表示子优先级,即3位子优先级,1位抢占优先级(对应上面的方法6,设置SCB->AIRCR的BIT10:8为110
分组0:从BIT5开始表示子优先级,即4位子优先级,0位抢占优先级(对应上面的方法7,设置SCB->AIRCR的BIT10:8为111







一周热门 更多>