中断

1:中断和中断使用方式

中断和中断源:中断时使CPU挂起正在执行的程序而转去执行特殊事件的操作,这些引起中断的事件成为中断源

2:中断传送方式:

中断传送方式的具体过程是:当CPU需要输入或者输出数据时,先做一些必要的准备工作(有时包括启动外部设备),然后继续执行程序,当外设完成一个数据的输入或输出时,则向CPU发出中断请求,CPU就挂起当前执行的程序,转去执行输入或输出操作,在完成输入或输出操作后,返回源程序继续执行

3:中断传送方式是CPU与外部设备进行输入输出的有效方式,一直被大多数的计算机采用,他可以避免因为反复查询外部设备的状态而浪费时间,从而提高CPU的效率,不过,每中断一次,只传送一次数据,因此,传送数据的效率不是很高,所以中断一般用于低速外设

4:中断向量表

IBM PC 系列和他的兼容机能够提供256种类型的中断,系统给每种中断都安排一个中断类型,简称为中断类型号,中断类型依次是0~0FFH

每种类型的中断都是由相应的中断处理程序来处理,为了使cpu响应中断后,CPU能快速转入对应中断处理程序,系统用一张表来保存这些中断处理程序的入口地址,这张表就成为中断向量表,中断向量表的每一项保存一个中断处理程序的入口地址,它相当于一个指向中断处理函数的指针,因此,就称他为中断向量

5设置和获取中断向量表

在系统程序或者引用程序由于某些需要而提供新的中断处理程序时,就需要设置对应的中断向量,使其指向新的中断处理程序

下面举出可以直接设置中断控制向量的方法


………………
MOV AX,0
MOV DS,AX
MOV BX,N*4;准备设置n号中断向量
CLI ;关闭中断
MOV WORD PTR[]BX],OFFSET INTHAND ;置偏移量
MOV WORD PTR[BX+2],SEG INTHAND;置段值
STI
………………

PTR是属性操作符,格式是 :类型 PTR 地址表达式这里只是临时性强制指定变量和标号的类型

SEG能够返回变量所在的段值的时候,例如MOV AX ,SEG VARW,把VARW所在的段值传递给AX

有的时候总避免采用上述直接设置中断向量的方法,而是利用DOS提供的25H号系统调用来设置中断向量

参数如下:

AL = 中断向量(类型)号

DS = 中断处理程序入口地址的段值

DX = 中断处理程序入口地址的偏移

下面程序片段设置n号中断向量,假设对应中断处理程序入口标号是INTHAND:


……………………………………
MOV AX,SEG INTHAND
MOV DS,AX
MOV DX,OFFSET INTHAND
MOV AH,25H
MOV AL,n
INT 21H
……………………………………

有时候需要取得中断向量,一般都是利用DOS提供的35H系统功能来调用中断向量

入口参数:

  AL = 中断向量(类型)号

出口参数:

  ES = 中断处理程序入口地址的段值

  BX = 中断处理程序入口地址的偏移

下面程序片段式取得n号的中断向量,并将其保存在双字节变量OLDVECTOR中


………………………………
MOV AH,35H
MOV AL,N
INT 21H
MOV WORD PTR OLDVECTORS, ES
MOV WORD PTR OLDVECTORS, BX
……………………………………

中断响应的过程

(1)取得中断类型号

(2)把标志寄存器压入堆栈

(3)禁止外部中断和单步中断

(4)把下一条要执行的指令地址压入堆栈

(5)根据中断类型好从中断向量表中取出中断程序的入口地址

(6)转去处理中断函数

中断返回指令

中断处理程序利用中断返回指令从对战中弹出返回地址和原标志值,中断返回指令的格式如下

IRET

外部中断:

由发生在CPU外部的某个事件引起的中断称为外部中断,如输入与输出设备和协处理器等引起的中断,外部中断以完全随机的方式出现在现行程序中

8086、8088有两条外部中断请求线,INTR接受可屏幕中断请求,NMI接受非屏蔽中断请求

内部中断

