第七章 中断系统与异常
一、中断
1、中断是CPU和外部设备交换数据以及用户要求计算机为自己服务的主要方式之一。
2、中断可以看作是异常的一种。中断对内核来说是意外突发 事件,请求信号来自外部;异常是内核产生的,即是在 执行指令或存取中产生的。
3、中断的作用
4、中断源
硬中断源 (外中断):外部的电路在CPU的引脚上产生的 中断请求,可能是电位信号或者脉冲信号。硬中断源不 止一个,取决于接受硬中断请求的引脚。
软中断源:CPU执行程序过程中产生的中断,例如除法 溢出等。
常见中断源:
不同的中断源又可以分为条件中断和无条件中断
无条件中断源的申请,CPU一定要响应 ,例如不可屏 蔽中断NMI。
条件中断要求CPU处于开中断状态才响应中断,在关 中断状态则不响应。
5、中断优先级管理
原因:可以有序处理多个中断源对CPU的同时申请, CPU优先处理优先 级高的中断;
可以允许中断嵌套。
中断嵌套规则:对于大多数系统,只有高优先级的中断源可以打断低优先级中断 的服务;低级中断,或者同级中断原则上是不能要求中断嵌套的。
6、中断向量表
中断向量表是系统RAM或者系统ROM的一个区域 ,向 量表的大小取决于CPU支持的中断类型和数量。
类型:
指令型的中断向量表:一般位于系统的ROM区域 (修改比较困难),存放的是一条转移指令。
矢量中断的中断向量表:在系统的ROM或者RAM区 域存放的是中断向量(使用比较灵活)。中断向量是 异常服务程序的入口地址。
例子:1、经典的ARM7TDMI处理器采用 的是指令型的中断向量表。
2、Cortex-M处理器采用矢量中断。
异常编号乘以4可以得到向量 表中该矢量地址的起始位置。
7、中断过程
1)初始化
在中断过程发生之前,需要确认系统是否能响应该中断源,如果是 有条件的外部中断,一定要检查它的屏蔽位、优先级和触发方式, 为该中断准备对应的中断服务程序(ISR)。
2)中断申请
除系统异常和软中断,外部设备要向CPU发送中断请求信号(电平信 号或脉冲信号);
需要注意外部设备发出的请求信号和CPU的要求是否一致。如果不一 致,就要通过接口电路来解决;
中断判优(判别中断源的优先级);
若符合中断条件和优先权,CPU接受中断请求,进入中断响应阶段。
3)中断响应
4)中断服务
5)中断返回
二、Cortex-M处理器的中断
1、中断源
NVIC接收多个中断源的中断请求:①外部中断请求②不可屏蔽中断NMI③SysTick系统节拍中断④内核系统异常
2、异常类型编号
ARM Cortex-M4处理器共支持240个外部中断,外部中断 输入#0~#239也对应到NVIC的中断输入。
3、中断管理
Cortex-M处理器内核中有中断屏蔽寄存器PRIMASK、FAULTMASK 和BASEPRI,用于异常或者中断的屏蔽管理
PRIMASK寄存器只能在特权等级下访问,可以禁止除了NMI和 HardFault外的所有异常,常应用于需要暂时禁止所有中断以执行 一些时序关键的任务。PRIMASK寄存器实质上是将当前的优先 等级改为0(可编程最高等级)。
FAULTMASK寄存器只能在特权等级下访问,可以禁止除了NMI 外的所有异常(甚至是HardFault异常)。FAULTMASK寄存器实 质上是将当前的优先等级提升为-1。当FAULTMASK寄存器置1 时,只有NMI异常会被响应。
注意:除了NMI异常处理之外,所有的异常处理会在返回退出时自动将FAULTMASK寄存器清除。
每个异常(包括中断)都具有一个优先等级,数值越小优先级越高。
使用BASEPRI寄存器禁止某特定优先等级及其以下等级的中断。
4、中断优先级
Cortex-M4处理器的NVIC具有多个中断和异常管理的可 编程寄存器,在CMSIS-Core里对应这些寄存器分别定义 了NVIC和系统控制块SCB的结构体,可以编程设置其中 的寄存器来实现中断管理。
中断优先级寄存器NVIC_IPRx,每个32位的寄存器可管 理4个IRQ中断的优先级配置,对应CMSIS-Core中的 NVIC->IP[n]
3个SCB_SHPR寄存器存放内核异常的优先级配置, 最大 可配置12个内核异常的优先级,对应CMSIS-Core中的 NVIC->SHP[n]
三、Cortex-M0+处理器的中断优先级
Cortex-M0+处理器的NVIC_IPR只有8个寄存器,则最多 支持32个IRQ中断源,加上16个内核异常,一共有48个中断源。
中断优先级配置PRI_xx的8位中只有最高2位[7:6]有效, 则只有4个可用的优先级配置:0x00、0x40、0x80、0xC0。
Cortex-M0+处理器的优先级配置相对简单,优先级寄存 器存放的配置PRI_xx越低则中断优先级越高,优先级比 较高的中断可以随时抢占优先级低的中断服务。一般默 认中断源的异常编号越低,其中断优先级也越高,用户 可以根据实际需要进行相应配置。
四、Cortex-M4处理器的中断优先级
Cortex-M4处理器的8位优先级寄存器进一步划分为两个部 分:分组优先级(也称抢占优先级,pre-emption priority) 和子优先级(subpriority)。
分组优先级决定了是否能嵌套,高的组优先级中断(数值 低)可以抢占低的组优先级(数值高)中断,如果组优先级是一样的,即使子优先级比正在执行的中断的子优先级高也是不能抢占的。
在组优先级一致的情况下,多个中断请求同时发生,这样 的情况下子优先级高的可以先执行,而子优先级低的则只 能暂时挂起(pending)。
五、Cortex-M处理器
1、向量表重定位
Cortex-M处理器的向量表一般被定义在微控制器供应商的启动代码中。起始地址0x00000000处是Flash存储器或者ROM设备,运行时不能修改, 但是为了运行时动态修改或者重定义向量表,Cortex-M4处理器采用了 “向量表重定位”的方式。“向量表重定位”方式提供一个可编程的向量表偏移寄存器SCB- >VTOR,SCB->VTOR寄存器配置新向量表的基地址。
一般是将新向量表的位置重定位为RAM存储器的首地址 (0x20000000)。由于最小的中断向量表要求对齐为128字节,所以 SCB->VTOR寄存器的最低7位保留且被强制置为0。中断向量表的大小一般要被扩展为下一个2的整数次方。
例:Cortex-M微控制器有32个或者75个中断源的情况下,请给出向量 表的大小以及可能设置的向量表的基地址。 32个中断源的向量表大小为: (32(用于中断)+16(系统异常))×4(每个向量的字节数)=192 扩展为下一个2的整数次方得到256字节,因此向量表的基地址可被设 置为0x00000000、0x00000100、0x00000200等。 75个中断源的向量表大小为: (75(用于中断)+16(系统异常))×4(每个向量的字节数)=364 扩展为下一个2的整数次方得到512字节,因此向量表的基地址可被设 置为0x00000000、0x00000200、0x00000400等。
2、中断过程
(1) 初始化过程
Cortex-M处理器在CPU复位后,所有中断处于禁止状态, 且默认的优先级为0。在使用任何一种中断之前,需要进 行如下操作:
1)设置所需中断的优先级(该步骤是可选的);
2)使能外设中的可以触发中断的中断产生控制;
3)使能NVIC中的中断。
(2) 中断申请过程
若满足下列的中断申请条件,Cortex-M处理器会接受中 断申请:
处理器正在运行,未被暂停或处于复位状态;
• 处理器正在运行,未被暂停或处于复位状态;
• 中断处于使能状态,NMI和HardFault总是处于使能;
• 中断的优先级高于当前的等级;
• 中断未被屏蔽寄存器PRIMASK等屏蔽。
Cortex-M处理器的NVIC控制器支持:
• 脉冲(pulse-sensitive)中断请求的外设
• 高电平(level-sensitive)中断请求的外设
不需要配置NVIC的寄存器来选择其中一种中断类型。
经典ARM处理器的中断请求例如IRQ和FIQ都需要在中断 处理之前一直保持请求信号。
Cortex-M处理器中的NVIC可以确保即使中断的源设备取 消了中断请求信号,已产生的中断挂起仍会被处理。