打印
[应用方案]

Cortex-M3中断优先级

[复制链接]
1314|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
春风的暖暖|  楼主 | 2016-1-7 21:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
(Cortex-M3)中有两个优先级的概念——抢占式优先级和响应优先级,有人把响应优先级称作'亚优先级'或'副优先级(有关这个概念在下面附加内容有)',每个中断源都需要被指定这两种优先级。
具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套,或者说高抢占式优先级的中断可以嵌套低抢占式优先级的中断。
当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪一个。
沙发
春风的暖暖|  楼主 | 2016-1-7 21:24 | 只看该作者
The PRIGROUP field indicates the position of the binary point that splits the PRI_n fields in the Interrupt
Priority Registers into separate group priority and subpriority fields. Table 4.18 (p. 100) shows how
the PRIGROUP value controls this split.
Table 4.18. Priority grouping

使用特权

评论回复
板凳
春风的暖暖|  楼主 | 2016-1-7 21:25 | 只看该作者
Interrupt priority level value, PRI_N[7:0]                    Number of         Number of
PRIGROUP  Binary point   Group priority bits Subpriority bits Group priorities Subpriorities
b100-b000 bxxx.00000       [7:5]               None               8                  1
b101      bxx.y00000       [7:6]                [5]               4                  2
b110      bx.yy00000       [7]                 [6:5]              2                  4
b111      b.yyy00000        None               [7:5]              1                  8
1PRI_n[7:0] field showing the binary point. x denotes a group priority field bit, and y denotes a subpriority field bit.
以上是EFM32的中断优先级的设置情况,EFM32TG用3个位表示优先级(M3最多用8个位),字节中的最高三位,抢占式与响应式的各个位如上所示

使用特权

评论回复
地板
yiyigirl2014| | 2016-1-8 21:23 | 只看该作者
以下是《中断控制(Interrupt).pdf》中的关于中断优先分组(Interrupt priority grouping)的介绍。
ARM Cortex-M3处理器内核可以配置的中断优先级最多可以有256级。虽然Stellaris系列ARM只实现了8个中断优先级,但对于一个实际的应用来说已经足够了。在较为复杂的控制系统中,中断优先级的设置会显得非常重要。
函数IntPrioritySet( )和IntPriorityGet( )用来管理一个片内外设的优先级。当多个中断源同时产生时,优先级最高的中断首先被处理器响应并得到处理。正在处理较低优先级中断时,如果有较高优先级的中断产生,则处理器立即转去处理较高优先级的中断。正在处理的中断不能被同级或较低优先级的中断所打断。
函数IntPriorityGroupingSet( )和IntPriorityGroupingGet( )用来管理抢占式优先级和子优先级的分组设置,参见表1和表2的描述。

使用特权

评论回复
5
yiyigirl2014| | 2016-1-8 21:23 | 只看该作者
重要规则:多个中断源在它们的抢占式优先级相同的情况下,子优先级不论是否相同,如果某个中断已经在服务当中,则其它中断源都不能打断它(可以末尾连锁);只有抢占式优先级高的中断才可以打断其它抢占式优先级低的中断。
由于Stellaris系列ARM只实现了3个优先级位,因此实际有效的抢占式优先级位数只能设为0~3位。如果抢占式优先级位数为3,则子优先级都是0,实际上可嵌套的中断层数是8层;如果抢占式优先级位数为2,则子优先级为0~1级,实际可嵌套的层数为4层;依次类推,当抢占式优先级位数为0时,实际可嵌套的层数为1层,即不允许中断嵌套。

使用特权

评论回复
6
yiyigirl2014| | 2016-1-8 21:24 | 只看该作者


表1 函数IntPriorityGroupingSet( )
功能
设置中断控制器的优先级分组
原型
void IntPriorityGroupingSet(unsigned long ulBits)
参数
ulBits:指定抢占式优先级位的数目,取值0~7,但对Stellaris系列ARM取值3~7效果等同
返回