由发生在cpu内部的某个事件引起的中断称为内部中断,由于内部中断时CPU在执行某些指令时产生的,所以也成为软件中断,其特点是:不需要外部硬件的支持,不收中断允许标志IF的控制

(1)中断指令INT引起的中断,例如dos调用中断指令

INT 21H

(2)cpu遇到特殊情况引起的中断:比如出发错中断,CPU发现出数为0 ,或者是商超出范围,中断类型为0

(3)溢出中断:8086提供一条专门用来检测运算溢出的指令,该指令的格式如下INT0

(4)用于程序调试的中断 比如单步中断,断点中断

中断处理程序的设计

A:外设中断处理程序

在开中断的情况下,外设中断的发生时随机的,在设计外设中断程序是必须注意到这一点,中断处理程序必须充分注意到这一点

步骤:

1必须保护现场,这里的现场可以理解为中断发生时CPU各内部寄存器的内容,cpu在响应中断的时候,已把各个标志位和返回地址
压入到堆栈,所以保护现场是指通用寄存器的内容和除代码段寄存器外的其他三个段寄存器的内容,因为中断的发生是随机的,所以凡是中断处理程序中
重新赋值的哥哥寄存器的原有内容必须预先保护,保护的一般方法就是把它压入堆栈

2:尽快完成中断处理。中断处理必须尽快完成,所以外设中断中必须追求速度上的高效率,因为在进行外设中断处理时,旺旺不在响应其他外设的中断请求,因此必须快,一面影响对其他外设的中断请求

3:恢复现场,在中断处理完成后,依次恢复被保护寄存器原有的内容

4:通知中断控制器中断已经结束,如果应用需要,也可以提前告知中断控制器中断结束,这样做必须考虑到外设中断的嵌套

5:利用IRET返回中断

B 软中断处理程序

由中断指令一起的软件中断尽管是不可屏蔽的,但他不会随机发生,因此软中断处理的主要步骤如下 :

(1)考虑切换堆栈

(2)及时开中断

(3)应该保护现场

(4)完成中断处理

(5)恢复现场

(6)堆栈切换

(7)一般利用IRET指令实现中断返回

版权所有,转载请注明链接地址:http://www.cnblogs.com/fengdashen/p/3715856.html

时间: 2024-10-30 23:11:00

中断的相关文章

LCD实验学习笔记(八):中断控制器

s3c2440有60个中断源(其中15个为子中断源). 程序状态寄存器(PSR)的F位设为1,禁用快速中断(FRQ). 程序状态寄存器(PSR)的I位设为1,禁用普通中断(IRQ). 相反,PSR寄存器F位为0开FRQ中断,I位为0开IRQ中断. s3c2440中断控制器中有五个控制寄存器:中断源等待寄存器(SRCPND),中断模式寄存器(INTMOD),屏蔽寄存器(INTMSK),优先级寄存器(PRIORITY),中断等待寄存器(INTPND). SRCPND寄存器各位对应不同的中断,其中外部

Java阻塞中断和LockSupport

在介绍之前,先抛几个问题. Thread.interrupt()方法和InterruptedException异常的关系?是由interrupt触发产生了InterruptedException异常? Thread.interrupt()会中断线程什么状态的工作? RUNNING or BLOCKING? 一般Thread编程需要关注interrupt中断不?一般怎么处理?可以用来做什么? LockSupport.park()和unpark(),与object.wait()和notify()的区

一种Linux下共享中断的处理方法

前段时间调试一款芯片的时候,碰到一个奇怪的问题:只要在板卡上插入一个PS2键盘,启动内核时系统就可能会进入串口中断函数去执行,过一会系统就panic不往下继续执行.后来经过分析出现问题时的panic的堆栈,借助EJTAG工具,读到这个时候的串口的中断状态位,竟然发现串口并没有真正产生中断.那么,串口本身没有中断,内核怎么又会跑到串口的中断服务函数去执行呢? 我们知道Linux的中断可以分为I/O 中断 .时钟中断和处理器核间中断.其中I/O中断是Linux 系统响应外部IO事件的重要方式.尽管不

