购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

1. 7.2 异常优先级

Cortex-M3 中的异常优先级可决定一个异常是否能被掩蔽,以及在未掩蔽的情况下何时可以响应。优先级的数值越小,优先级越高。Cortex-M3 支持中断嵌套,使得高优先级异常会抢占低优先级异常。有 3 个系统异常:复位,NMI及硬fault,它们有固定的优先级,并且它们的优先级号是负数,高于所有其他异常。所有其他异常的优先级都是可编程的。

异常优先级的设置分为两步:

(1)设置组优先级有效位(LPC17XX通过设置系统控制寄存器AIRCR[10:8]实现);

(2)设置组优先级及子优先级(LPC17XX通过设置各自的IPRx或系统控制中的SHPx寄存器实现)。

注意: 组优先级在有的书中也叫做抢占优先级或主优先级。有的文献中使用group priority,有的文献中使用preempt priority,虽然使用的词语不一样,但它们的含义是一样的,均指具有抢占功能。

如表 1-9 所示是优先级分组。其中分组位置指的是AIRCR[10:8]中的数值。IPRx寄存器分成抢占优先级与子优先级两部分。

表 1-9 优先级分组

如果有多个挂起异常共用相同的组优先级,则需使用次优先级区来决定同组中异常的优先级,这就是同组内的次优先级。组优先级和次优先级的结合就是通常所说的优先级。如果两个挂起异常具有相同的优先级,则挂起异常的编号越低,优先级越高。这与优先级机制是一致的。

抢占优先级(组优先级)决定了抢占行为:当系统正在响应某异常L 时,如果来了抢占优先级更高的异常H,则H 可以抢占L。只有组优先级才能决定中断异常的抢占。当处理器正在执行一个中断异常处理程序时,另一个与正在处理中的中断具有相同组优先级的中断不会抢占处理程序。

子优先级处理组内优先级的情况:当抢占优先级相同的异常有不止一个挂起时,就最先响应子优先级最高的异常。这种优先级分组做出了如下规定:子优先级至少是 1 个位。因此,抢占优先级最多是 7 个位,128 级。

从表 1-9 中可以看出,Cortex-M3 允许从比特 7 处分组,此时所有的位都表达子优先级,没有任何位表达抢占优先级,因此所有优先级可编程的异常之间就不会发生抢占——相当于在它们之中禁用了Cortex-M3 的中断嵌套机制。复位、NMI和硬fault属于例外情况,它们无论何时出现,都立即抢占所有中断(异常)。

CMSIS提供设置优先级函数:

LPC17XX中存在EINT0、EINT1、EINT2、EINT3 四个外部中断,在使用时分别给予了不同优先级。在这里设定EINT0>EINT1 的优先级。可以根据需要采用两种方式:一种是设定不同组,这样EINT0 可以抢占EINT1 的优先级,并可能存在优先级嵌套方式;另外一种设定同一组,但EINT0 的子优先级高于EINT1 的优先级。

程序代码如下所示。该程序使用宏定义方式来区分两种方式,并根据需要设定了INT_MODE的数值,以及采用了NVIC_EncodePriority简化组优先级和子优先级的组合计算问题。 A4vc7PQuGHzeP7DdZ4mKYcMYYndW/t3h+D0XCdO3UTF7TLQ/KMZt546P3OeiMjKS

点击中间区域
呼出菜单
上一章
目录
下一章
×