ARM系统中断产生流程

本文详细介绍了ARM系统中断的产生流程,包括子内部中断源、内部中断源和子外部中断源的处理过程。从中断源触发到中断处理,涉及中断暂存寄存器、中断屏蔽寄存器和中断模式寄存器等多个环节。并通过按键控制LED灯实验展示了中断在实际应用中的操作步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

++++++++++++++++++++++++++++++++++++++++++

本文系本站原创,欢迎转载! 转载请注明出处:

http://blog.csdn.net/mr_raptor/article/details/6556258

++++++++++++++++++++++++++++++++++++++++++

 

 

ARM920T系统中断产生流程总图

中断源按照硬件位置分为外部中断源和内部中断源,外部中断源和内部中断源又包含子外部中断源和子内部中断源,如上图所示(画了一整天)。

1. 子内部中断源的产生

以UART0接收数据产生INT_RXD0中断为例,INT_RXD0产生后进入SUBSRCPND子中断源暂存寄存器,设置INT_RXD0对应的中断位,中断信号经过INTSUBMSK子中断屏蔽寄存器,如果INT_RXD0信号对应位没有被置位(屏蔽掉),中断信号继续向前传递,经过子内部中断源聚合器,将INT_RXD0聚合成对应的中断源信号INT_UART0,设置SRCPND中断源暂存寄存器里INT_UART0位,经过INTMSK中断屏蔽寄存器,如果INT_UART0信号没有被屏蔽掉,中断信号进入INTMOD中断模式寄存器判断是否为快速中断,如果被编程为快速中断,直接打断ARM内核,进入中断处理,如果中断信号为一般中断,进入中断优先级仲裁器进入优先级仲裁,如果INT_UART0信号为最高优先级或只有INT_UART0中断信号产生,则该中断信号被记录到INTPND最高优先级中断暂存寄存器,同时设置INTOFFSET的值为中断号28,最终将中断信号打断ARM内核进行中断处理。如果同时产生多个中断且INT_UART0不是最高优先级,则该中断信号不会被处理,等最高优先级信号处理完后,再次进行优先级仲裁,也就是说中断信号不消失,一直保存在SRCPND里,只到被处理为止。

2. 内部中断源的产生

该过程在子内部中断处理过程中已经包含,中断信号产生后直接进入SRCPND里,然后经历上述子内部中断后期处理过程。

3. 子外部中断的产生

外部中断源共有24个,其中EINT0~EINT3为外部中断源,EINT4_7,EINT8_23为复合中断源,他们包含有子外部中断源。

由于外部硬件直接挂接到I/O Ports(详见S3C2440A硬件手册第9章)上的,我们要想让外设硬件中断得到处理,要先从EINT0~EINT23里选择中断信号,我们以EINT11为例,介绍子外部中断处理过程。

通常CPU内部引出引脚都是复用的,也就是说一根CPU引脚可以有多种功能,可以设置其为输入信号线,输出信号线或中断信号线,要想让硬件产生中断,首先要对可以产生中断的引脚进行编程,设置该引脚为中断信号线。EINT11中断信号对应CPU引脚为GPG3,通过设置GPGCON[7:6] = 0b10,可以设置该引脚为中断信号线。

表3-14 GPGCON寄存器

 

 

设置了CPU管脚为中断信号线之后,还要通过设置EXTINT0寄存器来指定中断信号的触发方式:高电平触发,低电平触发,电平上升沿,下除沿,双沿触发。

 

图3-9 电平信号触发示意图

由于按键按下时让它产生中断,也就是从高电平变为低电平时产生(上节按键中断原理),因此我们设置EINT11中断信号的触发方式为下降沿触发,EXTINT1[14:12] = 0b01x

表3-15 EXTINT1寄存器

 

 

设置完触发方式之后,当外设中断信号线上的电平达到触发条件时,通过外部中断产生器产生中断信号,然后将子外部中断暂存寄存器EINTPND中对应的EINT11位置1,中断信号再进入EINTMSK子外部中断屏蔽寄存器,如果EINT11中断源信号没有被屏蔽,则EINT11中断信号进入子外部中断聚合器,复合成EINT8_23中断信号,然后再经历与前面子内部中断信号一样的处理机制。