线程的中断

如果一个Java程序有不止一个执行线程,当所有线程都运行结束的时候,这个Java程序才能运行结束:更确切地说应该是所有的非守护线程运行结束时,或者其中一个线程调用了System.exit()方法时,这个Java程序才运行结束. Java提供了中断机制,我们可以使用它来结束一个线程.这种机制要求线程检查它是否被中断了,然后决定是不是响应这个中断请求.线程允许忽略中断请求并且继续执行. package concurrency; public class Generator2 extends Thre

20150218【改进】IMX257实现GPIO-IRQ中断按键获取键值驱动程序

[改进]IMX257实现GPIO-IRQ中断按键获取键值驱动程序 2015-02-18 李海沿 一.使用struct pin_desc 管理按键的值 1.定义结构体 2.将前面我们申请中断时写的(void *)1修改为 &pins_desc[n] 在ioctl中,设置中断中修改 在key_release中释放中修改 3.在中断程序中利用我们定义的struc pins_desc判断并得到按键的值 4.得到按键键值后,唤醒程序,在read函数中返回键值 附上驱动源程序: 1 /***********

20150218【改进信号量】IMX257实现GPIO-IRQ中断按键获取键值驱动程序

[改进信号量]IMX257实现GPIO-IRQ中断按键获取键值驱动程序 2015-02-18 李海沿 前面我们使用POLL查询方式来实现GPIO-IRQ按键中断程序 这里我们来使用信号量,让我们的驱动同时只能有一个应用程序打开. 一.首先在前面代码的基础上来一个简单的信号 1.定义一个全局的整形变量 2.在打开函数中,每次进入打开函数canopen都自减1, 3.当我们不使用时,在realease 中canopen自加1 4.这样就实现了一个简单的信号量,我们编译,测试 当我们使用两个应用程序来

20150218【改进Poll定时查询】IMX257实现GPIO-IRQ中断按键获取键值驱动程序

[改进Poll定时查询]IMX257实现GPIO-IRQ中断按键获取键值驱动程序 2015-02-18 李海沿 按键驱动程序中,如果不使用read函数中使程序休眠的,而是还是使用查询方式的话,可以使用Poll函数,来控制一定时间内,如果有按键发生,则立即返回键值. 同时,poll也可以同时监控多个(比如说按键,鼠标,等)一旦发生事件则立即返回. 我们在linux查看帮助: 从帮助中的说明得知, poll, ppoll - wait for some event on a file descrip

开关中断与cpsid/cpsie指令

在汇编代码中,CPSID   CPSIE  用于快速的开关中断. CPSID I ;PRIMASK=1, ;关中断 CPSIE I ;PRIMASK=0, ;开中断 CPSID CPSIE F F ;FAULTMASK=1, ;FAULTMASK=0 ;关异常 ;开异常 I:IRQ中断;    F:FIQ中断 最常见的这两个命令的使用处是在关中断.开中断的实现中,我们经常用的local_irq_save和local_irq_restore最终都是调用了以下两个实现,即关/开中断只是操作了CP

mysql主从中断

Mysql主从复制中断一例 收到mysql主从中断报警,马上登上服务器查看,发现是中继日志损坏. Show slave status\G,提示中继日志损坏.  Relay log read failure: Could not parse relay log event entry. The possible reasons are: the master's binary log is corrupted (you can check this by running 'mysqlbinlog'

存储、中断、总线及输入输出系统

存储系统的基本要求: 大容量,高速度和低价格. 访问时间: 存储器从接到访存读申请,到信息被读到数据总线上所用的时间 存储周期: 连续启动一个存储体所需的时间间隔 频宽: 每秒传输的信息位数 并行主存系统: 能并行读取多个CPU字的单体多字.多体单字或多体多字的交出存储主存系统 并行主存频宽: 主存频宽与分体数m.转移概率λ的关系 中断分类: 机器校验中断 访管中断 程序性中断 外部中断 I/O中断 重新启动中断 总线: 总线是用于互连计算机.CPU.存储器.I/O端口及外部设备.远程通信设备间