中断

  • 处理器因为某些事件而改变了当前的处理流程,转而执行相关的异常处理流程
  • 几乎所有现代处理器都支持异常和中断
  • 发生中断时执行的软件代码称为中断处理程序(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的优先级

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