Cortex M33核的中断
·
中断
- 处理器因为某些事件而改变了当前的处理流程,转而执行相关的异常处理流程
- 几乎所有现代处理器都支持异常和中断
- 发生中断时执行的软件代码称为中断处理程序(ISR)
异常
- 对于ARM术语,中断是异常的一种
- 异常包括
- 外设中断:IRQs,其他硬件事件信号,比如 复位
- 执行中的错误:总线错误,内存错误
- 软件产生的事件:如 SVC命令
- 为支持操作系统而使用的异常:如 切换任务/线程
处理异常/中断的方法

- 中断被触发后,响应需要排队(如果正在响应一个中断,新被触发的中断只有优先级更高,才能立刻得到响应)
- 中断需要检查是否被屏蔽(有寄存器控制中断是否被屏蔽)
- 进入中断处理程序前需要保护现场(硬件自动完成)
- 保护现场的范围——AAPCS(ARM Architecture Procedure Call Standard 即 ARM架构下的过程调用标准规范),R0–R3, R12, LR(R14), xPSR,下一条需要执行的指令地址需要压栈
- 如果使能了 FPU,那么额外的S0–S15 和 FPSCR 需要压栈
- 如果中断处理程序中使用了其他的寄存器,由软件进行压栈,并在退出前由软件负责出栈,上述操作由一般由编译器自动处理
- 中断处理完成后,需要触发返回
- 处理过程结束时,将会利用执行特殊值(EXC_RETURN)来触发异常返回机制,该值保存在LR寄存器中
- 处理器还会检查当前是否还有其他异常要处理。如果没有,处理器就会恢复之前存储在栈空间中的寄存器值,并继续执行中断前的程序
中断向量表
- 想要快速确认中断处理程序的入口地址,处理器用查表方法解决——中断向量表

- 任何异常处理程序首地址存放位置:
- 对于Cortex-M0/M0+/M1/M3/M4 内核,复位后,中断向量表位于 0x0
- 对于Cortex-M23/M33 内核,复位后,中断向量表位于0x0 + VTOR
- 每个异常/中断的处理程序入口地址,相对于向量表起始地址的偏移地址是:Exception type × 4
- 举例说明:Reset 的Exception type = 1,异常处理程序的入口地址存放位置:
- 当VTOR为0时,为 0x0000 0004
- 举例说明:SysTick(嘀嗒时钟)的Exception type = 15,异常处理程序的入口地址存放位置:
- 当VTOR位0时,为 15 * 4 = 0x0000 003C
- 向量表复位后的初始地址
- 对于Cortex M0/M0+/M3/M4,在地址0
- 对于Cortex M23/M33 在 Vector Table Offset Register (VTOR) 指定的地址
- 地址 0x0000 0000 存放的是MSP的初始地址
- 向量表中的异常处理程序地址的最低位(LSB)必须都是1,以向处理器表明处于Thumb状态
- Thumb 是Cortex M核的指令集,在早期的ARM处理器架构中,曾出现过32位 ARM 指令集(每条指令都是32位长度),相对应的,运行ARM指令集的状态,也被称为ARM状态
- 后来,为了提高程序存储器空间使用率,出现了16位 Thumb指令集(每条指令都是16位长度),相应的,运行Thumb指令集的状态,就被称为Thumb状态
- 使用Thumb指令集的代码其入口地址的最低位要求必须是1,以指示处理器按Thumb在相应的指令集状态
- 到 ARM V7版本,出现了 Thumb2指令集,是对Thumb指令集的扩展和优化
- 因为ARM V7 和 ARM V8版本仅仅有Thumb指令集,如果地址最低位不是1,会引起UsageFault(用法错误)
NVIC控制器
- Nested Vectored Interrupt Controller 可嵌套向量中断控制器,是Cortex M核的一部分

- 不同Cortex M核的差异

灵活的异常管理/中断管理
- 支持脉冲模式的中断触发——脉冲至少维持1个时钟周期
- 支持电平模式的中断触发——高电平触发(处理器厂家可以使用逻辑电路将低电平触发的变成高电平)
可嵌套控制
- 优先级高的中断可打断优先级低的中断,获得处理器处理
- 优先级分为抢占优先级和子优先级,优先级数越小,优先级越高
- 除了Reset 、NMI、HardFault 等几个系统异常优先级固定,其余的,都可编程

- 触发但因有同级或更高优先级的异常/中断正在处理,刚触发的中断会进入挂起状态,直到优先级更高的所有中断处理完毕
向量异常/中断入口
- 中断向量表使得获取入口地址的响应时间更短,更一致
中断屏蔽
- 可通过 PRIMASK、FAULTMASK(Cortex M4/M33具备)、BASEPRI (Cortex M4/M33具备)对异常/中断进行屏蔽,阻止响应
中断优先级
抢占优先级与子优先级
- 抢占优先级高(优先级编号小)的异常/中断可以打断抢占优先级低的异常/中断获得处理器控制权
- 抢占优先级相同的异常/中断同时被触发时,子优先级高(优先级编号小)的异常/中断先被响应
- 抢占优先级和子优先级都相同的异常/中断同时触发,Exception type小的先被响应
优先级分组
- ArmV8-M 使用了8bit作为一个异常/中断的优先级配置寄存器
- 抢占优先级最多占用7bit,子优先级至少占1bit

Cortex M 核MCU的优先级策略
Cortex M核的优先级定义
- 芯片生产厂家可以自行定义优先级配置寄存器位数,最小1bit,最大 8bit
- 当不足8bit时,低位被舍去,这样是为了增加移植的兼容性
- 舍去低位:

- 舍去高位:

Cortex M23/M33的优先级

更多推荐



所有评论(0)