中断处理的基本过程

中断处理的基本过程包括中断请求、中断判优、中断响应、中断服务 和中断返回等五个阶段

1.中断请求阶段

1)发生在CPU内部的中断(内部中断),不需要中断请求,CPU内部的中断控制逻辑直接接收处理。
2)外部中断请求由中断源提出。外部中断源利用CPU的中断输入引脚 输入中断请求信号。一般CPU设有两个中断请求输入引脚:可屏蔽中断请求输入引脚和不可屏蔽中断请求输入引脚。

1.1中断请求触发器

每个中断源发中断请求信号的时间是不确定的,而CPU在何时响应中断也 是不确定的。所以,每个中断源都有一个中断请求触发器,锁存自己的中断请求信号,并保持到CPU响应这个中断请求之后才将其清除。

1.2中断允许触发器

在CPU内部有一个中断允许触发器,当其为“1”时,允许CPU响应中断, 称为开中断。若其为“0”,不允许CPU响应中断,中断被屏蔽,称为关中断

%%通常,当CPU复位时,中断允许触发器也复位为“0”,即关中断。当 CPU中断响应时,CPU自动关闭中断,禁止接受另一个新的中断。
%%中断允许触发器的状态可以用开中断或关中断指令来设置。

2.中断判优阶段

CPU一次只能接受一个中断源的请求,当多个中断源同时向CPU提出中断请求时,CPU必须找出中断优先级最高的中断源,这一过程称为中断判优。
中断判优可以采用硬件方法,也可采用软件方法。

2.1软件判优

CPU检测到中断请求后,首先读取中断请求寄存器的内容,逐位检测它们的状态,检测到某一位为1,就确定对应的中断源有中断请求,转去执行它的中断服务程序。
先检测哪一个,哪一个的优先级就高,后检测哪一个,哪一个优先级就低,检测的顺序就是各中断源的优先级顺序。
在这里插入图片描述
假设上图中输入端口地址为87FFH。有如下查询程序:
MOV DX, 87FFH
IN AL, DX ;读中断请求寄存器内容
SHR AL, 1
JC IR0 ;IRQ0有请求,转IR0
SHR AL,1
JC IR1 ;IRQ1有请求,转IR1
SHR AL,1
JC IR2 ;IRQ2有请求,转IR2
… …
软件判优耗时较长。如果中断源很多,中断的实时性就很差,但是软件判优优先权安排灵活。

2.2硬件判优

利用专门的硬件电路确定中断源的优先级,有两种常见的方式:菊花链判优电路和中断控制器判优

2.2.1菊花链判优电路

设计思想:每个中断源都有一个中断逻辑电路,所有的中断逻辑电路形成一个链,犹如菊花链。排在链前端的中断源优先级最高,越靠后的设备优先级越低。
在这里插入图片描述
实现过程: CPU收到中断请求,如果允许中断,CPU发出中断响应信号。中断响应信号首先到达菊花链的前端,如果中断源1提出了中断请求,它就会截获中断响应信号,封锁它,使它不能向下一个中断源传送。不论下面的中断源有没有提出中断请求,都不可能接收到中断响应信号,因此它们的中断请求也不能被响应。

2.2.2中断控制器判优

中断控制器,如Intel8259A,可以以多种方式设置中断源的中断优先级。 中断控制器中有一个中断优先级判别器,它自动判别出目前提出中断请求的优先级最高的中断源,并将它的中断向量码送到数据总线,CPU接收中断向量码并据此找到它的中断服务程序。

在这里插入图片描述

3.中断响应阶段

经过中断判优,中断处理就进入中断响应阶段。中断响应时,CPU向中断源发出中断响应信号,同时:
① 保护硬件现场;
② 关中断;
③ 保护断点;
④ 获得中断服务程序的入口地址。

4.中断服务阶段

