中断的产生与捕获(ARM 处理器)
- 概念
中断是一种用于响应外部或内部事件的机制,能够暂时打断当前正在执行的程序,去处理紧急事件。中断使得处理器能够优先处理重要的任务,如外设的数据读取、定时器溢出等。
- 中断的分类
- FIQ(Fast Interrupt Request,快速中断):FIQ 是一种优先级较高的中断类型,用于处理时间要求严格、响应速度快的中断。它具有专用的寄存器组,避免了中断进入时的保存操作,提高了处理效率。
- IRQ(Interrupt Request,普通中断):IRQ 是一种较为常见的中断类型,优先级低于 FIQ,通常用于一般的设备或系统事件处理。
- 中断的处理流程
- 中断的产生
- 当外设或定时器等模块检测到中断事件时,会向中断控制器(如 GIC)发出中断请求。
- 中断控制器处理中断信号,将中断请求传递给 CPU。
- 中断捕获与响应
- 保存当前上下文:当 CPU 收到中断请求后,立即中断当前的任务执行,保存当前的上下文(包括 R0-R12 寄存器和 CPSR 状态寄存器)。
- 跳转到中断处理程序:CPU 根据中断类型,从中断向量表中获取中断处理程序的入口地址,并跳转到中断服务例程(ISR)。
- 中断优先级处理:如果同时存在多个中断,GIC 通过优先级机制决定先处理哪个中断。
- 中断处理
- 中断处理程序执行特定任务。
- 例如:读取外设的数据。清除中断标志位。更新计数器或内存状态等。
- 中断服务程序可以使用寄存器 R0-R12,这些寄存器会在进入中断时保存到内存。
- 中断处理完成
- 恢复上下文:当中断处理程序完成后,CPU 恢复之前保存的寄存器和程序状态寄存器(SPSR 恢复到 CPSR)。
- 返回中断前的代码:CPU 跳回到被中断的代码继续执行。这是通过将程序计数器(PC)恢复到中断前的地址来实现的。
- 中断控制器(GIC)
- 功能:ARM 系统中通常包含一个通用中断控制器(GIC,Generic Interrupt Controller),负责管理所有中断请求。它不仅扩展了中断源,还负责:
- 中断优先级的管理:根据中断的优先级来决定哪个中断优先响应。
- 中断屏蔽:在处理较高优先级的中断时,较低优先级的中断可能会被屏蔽。
- 中断分发:在多核系统中,GIC 可以将中断请求分发给不同的 CPU 核。
- 中断的上下文切换
- 中断处理期间,CPU 需要对上下文进行切换,这包括:
- 保存当前的寄存器内容(R0-R12、PC、CPSR)。
- 切换到相应的中断模式,执行中断服务程序。
- 处理完毕后,恢复之前保存的寄存器值,继续执行被中断的任务。
- ARM 中断向量表
ARM 处理器的中断向量表是一个固定地址表,通常存储在内存的开始部分。该表包含不同类型中断的入口地址
中断类型 |
描述 |
触发条件 |
Reset(复位) |
处理器启动后的第一个地址 |
处理器上电或复位后触发 |
Undefined(未定义指令) |
执行未定义指令时触发 |
当执行未定义的指令时 |
Software Interrupt(软件中断) |
通过 SWI 指令触发 |
执行 SWI 指令时 |
Prefetch Abort(预取异常) |
指令预取阶段发生的异常 |
处理器在指令预取阶段遇到异常时 |
Data Abort(数据异常) |
数据访问阶段发生的异常 |
处理器在数据访问阶段遇到异常时 |
IRQ(普通中断) |
外设或其他设备触发的普通中断 |
处理器的中断请求线触发 |
FIQ(快速中断) |
优先级更高的快速中断 |
处理器的快速中断请求线触发 |
按键中断ARM编程流程
1.编写main.c
- 看电路图找到CPU对应的控制管脚 GPX1_1
- 看芯片手册,找到对应寄存器
a. 配置管脚为interrupt模式
b. 功能块设置
- 编程
代码如下
#define GPX1CON (*(volatile unsigned int *)0x11000C20)
#define EXT_INT41CON (*(volatile unsigned int *)0x11000E04)
#define EXT_INT41_MASK (*(volatile unsigned int *)0x11000F04)
#define ICDISER1_CPU0 (*(volatile unsigned int *)0x10490104)
#define ICDDCR (*(volatile int *)0x10490000)
#define ICCICR_CPU0 (*(volatile int *)0x10480000)
#define ICCPMR_CPU0 (*(volatile int *)0x10480004)
#define