表2 函数IntPriorityGroupingGet( )
功能
获取中断控制器的优先级分组
原型
unsigned long IntPriorityGroupingGet(void)
参数
返回
抢占式优先级位的数目,范围0~7,但对Stellaris系列ARM返回值是3~7效果等同
我看完之后尤其不明白其中的“由于Stellaris系列ARM只实现了3个优先级位”是指3个优先等级,还是什么?如果是指3个优先等级的话,岂不是和“Stellaris系列ARM只实现了8个中断优先级”相矛盾?
对此,《DS-LM3S1138-11108》2.5.6章节明确写道:
为了增强系统控制中断的能力,NVIC支持优先级分组,将中断优先级寄存器入口分为两个区域:
l一个定义了分组后的组别所对应优先级的上层区域。
l一个定义了各组中的子优先级的下层区域。
中断异常的抢占仅仅是由组优先级决定的,也就是所谓的上层区域。当处理器正在运行中断异常1的处理程序时,另外一个具有相同的组优先级的中断异常2产生了,那么中断异常2将不会抢占中断异常1。
如果组优先级相同的两个中断异常同时被挂起,那么他们的处理顺序是由子优先级决定的,并且他们之间不能发生嵌套,即抢占,只能等一个执行完毕后才能执行另一个。
如果组优先级和子优先级都相同,那么中断异常将按照中断向量表中中断号的顺序从小到大依次被处理。
可以总结出:组优先级高的(即值小,如1的优先级高于2)才能抢占组优先级低的中断异常;组优先级相同的中断异常之间不能相互抢占。因此这里的组优先级即为上文提到的抢占式优先级,而子优先级就是所谓的下层区域,即分组后组内中断异常的优先等级。



有了对抢占式优先级和子优先级的认识后,我们再来看《DS-LM3S1138-11108》P120中关于优先级分组的配置。

使用特权

评论回复
7
yiyigirl2014| | 2016-1-8 21:25 | 只看该作者
NVIC寄存器APINT中的[10:8]为用来配置组优先级和子优先级的可配置范围,其取值与对应关系见表3。PRIGROUP区域设置不同的值对应中断优先级寄存器PRIx中[7:5]位的二进制格式划分点的位置不同,从而选择不同的组优先级和子优先级。
表3 中断分组的组优先级和子优先级的配置
PRIGROUP区域a
二进制格式b
组优先级区域
子优先级区域
组优先级可配置范围
子优先级可配置范围
0x00~0x04
Bxxx.
[7:5]
0~7
0
0x05
Bxx.y
[7:6]
[7]
0~3
0~1
0x06
Bx.yy
[7]
[7:6]
0~1
0~3
0x07
B.yyy
[7:5]
0
0~7
a:NVIC寄存器APINT中[10:8]位的取值
b:x表示用来控制组优先级可配置范围的二进制位,y表示用来控制子优先级可配置范围的二进制位,小数点为划分位置
    理解了中断优先级分组的过程后,显而易见本文开头提出的问题:“由于Stellaris系列ARM只实现了3个优先级位”是指3个优先等级,还是什么?明显这个“3个优先级位”是指中断优先级寄存器PRIx中[7:5]这3位二进制位,23=8正好是最多能设置8个中断抢占等级,与前面的“Stellaris系列ARM只实现了8个中断优先级”也对应起来了,这样问题就迎刃而解了!。

使用特权

评论回复
8
yiyigirl2014| | 2016-1-8 21:26 | 只看该作者
STM32(Cortex-M3)中的优先级理解
很多人在配置STM32中断时对固件库中的这个函数NVIC_PriorityGroupConfig()——配置优先级分组方式,会很不理解,尤其是看中文翻译版的,因为中文翻译版里把这里翻译成“先占优先级和从优先级”这样翻译其实是不对的,很容易让人误解。为了便于大家理解,有必要先解释两个概念:
抢占式优先级/响应优先级:
    STM32(Cortex-M3)中有两个优先级的概念——抢占式优先级和响应优先级,有人把响应优先级称作'亚优先级'或'副优先级',每个中断源都需要被指定这两种优先级。
    具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套,或者说高抢占式优先级的中断可以嵌套在低抢占式优先级的中断中。
     当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪一个。
