上篇博文介绍了按键的轮询处理方式,本篇介绍按键的中断方式。
0.源码
GitHub:https://github.com/Kilento/4412NoOS
1.异常向量表
1.1 原理
ARM 的异常向量表是一个存储在特定内存地址的表格,用于存储不同类型异常的处理程序的入口地址。当ARM处理器遇到异常时,它会自动跳转到异常向量表中对应的入口地址,以执行相应的异常处理程序。
1.2 异常种类
ARM的异常向量表通常包含以下几种类型的异常:
- Reset : 当 ARM 处理器上电或复位时,会产生复位异常
- Undefined Instructions : 处理器无法识别指令的异常。处理器执行的指令是有规范的, 如果 尝试执行不符合要求的指令, 就会进入到该异常指令对应的地址中;
- Software Interrupt (SWI) : 软中断, 软件中需要去打断处理器工作, 可以使用软中断来执行 ;
- Prefetch Abort (Instruction Fetch Memory Abort) : 预取指令失败。ARM 在执行指令的过程中, 要先去预取指令准备执行, 如果预取指令失败, 就会产生该异常;
- Data Abort (Data Access Memory Abort) : 读取数据失败异常
- IRQ (Interrupt) : 当 ARM 处理器接收到外部中断信号时,会产生中断异常
- FIQ (Fast Interrupt) : 当 ARM 处理器执行特定的指令(如软件中断指令 SVC)时,会产生快速中断
1.3 ARMv7 规定的异常向量表
ARM 的异常向量表通常由硬件设计者在系统设计时预定义,一般无需使用者进行修改。但在一些特殊情况下,例如需要自定义异常处理程序时,可以通过修改异常向量表来实现。
Exynos4412 架构是基于 ARMv7 指令集架构的处理器,ARM 规定了 ARMv7 指令集架构的异常向量表如下所示(参考手册ARM Architecture Reference Manual ARMv7-A and ARMv7-R edition)
2. 中断
在嵌入式系统中,初始化中断通常包括以下几个步骤:
- 中断向量表的设置:在中断向量表中,每个中断都有一个对应的中断服务程序入口地址。在系统初始化阶段,需要将每个中断的处理函数地址填入中断向量表中。
- 中断控制器的配置:对于一些高级的嵌入式处理器,中断控制器通常负责中断的管理和分发。在初始化阶段,需要配置中断控制器的寄存器,以启用和配置各个中断源。
- 中断服务程序的编写:为每个可能发生的中断编写对应的中断服务程序。中断服务程序通常包括保存上下文、处理中断事件、清除中断标志等步骤。
- 全局中断使能:在初始化阶段,需要设置全局中断使能位,以允许处理器响应中断。
2.1 iTop-4412 中使用的中断相关寄存器
1. ICDDCR
2. ICDISER_CPU
3. ICCPMR_CPUn
4. ICCICR_CPUn
5. ICCIAR_CPUn
6. ICCEOIR_CPUn
2024年02月13日
Kilento