中断服务程序的一般结构为:
1)保护现场。 在中断服务程序的起始部分安排若干条入栈指令,将各寄存器的内容压入堆栈保存。
2)开中断。 在中断服务程序执行期间允许级别更高的中断请求中断现 行的中断服务程序,实现中断嵌套。
3)中断服务。 完成中断源的具体要求。
4)恢复现场。 中断服务程序结束前,必须恢复主程序的中断现场。通常是将保存在堆栈中的现场信息弹出到原来的寄存器中。
5)中断返回。 返回到原程序的断点处,继续执行原程序。

5.中断返回阶段

返回到原程序的断点处,恢复硬件现场,继续执行原程序。
中断返回操作是中断响应操作的逆过程。

### 回答1: 在 XDMA 设备中,中断处理程序是用来处理 DMA 完成和错误事件的。中断处理程序的实现通常会包括以下步骤: 1. 确定中断源:读取 XDMA 的中断状态寄存器,以确定触发中断的源头。 2. 处理中断:根据中断源,执行相应的处理操作。例如,在 DMA 完成中断时,可以读取 DMA 完成寄存器来确定已经完成的传输数量。 3. 清除中断:在处理中断后,需要清除中断状态寄存器。这可以通过写入相应的位来完成。 以下是一个示例 XDMA 中断处理程序的代码: ```c void xdma_irq_handler(void *data) { struct xdma_dev *dev = data; u32 irq_status; irq_status = xdma_read(dev, XDMA_IRQ_STATUS_OFFSET); if (irq_status & XDMA_IRQ_COMPLETE_MASK) { u32 complete = xdma_read(dev, XDMA_DMA_COMPLETE_OFFSET); /* process DMA completion */ xdma_write(dev, XDMA_IRQ_STATUS_OFFSET, XDMA_IRQ_COMPLETE_MASK); } if (irq_status & XDMA_IRQ_ERROR_MASK) { u32 error = xdma_read(dev, XDMA_DMA_ERROR_OFFSET); /* process DMA error */ xdma_write(dev, XDMA_IRQ_STATUS_OFFSET, XDMA_IRQ_ERROR_MASK); } } ``` 在这个例子中,中断处理程序首先读取中断状态寄存器,然后根据中断源执行相应的操作。最后,它会清除中断状态寄存器,以便下一次中断可以正常触发。请注意,中断处理程序应该是尽可能快的,以免影响系统的性能。 ### 回答2: xdma的中断处理程序主要用于处理xdma设备发生中断时的相关操作。以下是xdma的中断处理程序的基本步骤: 1. 中断服务程序的入口:当xdma设备触发中断时,中央处理器(CPU)会跳转到中断服务程序的入口,即中断处理程序的起始地址。 2. 寄存器保存和恢复:在处理中断之前,中断处理程序需要保存当前的寄存器状态,以免发生寄存器数据丢失。保存的寄存器包括CPU寄存器、状态寄存器、栈指针等。当中断处理完成后,需要将之前保存的寄存器状态恢复。 3. 中断处理逻辑:中断处理程序根据中断类型和中断原因来执行相应的处理逻辑。对于xdma设备中断,可能的处理逻辑包括: - 确定中断源:中断处理程序需要确定是哪个xdma设备发生了中断,以便进行后续的处理。 - 中断状态处理:读取中断状态寄存器,判断中断原因,例如传输完成、传输错误等。 - 数据处理:根据中断原因,处理中断所涉及的数据。比如,如果是传输完成,可以触发相应的后续操作,如通知应用程序传输完成。 - 清除中断标志:处理中断后,需要清除相应的中断标志或寄存器状态,以准备下一次中断。 4. 中断结束:中断处理程序执行完成后,会跳转回中断服务程序的返回地址,中央处理器继续执行原有的程序流程。 总之,xdma的中断处理程序是用来处理xdma设备中断的,其主要包括保存和恢复寄存器状态、中断处理逻辑和中断结束等步骤。在中断处理过程中,通过读取中断状态寄存器来确定中断原因,并根据不同的中断原因执行相应的处理逻辑。处理完成后,需要清除中断标志以便下一次中断的准备。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值