(1)EINTPEND外部中断暂存寄存器

表3-16外部中断暂存寄存器(EINTPEND)

寄存器名

地址

是否读写

描述

复位默认值

EINTPEND

0x560000A8

R/W

外部中断信号暂存寄存器

0:没有中断请求信号

1:中断请求信号产生

0x0000000

 

EINTPEND

描述

初始值

EINT23

[23]

0 = 未产生中断 1 = 产生中断

0

EINT4

[4]

0 = 未产生中断 1 = 产生中断

0

保留位

[3:0]

0000

 

(2)EINTMASK外部中断屏蔽寄存器

表3-17外部中断屏蔽寄存器(EINTMASK)

寄存器名

地址

是否读写

描述

复位默认值

### ARM64 架构下的中断执行流程ARM64 架构下,中断是一种异步事件,用于通知 CPU 发生了需要立即处理的情况。当中断发生时,CPU 将停止当前的任务并切换至中断上下文以执行相应的中断服务程序 (Interrupt Service Routine, ISR)[^2]。 #### 1. 中断的分类 ARM64 支持多种类型的异常和中断,主要包括以下几类: - **外部中断 (IRQ)**:由外设触发,例如定时器、网络接口等。 - **快速中断 (FIQ)**:一种高优先级的外部中断,通常用于实时性要求较高的场景。 - **软件中断 (SWI/SVC)**:通过 `svc` 指令显式调用,常用于系统调用。 - **中止 (Abort)**:包括数据访问中止 (Data Abort) 和预取中止 (Prefetch Abort),分别对应内存访问错误和指令获取错误[^3]。 #### 2. 中断状态转换 ARM64 的中断处理涉及三种主要状态: 1. **Inactive**:中断尚未被触发。 2. **Pending**:中断产生,但还未被 CPU 响应。 3. **Active**:对应的中断处理函数正在运行中[^1]。 #### 3. 中断处理的具体流程 以下是 ARM64 下中断处理的主要过程: ##### a. 进入异常模式 当硬件检测到中断请求时,ARM64 处理会自动保存当前寄存器的状态,并跳转到预先配置好的向量表地址。此时,处理器会进入特定的异常模式(如 IRQ mode 或 FIQ mode)。然而,在 Linux 内核环境中,大多数时间实际的工作是在 SVC mode 下完成的[^3]。 ##### b. 切换堆栈 为了防止覆盖原有任务的数据,ARM64 需要切换到专用的异常堆栈。对于 IRQ mode,其默认分配了一个较小的空间来存储关键寄存器的内容。随后,控制权会被转移到更高级别的 SVC mode 来继续后续操作[^3]。 ```c // 示例代码展示如何切换堆栈 void handle_irq(void) { asm volatile ( "msr spsr_el1, %0\n\t" // 设置新的 PSTATE 寄存器值 "mov sp, %1\n\t" // 更新 SP_EL1 至新堆栈指针 : : "r"(PSR_F_BIT | PSR_I_BIT), "r"(irq_stack_pointer) : "memory" ); } ``` ##### c. 调度中断服务程序 一旦进入 SVC mode 并完成了必要的初始化工作后,Linux 内核便会查找与该中断号关联的服务例程,并将其加入调度队列等待执行。这一步骤可能涉及到对设备驱动程序的回调函数调用[^2]。 ##### d. 返回正常执行路径 当中断处理完成后,恢复先前保存下来的环境变量以及标志位设置,最后返回原用户空间或者另一个更高优先级的任务流之中[^3]。 #### 4. 关键组件说明 - **GIC (Generic Interrupt Controller)**:通用中断控制器负责管理所有的中断源及其优先级排队逻辑。它能够区分不同级别的中断类型并将它们适当地路由给目标核心单元进行进一步处置[^2]。 - **EL Levels**: 在 AArch64 系统中有四个权限级别(Execution Level),分别为 EL0~EL3。操作系统一般运行于 EL1 层次之上;而 hypervisors 可能位于更高的 EL2 上面运作。 ---
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值