在Cortex-M3中,优先级对于异常来说是很关键的,它会影响一个异常是否能被响应,以及何时可以响应。优先级的数值越小,则优先级越高。Cortex-M3支持中断嵌套,使得高优先级异常会抢占低优先级异常。有3个系统异常:复位、NMI以及硬fault,它们有固定的优先级,并且它们的优先级号是负数,从而高于所有其他异常。所有其他异常的优先级则都是可编程的(但不能编程的为负数)。
原则上,Cortex-M3支持3个固定的高优先级和多达256级的可编程优先级,并且支持128级抢占。但是,绝大多数Cortex-M3芯片都会精简设计,以致实际上支持的优先级数会更少,如8级、16级、32级等。它们在设计时会裁掉表达优先级的几个低端有效位,以达到减少优先级数的目的(不管使用多少位,优先级号都是与MSB对齐的)。
举例来说,如果只使用了3个位来表达优先级,则优先级配置寄存器的结构如图3.28所示。
图3.28 使用3个位来表达优先级的情况
在图3.28中,[4:0]没有被实现,所以读它们总是返回零,写它们则忽略写入的值。因此,对于3个位的情况,能够使用的8个优先级为:0x00(最高)、0x20、0x40、0x60、0x80、0xA0、0xC0以及0xE0。
如果使用更多的位来表达优先级,则能够使用的值也更多,同时需要的逻辑门也更多,从而给微控制器带来更多的成本和功耗。Cortex-M3允许的最少使用位数为3个位,即至少要支持8级优先级。图3.29给出3位表达的优先级位和4位表达的优先级位对比。
(www.xing528.com)
图3.29 3位表达的优先级位与4位表达的优先级位对比
通过让优先级以MSB对齐,可以简化程序的跨器件移植。比如,如果一个程序早先在支持4位优先级的器件上运行,则在移植到只支持3位优先级的器件后,其功能不受影响。但若是对齐到LSB,则会使MSB丢失,导致数值大于7的低优先级一下子升高了,甚至会反转小于等于7的高优先级。例如,8号优先级如果损失了MSB,就变成0号优先级了。表3.10展示了使用3位、5位和8位来表达优先级时的情况。
表3.10 3位、5位和8位表达优先级时,优先级寄存器的使用情况
续表
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。