在开发过程中,经常对中断优先级疑惑,中断分组,抢占优先级,响应优先级要如何理解?是哪些寄存器在起作用?代码要如何配置? 本次就花些时间整理一下思路。
一、 中断分组原理的个人理解 CORTEX-M4的中断优先级分为抢占优先级与响应优先级。
按照字面理解如下: 抢占优先级(preemptive priority):优先级高的可以抢占低级中断的CPU使用权。响应优先级(Subpriority):优先级高的可以得到CPU的优先响应。 响应优先级只有在同等抢占优先级下才有意义,也只有在中断同时发生时才有意义。 其他情况下的中断,谁先发生就响应谁。 CORTEX_M4使用一个寄存器表示中断优先级,此寄存器最高为8位。 但是芯片设计商会根据芯片规格选择有效的位数(保留高位)。例如ST只使用了4位。 保留下来的这些位需要表明抢占优先级和响应优先级。 如何区分两种优先级就需要中断优先级分组(Priority Grouping),中断优先级分组就是表明如何分配保留下来的这些位。 优先级分组在寄存器SCB->AIRCR的BIT[8~10]中配置。 CORTEX-M4中,标准的配置如下 以上分组确定之后,就可以根据分组情况确定抢占优先级与响应优先级的分配了。 二、 举例说明 以ST为例,ST的优先级寄存器保留了4位,因此其有效的分组只能有以下几种情况 在只有高四位有效的情况下,分组0~2与分组3表示的意义是一样的,都是只有抢占优先级,没有响应优先级。所以ST的分组只有3~7这几种可能。由于要将3~7写入寄存器SCB->AIRCR的BIT[8~10],所以最终ST的分组代码如下 三、 小华F460的中断配置 1、 确定F460中断有效位数 通过F460的参考手册,可以确定F460也是同样保留了4位中断优先级寄存器。 在代码中也有相关的配置 2、按照CORTEXM4权威手册,中断分组默认组别为0. 通过仿真器在线仿真,也可以确认此处分组确实为0。 因此F460默认的中断只有16个抢占优先级,没有响应优先级。 如果需要使用响应优先级,可以先配置中断分组,然后再配置中断的抢占优先级与响应优先级即可。
|