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

2019-07-20 23:41发布

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

问题五:优先级分组是如何定义的?
答:前面已经明确了优先级分组的意义。那么CM3具体是如何来规定优先级分组的呢?
我们说过,全集的CM3是用8位来配置优先级的,即:给每个中断配发8位的身份证
这8位中用几位来表示抢占级,用几位来表示响应级,就由分组来进行规定。
总共8位,分成两段,只须规定从第几位分界就可以了。显然一共有8种分界方法,方法n分别对应从这8BIT的BITn处作为分界起始点。具体如下:,
方法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位抢占优先级
warship
2楼-- · 2019-07-21 23:20
 精彩回答 2  元偷偷看……
warship
3楼-- · 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







warship
4楼-- · 2019-07-22 06:33
本帖最后由 warship 于 2018-7-22 17:31 编辑

问题八:如何设置系统的优先级分组?
答:一个系统,优先级分组只须设定一次,那么应该如何设定呢?
当然是根据整个系统的需求来综合考虑了。
还是以身份证为例,在发放身份证之前,我们要总体考虑全国要分多少个区域,然后确定地区需要设置几位数才够。
在4位的优先级系统中,给每个中断的身份证只有4个有效位,我们需要在这4位中,需要分成用几位表达抢占优先级,用几位表达响应优先级。总体来看,各个中断需要拉开层次,等级分化多,就让抢占位多配一些;各个中断彼此都差不多,无须分三六九等,就让抢占位少配一些;一般原子的例程中是取了折中,统一采用分组2,即抢占和响应各占2位,这里就有0-3共四级抢占,0-3共四级响应,总体设定后,对于每个具体的中断,则根据实际需要,在可选范围内分配抢占级和响应级。
warship
5楼-- · 2019-07-22 09:27
本帖最后由 warship 于 2018-7-22 18:26 编辑

问题九:在设置具体的中断优先级时,如果超出了设置范围会如何?
答:一个系统,优先级分组设定之后,其抢占优先级及响应优先级的数值范围也就确定了。
比如在4位的优先级系统中,如果设定了采用分组2,即抢占和响应各占2位,就有0-3共四级抢占,0-3共四级响应,对于每个具体的中断,则根据实际需要,在可选范围内分配抢占级和响应级,不要超出范围。如果超出会怎样呢?比如我设某中断的抢占级为5,响应级为7,调用库函数时,一般会根据优先级分组设定的位数要求,从最低位开始进行截取,由于抢占和响应各占2位,如果设置抢占级为5,即0101截取低两位为01即=1;如果设置响应级为7,即0111截取低两位为11即=3 。这样的结果,不知道是不是符合你的预期就不得而知了。
warship
6楼-- · 2019-07-22 10:06
筑梦233 发表于 2018-7-22 17:58
顶顶顶,好贴,解决了我的好多疑惑。

谢谢支持,有用就行。

一周热门 更多>