看了上面的介绍后,相信大家都明白了这里面的关系了,总结下便是:抢占式优先级>响应优先级>中断表中的排位顺序(其中“>”理解为比较的方向)。
    正是因为每个中断源都需要被指定这两种优先级,就需要有相应的寄存器位记录每个中断的优先级;在Cortex-M3中定义了8个比特位用于设置中断源的优先级,这8个比特位可以有8种分配方式,如下:
1.     所有8位用于指定响应优先级
2.     最高1位用于指定抢占式优先级,最低7位用于指定响应优先级
3.     最高2位用于指定抢占式优先级,最低6位用于指定响应优先级
4.     最高3位用于指定抢占式优先级,最低5位用于指定响应优先级
5.     最高4位用于指定抢占式优先级,最低4位用于指定响应优先级
6.     最高5位用于指定抢占式优先级,最低3位用于指定响应优先级
7.     最高6位用于指定抢占式优先级,最低2位用于指定响应优先级
8.     最高7位用于指定抢占式优先级,最低1位用于指定响应优先级
    以上便是优先级分组的概念,但是Cortex-M3允许具有较少中断源时使用较少的寄存器位指定中断源的优先级,因此STM32把指定中断优先级的寄存器位减少到4位,这4个寄存器位的分组方式如下:
   第0组:所有4位用于指定响应优先级
   第1组:最高1位用于指定抢占式优先级,最低3位用于指定响应优先级
   第2组:最高2位用于指定抢占式优先级,最低2位用于指定响应优先级
   第3组:最高3位用于指定抢占式优先级,最低1位用于指定响应优先级
   第4组:所有4位用于指定抢占式优先级
这里便对于于**最前提到的固件库里相关的函数了——NVIC_PriorityGroupConfig(u32   NVIC_PriorityGroup),函数的参数共有5种:
    这个函数的参数(NVIC_PriorityGroup值)有下列5种:
    NVIC_PriorityGroup_0 => 选择第0组
    NVIC_PriorityGroup_1 => 选择第1组
    NVIC_PriorityGroup_2 => 选择第2组
    NVIC_PriorityGroup_3 => 选择第3组
    NVIC_PriorityGroup_4 => 选择第4组
    这其实也很好理解,比如选择NVIC_PriorityGroup_1,那么抢占式优先级便占一位,也就是说可以有2^1个级别,可以设置为0和1,而响应优先级则占3位,也就是说可以有2^3个选择,可以设置为0~7;总共来说就可以区别>16种优先级(为什么大于而不是等于,想想就应该明白了)
   举个例子吧,假如现在有4个外部中断,还有一个EXTI9_5中断,那么如果选择优先级分组为第1组,那么抢占式优先级便只有两种,5个中断就至少有3个在抢占式优先级上是相同的优先级上,其他两个在另一优先级别。接着设置响应优先级可以有8种选择(即每个中断都要设计 抢占优先级 及响应优先级);假如现在同时有两个抢占式优先级别相同的中断发生,那么处理的顺序是谁的响应优先级高则谁优先进入中断,另外这点是需要注意的,如果此时进入这个中断之后又来了一个抢占式优先级相同但是响应优先级更高的中断,这时也是不会打断已有的中断的。






使用特权

评论回复
9
仙女山| | 2016-1-10 16:36 | 只看该作者
想知道这个中断优先级分组到底是什么意思,不是太明白啊

使用特权

评论回复
10
734774645| | 2016-1-10 17:41 | 只看该作者
STM32(Cortex-M3)中有两个优先级的概念——抢占式优先级和响应优先级,有人把响应优先级称作'亚优先级'或'副优先级',每个中断源都需要被指定这两种优先级。

使用特权

评论回复
11
energyplants| | 2016-1-11 20:03 | 只看该作者
这里面是不是也分group0-4呢?

使用特权

评论回复
12
捉虫天师| | 2016-1-30 16:18 | 只看该作者
每个中断源都需要被指定这两种优先级。

使用特权

评论回复
13
huangcunxiake| | 2016-1-30 16:54 | 只看该作者
响应优先级也称作'亚优先级'或'副优先级'

使用特权

评论回复
14
小猫爱吃鱼| | 2016-1-30 17:02 | 只看该作者
这个优先级确实把我给搞晕了,尤其是加上操作系统的时候

使用特权

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

本版积分规则

37

主题

306

帖子

2

粉丝