因为第0到5位没有使用,故它们读出始终为0,对它们的写操作没有意义。在这个设定下,可以使用的优先级为0x00(最高)、0x40、0x80和 0xc0 (最低)。这点同 Cortex -M3处理器类似,只是 Cortex -M3处理器至少使用3个位,因此就具有至少8个可编程的优先级,而 Cortex -M0处理器只有4个。再加上3个固定的优先级,Cortex - M0总共具有7个优先级。
对于Cortex - M3来说,处理器有3个固定优先级和最多256 个优先级(最多有 128 个抢占等级),优先级的数量也是可由芯片设计者配置的,可选范围为8-256(多数情况下为8-32,比如 STM32 就只有16 级优先级)。 NVIC 将优先级分为两个部分:抢占优先级(用于嵌套中断)和子优先级(用于多个具有相同抢占优先级的中断同时发生),并且它们可由软件配置(SCB->AIRCR [10:8] PRIGROUP field)。
系统异常控制寄存器
对于 Cortex -M0处理器,只有3个与 OS 相关的系统异常才具有可编程的优先级,它们包括 SVC 、PendSV 和 SysTick ,其他像 NMI 和硬件错误等系统异常的优先级则是固定的。通过配置SHPR2和SHPR3两个寄存器来修改三个系统异常的优先级。
如果使用了CMSIS设备驱动库,你可以使用寄存器名SCB->SHP[0]和SCB->SHP[1]来访问SHPR2和SHPR3。
以freeRTOS为例,在port.c中,可以看到将PendSV和SysTick配置为最低优先级。
中断屏蔽寄存器(PRIMASK)
有些对时间敏感的应用,需要在一段较短的时间内禁止所有中断。对于这种应用,Cortex -M0处理器没有使用中断使能/禁止控制寄存器来禁止所有中断然后再恢复,而是提供了一个单独的特性,特殊寄存器中有一个被称作 RRIMASK,通过它可以屏蔽掉除了 NMI 和硬件错误异常的其他所有的中断和系统异常。 PRIMASK 寄存器只有1位有效,并且在复位后默认为0。该寄存器为0时,所有的中断和异常都处于允许状态;而设为1后,只有 NMI 和硬件错误异常处于使能。实际上,当 PRIMASK 设置为1后,处理器的当前优先级就降到了 0 (可设置的最高优先级)。若使用C语言以及CMSIS设备驱动库,用户可以使用以下函数来设置和清除PRIMASK。
__disable_irq();//设置PRIMASK
__enable_irq();//清除PRIMASK
对于Cortex -M3来说除了 PRIMASK 外还有其他的中断屏蔽寄存器。 BASEPRI 寄存器可以阻止某优先级或更低优先级的中断, FAULTMASK 寄存器则提供了其他的错误管理特性。
|