文档库 最新最全的文档下载
当前位置:文档库 › 中断概述和中断处理过程

中断概述和中断处理过程

中断概述和中断处理过程
中断概述和中断处理过程

第23课中断概述可屏蔽中断处理过程

教学目的:了解中断的相关概念,掌握可屏蔽中断的处理过程。

教学重点:中断响应过程、中断向量和中断服务过程。

教学难点:中断向量。

授课内容:

一、中断概念

1.中断源

2.中断响应

3.中断向量表

4.中断优先级

5.中断屏蔽

二、中断分类

8086/8088有一个强有力的中断系统,可以处理256种不同的中断,256种中断可以分为两大类:外部中断和内部中断。

1.外部中断

也称为硬件中断,是由外部的硬件产生的。分成不可屏蔽中断请求和可屏蔽中断请求。

2.内部中断

又称为软件中断。通常有三种情况引起:由中断指令INT引起的中断;由CPU 的某些运算错误引起的中断;由调试程序debug设置的中断。

三、CPU响应中断过程

可屏蔽中断处理的过程一般分成几步:中断请求;中断响应;保护现场;转入执行中断服务子程序;恢复现场和中断返回。

CPU响应中断要有三个条件:

外设提出中断申请

本中断位未被屏蔽

中断允许

CPU在响应外部中断,并转入相应中断服务子程序的过程中,自动依次做以

下工作:

(1)从数据总线上读取中断类型号,将其存入内部暂存器。

(2)将标志寄存器PSW的值入栈。

(3)将PSW中的中断允许标志IF和单步标志TF清0,以屏蔽外部其它中断请求,及避免CPU以单步方式执行中断处理子程序。

(4)保护断点。

(5)根据中断类型号到中断向量表中找到中断向量,转入相应中断服务子程序。

(6)中断处理程序结束以后,从堆栈中依次弹出IP、CS和PSW,然后返回主程序断点处,继续执行原来的程序。

四、中断向量表

寻找中断源可以用查询中断及矢量中断两种方法。

1.中断向量表

又称中断服务程序入口地址表。8086允许处理256种类型中断,对应类型号为0~FFH。

2.中断向量的设置

供用户使用的中断类型号,它可由用户定义为软中断,由INT n指令引用;也可通过1NTR端直接接入,或通过中断控制器8259A引入可屏蔽硬件中断。有两种方法可将中断服务程序的入口地址置入中断类型号n所对应的中断向量表中。一种方法用指令来设置,另一种方法利用DOS功能调用来设置。

设置中断向量:预置AL=中断类型号

DS:DX=中断服务程序入口地址

AH=25H

执行: INT 21H

取中断向量:预置AL=中断类型号

AH=35H

执行: INT 21H

返回: ES:BX=中断服务程序人口地址

3.中断类型号的获取

(1)对于除法出错,单步中断,不可屏蔽中断NMI,断点中断和溢出中断,CPU 分别自动提供中断类型号0~4。

(2)对于用户自己确定的软件中断INT n,类型号由n决定。

(3)对外部可屏蔽中断INTR,可用硬件电路设计产生中断类型号。

(4)对外部可屏蔽中断INTR,可以用可编程中断控制器8259A获得中断类型号。

4.中断主程序的初始化

(1)设置中断向量。

(2)设置8259A的中断屏蔽寄存器的中断屏蔽位。

(3)设置CPU中断允许位标志IF(开中断STI)。

五、中断服务子程序

(1)程序开始必须保护中断现场,可通过一系列PUSH指令将CPU各寄存器的值入栈保护。

(2)若允许中断嵌套,则用STI指令来设置开中断,使中断允许标志IF=1。

(3)执行中断处理程序。

(4)用CLI指令来设置关中断,使中断允许标志IF=0,禁止其他中断请求进入。

(5)给中断命令寄存器送中断结束命令E0I,使当前正在处理的中断请求标志位被清除,否则同级中断或低级中断的请求仍会被屏蔽掉.

(6)恢复中断时的现场,通过一系列POP指令将CPU各寄存器的值恢复。

(7)用中断返回指令IRET返回主程序,此时堆栈中保存的断点值和标志值分别装入IP、CS和PSW。

六、中断响应时序

七、作业

7.1, 7.4, 7.9, 7.10

操作系统实验一中断处理

实习一中断处理 一、实习内容 模拟中断事件的处理。 二、实习目的 现代计算机系统的硬件部分都设有中断机构,它是实现多道程序设计的基础。中断机 构能发现中断事件,且当发现中断事件后迫使正在处理器上执行的进程暂时停止执行,而让操作系统的中断处理程序占有处理器去处理出现的中断事件。对不同的中断事件,由于它们的性质不同,所以操作系统应采用不同的处理。通过实习了解中断及中断处理程序的作用。本实习模拟“时钟中断事件”的处理,对其它中断事件的模拟处理,可根据各中断事件的性质确定处理原则,制定算法,然后依照本实习,自行设计。 三、实习题目 模拟时钟中断的产生及设计一个对时钟中断事件进行处理的模拟程序。 [提示]: (1) 计算机系统工作过程中,若出现中断事件,硬件就把它记录在中断寄存器中。中 断寄存器的每一位可与一个中断事件对应,当出现某中断事件后,对应的中断寄存器的某一位就被置成―1‖。 处理器每执行一条指令后,必须查中断寄存器,当中断寄存器内容不为―0‖时,说明有中断事件发生。硬件把中断寄存器内容以及现行程序的断点存在主存的固定单元,且让操作系统的中断处理程序占用处理器来处理出现的中断事件。操作系统分析保存在主存固定单元中的中断寄存器内容就可知道出现的中断事件的性质,从而作出相应的处理。 本实习中,用从键盘读入信息来模拟中断寄存器的作用,用计数器加1 来模拟处理器 执行了一条指令。每模拟一条指令执行后,从键盘读入信息且分析,当读入信息=0 时,表示无中断事件发生,继续执行指令;当读入信息=1 时,表示发生了时钟中断事件,转时钟中断处理程序。 (2)假定计算机系统有一时钟,它按电源频率(50Hz)产生中断请求信号,即每隔20 毫秒产生一次中断请求信号,称时钟中断信号,时钟中断的间隔时间(20 毫秒)称时钟单

uCOS中断处理过程详解

再看3处代码: 在uCOS_II.H中有如下定义: OS_EXT OS_TCB *OSTCBPrioTbl[OS_LOWEST_PRIO + 1];//定义指向任务控制块的指针数//组,且每个优先级在同一时刻只对应一个任务 OS_EXT INT8U OSPrioCur;//用于保存目前任务的优先级 OS_EXT INT32U OSCtxSwCtr;//32位无符号全局整型变量,作为任务切换计数器 OS_EXT OS_TCB *OSTCBHighRdy;//指向最高优先级任务任务控制块的指 针 if (OSPrioHighRdy != OSPrioCur) //就绪态任务中的最高优先级已不是目前任务的优先级,则进行中断级的任务//切换 { OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy]; //将最高优先级任务控制块指针指向当前优先级最高的任务的任务控制块 OSCtxSwCtr++;//任务切换计数器加1 OSIntCtxSw();//调用中断级任务切换函数 } 此段代码体现出了可剥夺型实时操作系统内核的特点.

OSIntCtxSw()在80x86上的移植代码,此代码在OS_CPU_A.ASM中,代码如下: _OSIntCtxSw PROC FAR ; CALL FAR PTR _OSTaskSwHook ; 调用OSTaskSwHook()函数,此函数在 ;OS_CPU_C.C中只是个空函数,留给用户 ;在代码移植时自定义 ; MOV AX, SEG _OSTCBCur ;由于发生了段转移,恢复刚才(当前任务)数 MOV DS, AX;据段 ; MOV AX, WORD PTR DS:_OSTCBHighRdy+2 ;AH=_OSTCBHighRdy+3 ;AL=_OSTCBHighRdy+2 MOV DX, WORD PTR DS:_OSTCBHighRdy ;DH=_OSTCBHighRdy+1 ;DL=_OSTCBHighRdy MOV WORD PTR DS:_OSTCBCur+2, AX ;_OSTCBCur+3=AH ;_OSTCBCur+2=AL MOV WORD PTR DS:_OSTCBCur, DX ;_OSTCBCur+1=DH ;_OSTCBCur=DL

ARM中异常中断处理概述

异常中断处理概述 1.ARM中异常中断处理概述 1)在正常程序执行过程中,每执行一条ARM指令,程序计数器寄存器PC的值加4个字 节;每执行一条Thumb指令,程序计数器寄存器PC的值加两个字节.整个过程是顺序执行. 2)通过跳转指令,程序可以跳转到特定的地址标号处执行,或者跳转到特定的子程序处 执行; B指令用于执行跳转操作; BL指令在执行跳转操作的同时,保存子程序的返回地址; BX指令在执行跳转操作的同时,根据目标地址的最低位可以将程序状态切换到Thumb状态; BLX指令执行3个操作:跳转到目标地址处执行,保存子程序的返回地址(R15保存在R14中),根据目标地址的最低位可以将程序状态切换到Thumb状态. 3)当异常中断发生时,系统执行完当前指令后,将跳转到相应的异常中断处理程序处执 行.在当异常中断处理程序执行完成后,程序返回到发生中断的指令的下一条指令处执行. 4)在进入异常中断处理程序时,要保存被中断的程序的执行现场,在从异常中断处理程 序退出时,要恢复被中断的程序的执行现场.本章讨论ARM体系中的异常中断机制. 2.ARM体系中异常中断种类. ARM体系中的异常中断如下表所示:

3. 中断向量表中指定了各异常中断及其处理程序的对应关系.它通常存放在存储地址的低端.在ARM体系中,异常中断向量表的大小为32字节.其中,每个异常中断占据4个字节大小,保留了4个字节空间. 每个异常中断对应的中断向量表的4 .通过这两种指令,程序将跳转到相应的异常中断处理程序处执行. 当几个异常中断同时发生时,就必须按照一定的次序来处理这些异常中断.在ARM 中通过给各异常中断富裕一定的优先级来实现这种处理次序.当然有些异常中断是不坑能同时发生的,如指令预取中止异常中断和软件中断(SWI)异常中断是有同一条指令的执行触发的,他们是不可能同时发生的.处理器执行某个特定的异常中断的过程中,称为处理器处于特定的中断模式.各异常中断的中断向量地址以及中断的处理优先级如表2所示. 4.异常中断使用的寄存器 各异常中断对应着一定的处理器模式.应用程序通常运行在用户模式下.ARM中的处理器模式如表3所示. 各种不同的处理器模式可能有对应于该处理器模式的物理寄存器组,如表4所示,其中,R13_svc表示特权模式下的R13寄存器,R13_abt表示中止模式下的R13寄存器,其余的各寄存器名称含义类推. 表4 各处理器模式的物理寄存器组

uCOSii中断处理过程详解(一)

一. UCOSII的中断过程简介 系统接收到中断请求后,如果CPU处于开中断状态,系统就会中止正在运行的当前任务,而按中断向量的指向去运行中断服务子程序,当中断服务子程序运行完成后,系统会根据具体情况返回到被中止的任务继续运行,或转向另一个中断优先级别更高的就绪任务。 由于UCOS II是可剥夺型的内核,所以中断服务程序结束后,系统会根据实际情况进行一次任务调度,如果有优先级更高的任务,就去执行优先级更高的任务,而不一定要返回被中断了的任务。 二.UCOSII的中断过程的示意图 三.具体中断过程 1.中断到来,如果被CPU识别,CPU将查中断向量表,根据中断向量表,获得中断服务子程序的入口地址。 2.将CPU寄存器的内容压入当前任务的任务堆栈中(依处理器的而定,也可能压入被压入被中断了的任务堆栈中。

3.通知操作系统将进入中断服务子程序。即:调用OSIntEnter()或OSIntNesting直接 加1。 4.If(OSIntNesting==1){OSTCBCur->OSTCBStrPtr=SP;} //如果是第一层中断,则将堆栈指针保存到被中断任务的任务控制块中 5.清中断源,否则在开中断后,这类中断将反复的打入,导致系统崩贵 6.执行用户ISR 7.中断服务完成后,调用OSIntExit().如果没有高优先级的任务被中断服务子程序激活而进入就绪态,那么就执行被中断了的任务,且只占用很短的时间. 8.恢复所有CPU寄存器的值. 9.执行中断返回指令.

四.相关代码 与编译器相关的数据类型: typedef unsigned char BOOLEAN; typedef unsigned char INT8U; typedef unsigned int OS_STK; //堆栈入口宽度为16 位(一) void OSIntEnter (void)的理解 uCOS_II.H中定义:

中断处理程序设计

课程实验报告 课程名称:汇编语言程序设计 实验名称:实验四 实验时间: 2015-6-16,14:30-17:30 实验地点:南一楼804室 指导教师:李专 专业班级:学号: 姓名: 同组学生: 报告日期: 成绩: 计算机科学与技术学院

一、原创性声明 本人郑重声明:本报告的内容由本人独立完成,有关观点、方法、数据和文献等的引用已经在文中指出。除文中已经注明引用的内容外,本报告不包含任何其他个人或集体已经公开发表的作品或成果,不存在剽窃、抄袭行为。 特此声明! 学生签字: 日期: 二、评语与成绩评定 1.指导老师评语 2.实验成绩评定 实验完成质量得分(70分)(实验步骤清晰详细深入,实验记录真实完整等)报告撰写质量得分(30分) (报告规范、完整、通顺、 详实等) 总成绩(100分) 指导教师签字: 日期:

目录 1.实验目的 (1) 2.实验内容 (1) 2.1任务一 (1) 2.2任务二 (1) 2.3任务三 (2) 2.4任务四 (2) 3实验过程 (2) 3.1任务一 (2) 3.1.1实验要求 (2) 3.1.2实验结果 (2) 3.2任务二 (4) 3.2.1设计思想及存储分配 (4) 3.2.2程序框图 (5) 3.2.3源程序代码 (6) 3.2.4实验结果 (7) 3.3任务三 (7) 3.3.1源程序代码 (7) 3.3.2实验结果 (11) 3.4任务四 (12) 3.4.1源程序代码 (12) 3.4.2实验结果 (16) 4.实验体会 (16)

1.实验目的 (1) 掌握中断矢量表的概念 (2)掌握中断处理程序设计的技巧 (3)掌握简化段定义、函数调用伪指令 (4)了解Win32程序的编程方法及编译、链接方法 2.实验内容 2.1任务一 用三种方式获取中断类型码10H对应的中断处理程序的入口地址。 要求:(1) 直接运行调试工具(TD.EXE),观察中断矢量表中的信息; (2) 编写程序,用 DOS功能调用方式获取,观察相应的出口参数与(1) 中看到的结果是否相同(使用TD观看即可) (3) 编写程序,直接读取相应内存单元,观察读到的数据与(1)看到的结 果是否相同(使用TD观看即可)。 2.2任务二 编写一个中断服务程序并驻留内存,要求在程序返回DOS操作系统后,键盘的按键A变成了按键B、按键B变成了按键A。 提示:(1) 对于任何DOS程序,不管其采用什么方法获取按键,最后都是通过执行16H号软中断的0号和10H号功能调用来实现的。所以,你只需接 管16H号软中断的0号和10号功能调用并进行相应的处理; (2) 获得一个按键扫描码的方法:在TD中执行16H中断的0号和10H号 功能调用,按相应的键,观察AH中的内容。 资料:16H中断的0号和10H号功能 功能描述:从键盘读入字符 入口参数:AH = 00H——读键盘 = 10H——读扩展键盘 出口参数:AH =键盘的扫描码 AL =字符的ASCII码

IRQ0中断处理全过程

IRQ0中断处理全过程 1:系统注册IRQ0(时钟中断)的下半部分的处理过程。 在\kernel\sched.c的sched_init函数中 init_bh(TIMER_BH, timer_bh);/*TIMER_BH==0*/ init_bh(TQUEUE_BH, tqueue_bh);/*TQUEUE_BH==2*/ init_bh(IMMEDIATE_BH, immediate_bh);/*IMMEDIATE_BH==11*/ init_bh(TIMER_BH, timer_bh)把timer_bh函数注册为定时器的下半部分。 来看看init_bh是怎么处理的。 去掉一些加琐解琐的东西,就变成以下了。 void init_bh(int nr, void (*routine)(void)) { bh_base[nr] = routine; atomic_set(&bh_mask_count[nr], 0); bh_mask |= 1 << nr; } 就是简单的设置bh_base和bh_mask. 看看这些的定义: atomic_t bh_mask_count[32]; unsigned long bh_active = 0; unsigned long bh_mask = 0; void (*bh_base[32])(void); bh_base[] 31 bh_active 0 Bottom half handler(timer_bh) 31 bh_mask 0 不好意思,画的这么难看:P 如果bh_mask的第N位被置为1,则表明bh_base[]中的第N个指针指向了一个Bottom half 例程。 如果bh_active的第N位被置为1,则表明一旦调度进程许可,立即调用第N个Bottom hal f 例程。 bh_mask_count[]跟踪为每个下半部分提出的enable/disable请求嵌套对的数组。2.系统初始化时钟中断(IRQ0) ①先看看start_kernel(\init\main.c)吧 有几个跟时钟中断(IRQ0)相关的函数。 init_IRQ(); sched_init(); time_init(); sched_init()就是注册时钟中断的下半部分,其实IRQ0两个下半部分,一个前面已经看 到,还有一个下半部分init_bh(TQUEUE_BH, tqueue_bh);下面会看到。 ②init_IRQ函数在\arch\i386\kernel\irq.c 比较重要的调用就是init_ISA_irqs();

Linux中断处理流程

Linux中断处理流程 先从函数注册引出问题吧。 一、中断注册方法 在linux内核中用于申请中断的函数是request_irq(),函数原型在Kernel/irq/manage.c中定义: int request_irq(unsigned int irq, irq_handler_t handler, unsigned long irqflags, const char *devname, void *dev_id) irq是要申请的硬件中断号。 handler是向系统注册的中断处理函数,是一个回调函数,中断发生时,系统调用这个函数,dev_id参数将被传递给它。 irqflags是中断处理的属性,若设置了IRQF_DISABLED (老版本中的SA_INTERRUPT,本版zhon已经不支持了),则表示中断处理程序是快速处理程序,快速处理程序被调用时屏蔽所有中断,慢速处理程 序不屏蔽;若设置了IRQF_SHARED (老版本中的SA_SHIRQ),则表示多个设备共享中断,若设置了IRQF_SAMPLE_RANDOM(老版本中的 SA_SAMPLE_RANDOM),表示对系统熵有贡献,对系统获取随机数有好处。(这几个flag是可以通过或的方式同时使用的) dev_id在中断共享时会用到,一般设置为这个设备的设备结构体或者NULL。devname设置中断名称,在cat /proc/interrupts中可以看到此名称。 request_irq()返回0表示成功,返回-INVAL表示中断号无效或处理函数指针为NULL,返回-EBUSY表示中断已经被占用且不能共享。 关于中断注册的例子,大家可在内核中搜索下request_irq。 在编写驱动的过程中,比较容易产生疑惑的地方是: 1、中断向量表在什么位置?是如何建立的? 2、从中断开始,系统是怎样执行到我自己注册的函数的? 3、中断号是如何确定的?对于硬件上有子中断的中断号如何确定? 4、中断共享是怎么回事,dev_id的作用是? 本文以2.6.26内核和S3C2410处理器为例,为大家讲解这几个问题。 二、异常向量表的建立 在ARM V4及V4T以后的大部分处理器中,中断向量表的位置可以有两个位置:一个是0,另一个是0xffff0000。可以通过CP15协处理器c1寄存器中V位(bit[13])控制。V和中断向量表的对应关系如下: V=0 ~ 0x00000000~0x0000001C V=1 ~ 0xffff0000~0xffff001C arch/arm/mm/proc-arm920.S中 .section ".text.init", #alloc, #execinstr __arm920_setup: ...... orr r0, r0, #0x2100 @ ..1. ...1 ..11 (1) //bit13=1 中断向量表基址为0xFFFF0000。R0的值将被付给CP15的C1.

C51中断处理过程

C51中断处理过程 3 C51中断处理过程 C51编译器支持在C源程序中直接开发中断过程,因此减轻了使用汇编语言的繁琐工作,提高了开发效率。中断服务函数的完整语法如下: void函数名(void)[模式] [再入]interrupt n [using r] 其中n(0~31)代表中断号。C51编译器允许32个中断,具体使用哪个中断由80C51系列的芯片决定。r(0~3)代表第r组寄存器。在调用中断函数时,要求中断过程调用的函数所使用的寄存器组必须与其相同。"再入"用于说明中断处理函数有无"再入"能力。C51编译器及其对C语言的扩充允许编程者对中断所有方面的控制和寄存器组的使用。这种支持能使编程者创建高效的中断服务程序,用户只须在C语言下关心中断和必要的寄存器组切换操作。例3 设单片机的fosc=12MHz,要求用T0的方式1编程,在P1.0脚输出周期为2ms的方波。例3 设单片机的fosc=12MHz,要求用T0的方式1编程,在P1.0脚输出周期为2ms的方波。用C语言编写的中断服务程序如下: #include sbit P1_0=P1^0; void timer0(void)interrupt 1 using 1 { /*T0中断服务程序入口*/ P1_0=!P1_0; TH0=-(1000/256); /*计数初值重装*/ TL0=-(1000%256); } void main(void) { TMOD=0x01; /*T0工作在定时器方式1*/ P1_0=0; TH0=-(1000/256); /*预置计数初值*/ TL0=-(1000%256); EA=1; /*CPU开中断*/ ET0=1; /*T0开中断*/ TR0=1; /*启动T0*/ do{}while(1); } 在编写中断服务程序时必须注意不能进行参数传递,不能有返回值。 8051 系列 MCU 的基本结构包括:32 个 I/O 口(4 组8 bit 端口);两个16 位定时计数器;全双工串行通信;6 个中断源(2 个外部中断、2 个定时/计数器中断、1 个串口输入/输出中断),两级中断优先级;128 字节内置RAM;独立的 64K 字节可寻址数据和代码区。中断发生后,MCU 转到 5 个中断入口处之一,然后执行相应的中断服务 处理程序。中断程序的入口地址被编译器放在中断向量中,中断向量位于程序代码段的最低地址处,注意这里的串口输入/输出中断共用一个中断向量。8051的中断向量表如下: 中断源中断向量 --------------------------- 上电复位 0000H 外部中断0 0003H 定时器0 溢出 000BH 外部中断1 0013H 定时器1 溢出 001BH

arm中断处理流程

ARM编程特别是系统初始化代码的编写中通常需要实现中断的响应、解析跳转和返回等操作,以便支持上层应用程序的开发,而这往往是困扰初学者的一个难题。中断处理的编程实现需要深入了解ARM内核和处理器本身的中断特征,从而设计一种快速简便的中断处理机制。需要说明的是,具体的上层高级语言编写的中断服务函数不在本文的讨论范围之内。 ARM处理器异常中断处理概述 当异常中断发生时,系统执行完当前指令后,将跳转到相应的异常中断处理程序处执行。当异常中断处理程序执行完成后,程序返回到发生中断的指令的下一条指令处执行。在进入异常中断处理程序时,要保存被中断的程序的执行现场。从异常中断处理程序退出时,要恢复被中断的程序的执行现场。ARM体系中通常在存储地址的低端固化了一个32字节的硬件中断向量表,用来指定各异常中断及其处理程序的对应关系。当一个异常出现以后,ARM微处理器会执行以下几步操作: 1)保存处理器当前状态、中断屏蔽位以及各条件标志位; 2)设置当前程序状态寄存器CPSR中相应的位; 3)将寄存器lr_mode设置成返回地址; 4)将程序计数器(PC)值设置成该异常中断的中断向量地址,从而跳转到相应的异常中断处理程序处执行。 在接收到中断请求以后, ARM处理器内核会自动执行以上四步,程序计数器PC总是跳转到相应的固定地址。从异常中断处理程序中返回包括下面两个基本操作: 1)恢复被屏蔽的程序的处理器状态; 2)返回到发生异常中断的指令的下一条指令处继续执行。 当异常中断发生时,程序计数器PC所指的位置对于各种不同的异常中断是不同的,同样,返回地址对于各种不同的异常中断也是不同的。例外的是,复位异常中断处理程序不需要返回,因为整个应用系统是从复位异常中断处理程序开始执行的。 支持中断跳转的解析程序 解析程序的概念和作用 如前所述,ARM处理器响应中断的时候,总是从固定的地址开始的,而在高级语言环境下开发中断服务程序时,无法控制固定地址开始的跳转流程。为了使得上层应用程序与硬件中断跳转联系起来,需要编写一段中间的服务程序来进行连接。这样的服务程序常被称作中断解析程序。 每个异常中断对应一个4字节的空间,正好放置一条跳转指令或者向PC寄存器赋值的数据访问指令。理论上可以通过这两种指令直接使得程序跳转到对应的中断处理程序中去。但实际上由于函数地址值为未知和其它一些问题,并不这么做。这里给出一种常用的中断跳转流程:

Linux中断处理过程浅析

linux中断响应和处理过程: 首先中断属于异常的一种。异常,就是可以打断CPU正常运行流程的一些事情,比如说外部中断,未定义的指定,试图修改只读数据,执行SWI指定(software interrupt instructin,软件中断指令,比如说上层调用sys_read,sys_write就会产生swi)等。 内核启动时在start_kernel函数(init/main.c)中调用trap_init , init_IRQ两个函数来设置异常的处理函数。 trap_init函数(arch/arm/kernel/traps.c) void_init trap_init(void) { ...... memcpy((void *)vectors, __vectors_start, __vectors_end - __vectors_start); memcpy((void *)vectors + 0x200, __stubs_start, __stubs_end - __stubs_start); ....... } 上面两条定义的是异常向量的存放地方,即:__stubs_start~~~~~ __stubs_end之间就是异常向量. 接下来我们看异常向量之间的定义:(arch/arm/kernel/entry-armv.s) .equ stubs_offset, __vectors_start + 0x200 - __stubs_start .globl __vectors_start __vectors_start: ARM( swi SYS_ERROR0 ) //复位时.CPU交执行这条指令 THUMB( svc #0 ) THUMB( nop ) W(b) vector_und + stubs_offset //未定义异常时,CPU将执行这条跳转指令 W(ldr) pc, .LCvswi + stubs_offset //swi异常 W(b) vector_pabt + stubs_offset //指令预取止 W(b) vector_dabt + stubs_offset //数据访问中止 W(b) vector_addrexcptn + stubs_offset //没有用到 W(b) vector_irq + stubs_offset //irq中断 W(b) vector_fiq + stubs_offset //fig中断(快速中断) .globl __vectors_end __vectors_end: 各种异常的处理函数可以分为五类,分别分布在下面不同的文件中: 1、arch/arm/kernel/traps.c中 处理未定义指令异常,总入口函数为do_undefinstr

异常及中断处理

一.ARM异常中断处理概述 1、中断的概念 中断是一个过程,是CPU在执行当前程序的过程中因硬件或软件的原因插入了另一段程序运行的过程。因硬件原因引起的中断过程的出现是不可预测的,即随机的,而软中断是事先安排的。 2、中断源的概念 我们把可以引起中断的信号源称之为中断源。 3、中断优先级的概念 ARM处理器中有7种类型的异常,按优先级从高到低的排列如下:复位异常(Reset)、数据异常(Data Abort)、快速中断异常(FIQ)、外部中断异常(IRQ)、预取异常(Prefetch Abort)、软件中断(SWI)和未定义指令异常(Undefined instruction) 二.ARM体系异常种类 下面是ARM的7种异常 当异常发生时,处理器会把PC设置为一个特定的存储器地址。这一地址放在被称为向量表(vector table)的特定地址范围内。向量表的入口是一些跳转指令,跳转到专门处理某个异常或中断的子程序。 当异常产生时, ARM core: 拷贝CPSR 到SPSR_ 设置适当的CPSR 位: 改变处理器状态进入ARM 状态 改变处理器模式进入相应的异常模式 设置中断禁止位禁止相应中断(如果需要) 保存返回地址到LR_ 设置PC 为相应的异常向量 返回时, 异常处理需要: 从SPSR_恢复CPSR 从LR_恢复PC Note:这些操作只能在ARM 态执行. 当异常发生时,分组寄存器r14和SPSR用于保存处理器状态,操作伪指令如下。 R14_ = return link SPSR_ = CPSR

中断概述和中断处理过程

第23课中断概述可屏蔽中断处理过程 教学目的:了解中断的相关概念,掌握可屏蔽中断的处理过程。 教学重点:中断响应过程、中断向量和中断服务过程。 教学难点:中断向量。 授课内容: 一、中断概念 1.中断源 2.中断响应 3.中断向量表 4.中断优先级 5.中断屏蔽 二、中断分类 8086/8088有一个强有力的中断系统,可以处理256种不同的中断,256种中断可以分为两大类:外部中断和内部中断。 1.外部中断 也称为硬件中断,是由外部的硬件产生的。分成不可屏蔽中断请求和可屏蔽中断请求。 2.内部中断 又称为软件中断。通常有三种情况引起:由中断指令INT引起的中断;由CPU 的某些运算错误引起的中断;由调试程序debug设置的中断。 三、CPU响应中断过程 可屏蔽中断处理的过程一般分成几步:中断请求;中断响应;保护现场;转入执行中断服务子程序;恢复现场和中断返回。 CPU响应中断要有三个条件: 外设提出中断申请 本中断位未被屏蔽 中断允许 CPU在响应外部中断,并转入相应中断服务子程序的过程中,自动依次做以

下工作: (1)从数据总线上读取中断类型号,将其存入内部暂存器。 (2)将标志寄存器PSW的值入栈。 (3)将PSW中的中断允许标志IF和单步标志TF清0,以屏蔽外部其它中断请求,及避免CPU以单步方式执行中断处理子程序。 (4)保护断点。 (5)根据中断类型号到中断向量表中找到中断向量,转入相应中断服务子程序。 (6)中断处理程序结束以后,从堆栈中依次弹出IP、CS和PSW,然后返回主程序断点处,继续执行原来的程序。 四、中断向量表 寻找中断源可以用查询中断及矢量中断两种方法。 1.中断向量表 又称中断服务程序入口地址表。8086允许处理256种类型中断,对应类型号为0~FFH。 2.中断向量的设置 供用户使用的中断类型号,它可由用户定义为软中断,由INT n指令引用;也可通过1NTR端直接接入,或通过中断控制器8259A引入可屏蔽硬件中断。有两种方法可将中断服务程序的入口地址置入中断类型号n所对应的中断向量表中。一种方法用指令来设置,另一种方法利用DOS功能调用来设置。 设置中断向量:预置AL=中断类型号 DS:DX=中断服务程序入口地址 AH=25H 执行: INT 21H 取中断向量:预置AL=中断类型号 AH=35H 执行: INT 21H 返回: ES:BX=中断服务程序人口地址 3.中断类型号的获取

linux内核--中断处理程序

linux内核--中断处理程序 https://www.wendangku.net/doc/9b235598.html,/linux-unix/1440113.html一个设备的中断处理程序是它设备驱动程序的一部分--设备驱动程序是用于对设备进行管理的内核代码。中断处理程序与其他内核函数的真正区别在于,中断处理程序是被内核调用来响应中断的,而它们运行于我们称之为中断上下文的特殊上下文中。中断与定时器:中断的概念:指CPU在执行过程中,出现某些突发事件急待处理,CPU暂停执行当前程序,转去处理突发事件,处理完后CPU又返回原程序被中断的位置继续执行中断的分类:内部中断和外部中断内部中断:中断源来自CPU内部(软件中断指令、溢出、触发错误等)外部中断:中断源来自CPU外部,由外设提出请求屏蔽中断和不可屏蔽中断:可屏蔽中断:可以通过屏蔽字被屏蔽,屏蔽后,该中断不再得到响应不可屏蔽中断:不能被屏蔽向量中断和非向量中断:向量中断: CPU通常为不同的中断分配不同的中断号,当检测到某中断号的中断到来后,就自动跳转到与该中断号对应的地址执行非向量中断:多个中断共享一个入口地址。进入该入口地址后再通过软件判断中断标志来识别具体哪个是中断也就是说向量中断由软件提供中断服务程序入口地址,非向量中断由软件提供中断入口地址/*典型的非向量中断首先会判断中断源,然后调用不同中断源的中断处理

程序*/irq_handler(){...int int_src = read_int_status();/*读硬件 的中断相关寄存器*/switch(int_src){//判断中断标志case DEV_A:dev_a_handler();break;case DEV_B:dev_b_handler();break;...default:break;}...}定时器中断原理:定时器在硬件上也以来中断,PIT(可编程间隔定时器)接收一个时钟输入,当时钟脉冲到来时,将目前计数值增1并与已经设置的计数值比较,若相等,证明计数周期满,产生定时器中断,并复位计数值。如下图所示:Linux中断处理程序架构:Linux将中断分为:顶半部(top half)和底半部(bottom half)顶半部: 完成尽可能少的比较紧急的功能,它往往只是简单的读取寄存器中的中断状态并清除中断标志后就进行“登记中断”(也就是将底半部处理程序挂在到设备的底半部执行队列中)的工作特点:响应速度快底半部: 中断处理的大部分工作都在底半部,它几乎做了中断处理程序的所有事情。特点:处理相对来说不是非常紧急的事件小知识:Linux中查看/proc/interrupts文件可以获得系统中断的 统计信息。如下图所示:第一列是中断号第二列是向CPU产生该中断的次数介绍完相关基础概念后,让我们一起来探讨一下Linux中断编程Linux中断编程:内核维护了一个中断信号线的注册表,该注册表类似于I/O端口的注册表。驱动模块在使用中断前要先请求一个中断通道(或者中断请求IRQ),然后在使用后释放该通道。在头文件

中断处理过程

系统启动:ARMInit->OEMInit->OALIntrInit->OALIntrMapInit->(#ifdef OAL_BSP_CALLBACKS--BSPIntrInit->OALIntrStaticTranslate) ; 中断初始化:InterruptInitialize(驱动程序)->OEMInterruptEnable(微软实现)->OALIntrTranslateSysIntr(数据校验,把逻辑中断号变成IRQ号)->OALIntrEnableIrqs(OEM 实现,通过IRQ号使能自定义的中断)->BSPIntrRequestIrqs->BSPIntrEnableIrq; ISR实现:OEMInterruptHandler->(NKCallIntrChain)/OALIntrTranslateIrq 返回发生中断的IRQ对应的逻辑中断; 中断结束:InterruptDone->OEMInterruptDone->OALIntrDoneIrqs(BSPIntrDoneIrq); 1.在具体中断初始化过程中,IST线程中调用InterruptInitialize(DWORD idInt,,,),进而调用OEMInterruptEnable(DWORD idInt,,): C/C++ code BOOL OEMInterruptEnable(DWORD sysIntr, LPVOID pvData, DWORD cbData) { BOOL rc = FALSE; const UINT32 *pIrqs; UINT32 count; OALMSG(OAL_INTR&&OAL_VERBOSE, (L"+OEMInterruptEnable(%d, 0x%x, %d)\r\n", sysIntr, pvData, cbData )); // SYSINTR_VMINI & SYSINTR_TIMING are special cases if (sysIntr == SYSINTR_VMINI || sysIntr == SYSINTR_TIMING) { rc = TRUE; goto cleanUp; } // Obtain the SYSINTR's underlying IRQ number [color=#FF0000] if (!OALIntrTranslateSysIntr(sysIntr, &count, &pIrqs)) {[/color] // Indicate invalid SysIntr OALMSG(OAL_ERROR, ( L"ERROR: OEMInterruptEnable: IRQs are undefined for SysIntr %d\r\n", sysIntr )); goto cleanUp; } // Enable the interrupt

实验三中断处理

实习三中断处理 一、实习内容 模拟中断事件的处理。 二、实习目的 现代计算机系统的硬件部分都设有中断机构,它是实现多道程序设计的基础。中断机构能发现中断事件,且当发现中断事件后迫使正在处理器上执行的进程暂时停止执行,而让操作系统的中断处理程序占有处理器去处理出现的中断事件。对不同的中断事件,由于它们的性质不同,所以操作系统应采用不同的处理。通过实习了解中断及中断处理程序的作用。本实习模拟“时钟中断事件”的处理,对其它中断事件的模拟处理,可根据各中断事件的性质确定处理原则,制定算法,然后依照本实习,自行设计。 三、实习题目 模拟时钟中断的产生及设计一个对时钟中断事件进行处理的模拟程序。 [提示]: (1) 计算机系统工作过程中,若出现中断事件,硬件就把它记录在中断寄存器中。中断寄存器的每一位可与一个中断事件对应,当出现某中断事件后,对应的中断寄存器的某一位就被置成“1”。 处理器每执行一条指令后,必须查中断寄存器,当中断寄存器内容不为“0”时,说明有中断事件发生。硬件把中断寄存器内容以及现行程序的断点存在主存的固定单元,且让操作系统的中断处理程序占用处理器来处理出现的中断事件。操作系统分析保存在主存固定单元中的中断寄存器内容就可知道出现的中断事件的性质,从而作出相应的处理。 本实习中,用从键盘读入信息来模拟中断寄存器的作用,用计数器加1来模拟处理器执行了一条指令。每模拟一条指令执行后,从键盘读入信息且分析,当读入信息=0时,表示无中断事件发生,继续执行指令;当读入信息=1时,表示发生了时钟中断事件,转时钟中断处理程序。 (2) 假定计算机系统有一时钟,它按电源频率(50Hz)产生中断请求信号,即每隔20毫秒产生一次中断请求信号,称时钟中断信号,时钟中断的间隔时间(20毫秒)称时钟单位。 学生可按自己确定的频率在键盘上键入“0”或“1”来模拟按电源频率产生的时钟中断信号。 (3) 中断处理程序应首先保护被中断的现行进程的现场(通用寄存器内容、断点等),现场信息可保存在进程控制块中;然后处理出现的中断事件,根据处理结果修改被中断进程的状态;最后转向处理器调度,由处理器调度选择可运行的进程,恢复现场使其运行。 本实习主要模拟中断事件的处理,为简单起见可省去保护现场和处理器调度的工作。 (4) 为模拟时钟中断的处理,先分析一下时钟中断的作用。利用时钟中断可计算日历时钟,也可作定时闹钟等。 计算日历时钟——把开机时的时间(年、月、日、时、分、秒)存放在指定的称为“日历时钟”的工作单元中,用一计时器累计时钟中断次数。显然,根据时钟中断的次数和时钟单位(20毫秒)以及开机时的日历时钟可计算出当前的精确的日历时钟(年、月、日、时、分、秒)。因此,可按需要计算出一个作业装入时的时间,一个作业撤离时的时间,终端用户使用终端的时间,以及其它场合需要确定的时间。 定时闹钟——对需要定时的场合,例如,处理器调度采用“时间片轮转”策略调度时,可把轮到运行的进程的时间片值(以时钟单位计算)送到称为“定时闹钟”的工作单元中,

一个完整的中断处理过程应该包括

一个完整的中断处理过程应该包括:中断请求、中断排队或中断判优、中断响应、中断处理和中断返回等环节,下面分别进行讨论。 1.中断请求 中断请求是由中断源向CPU发出中断请求信号。外部设备发出中断请求信号要具备以下两个条件: (1)外部设备的工作已经告一段落。例如输入设备只有在启动后,将要输入的数据送到接口电路的数据寄存器(即准备好要输入的数据)之后,才可以向CPU发出中断请求。 (2)系统允许该外设发出中断请求。如果系统不允许该外设发出中断请求,可以将这个外设的请求屏蔽。当这个外设中断请求被屏蔽,虽然这个外设准备工作已经完成,也不能发出中断请求。 2.中断排队 中民申请是随机的,有时会出现多个中断源同时提出中断申请。但CPU每次只能响应一断源的请求,那么究竟先响应哪一个中断源的请求呢?这就必须根据各中断源工作性质的轻重缓急,预先安排一个优先级顺序,当多个中断源同时申请中断时,即按此优先级顺序进行排队,等候CPU处理。一般是把最紧迫和速度最高的设备排在最优先的位置上。CPU首先响应优先级别最高的中断源。当中断处理完毕,再响应级别低的中断申请。 中断排队可以采用硬件的方法,也可以采用软件的方法。前者速度快,但需要增加硬设备;后者无需增加硬设备,但速度慢,特别是中断源很多时尤为突出。 软件优用查询技术。当CPU响应中断后,就用软件查询以确定是哪些外设申请中断,并判断它们的优先权。一个典型的软件优先权排队接口电路如图6-10所示,图中把8个外设的中断请求触发器组合起来,作为一具端口,并赋以设备号。把各个外设的中断请求信号相“或”后,作为INTR信号,故其中任一外设有中断请求,都可向CPU送出INTR信号。当CPU响应中断后,把中断寄存器的状态作为一个外设读入CPU,逐位检测它们的状态,若哪一位为1,则该位对应的外设有中断请求,应转到相应的服务程序的入口。其流程如图6-11所示。

中断异常处理流程

计算机体系结构中,异常或者中断是处理系统中突发事件的一种机制,几乎所有的处理器都提供这种机制。异常主要是从处理器被动接受的角度出发的一种描述,指意外操作引起的异常。而中断则带有向处理器主动申请的意味。但这两种情况具有一定的共性,都是请求处理器打断正常的程序执行流程,进入特定程序的一种机制。若无特别说明,对“异常”和“中断”都不作严格的区分。本文结合经过实际验证的代码对ARM9中断处理流程进行分析,并设计出基于S3C2410芯片的外部中断处理程序。 微 于处于未知状态,在应用程序的设计中,首先要进行异常处理。采用的方式是在异常向量表中的特定位置放置一条跳转指令,跳转到异常处理程序。当ARM处理器发生异常时,程序计数器PC会被强制设置为对应的异常向量,从而跳转到异常处理程序。当异常处理完成以后,返回到主程序继续执行。可以认为应用程序总是从复位异常处理程序开始执行的,因此复位异常处理程序不需要返回。 2.异常处理程序设计 2.1 异常响应流程

由于向量表的限制,只能有一条指令B完成32MB范围内的跳转,并不能保证所有的异常处理函数都位于32MB范围内。为了扩展跳转范围,需要二次跳转才能把异常处理函数的地址传送给PC。异常处理调用关系如图1所示。 三星公司网站提供了test2410_r11软件包,其中2410init.s有如下代码: HandlerXXX sub sp,sp,#4 ;减少sp,保存跳转地址 stmfd sp!,{r0} ;将工作寄存器压入堆栈 通常HandlerXXX位于程序入口地址32MB范围内,HandleXXX是以_ISR_STARTADDRESS为基地址的RAM中地址。该代码主要实现跳转功能,把异常处理程序地址HandleXXX送到PC中。例如产生IRQ中断时,PC会被强制设置为0x18,执行指令:b HandlerIRQ 在HandlerIRQ程序段内,处理器做一些必要的处理,就会将_ISR_STARTADDRESS 表中存放的IRQ入口地址送入PC,然后开始执行相关中断程序。由于_ISR_STARTADDRESS 表存放在RAM中,后面的C语言程序可以方便地更改相关中断服务程序的内容。

ARM中断程序的原理和实现

摘要:本文首先简要概述了ARM处理器的异常中断种类、响应和返回过程;然后重点讨论了中断解析程序的原理和实现,并分别给出了普通中断和向量中断的处理示例流程图和详细的参考代码。 关键词:异常中断;中断解析程序;向量中断;ARM处理器 引言 ARM编程特别是系统初始化代码的编写中通常需要实现中断的响应、解析跳转和返回等操作,以便支持上层应用程序的开发,而这往往是困扰初学者的一个难题。中断处理的编程实现需要深入了解ARM内核和处理器本身的中断特征,从而设计一种快速简便的中断处理机制。需要说明的是,具体的上层高级语言编写的中断服务函数不在本文的讨论范围之内。 ARM处理器异常中断处理概述 当异常中断发生时,系统执行完当前指令后,将跳转到相应的异常中断处理程序处执行。当异常中断处理程序执行完成后,程序返回到发生中断的指令的下一条指令处执行。在进入异常中断处理程序时,要保存被中断的程序的执行现场。从异常中断处理程序退出时,要恢复被中断的程序的执行现场。 ARM体系中通常在存储地址的低端固化了一个32字节的硬件中断向量表,用来指定各异常中断及其处理程序的对应关系。当一个异常出现以后,ARM微处理器会执行以下几步操作: 1)保存处理器当前状态、中断屏蔽位以及各条件标志位; 2)设置当前程序状态寄存器CPSR中相应的位; 3)将寄存器lr_mode设置成返回地址; 4)将程序计数器(PC)值设置成该异常中断的中断向量地址,从而跳转到相应的异常中断处理程序处执行。 在接收到中断请求以后,ARM处理器内核会自动执行以上四步,程序计数器PC总是跳转到相应的固定地址。 从异常中断处理程序中返回包括下面两个基本操作: 1)恢复被屏蔽的程序的处理器状态; 2)返回到发生异常中断的指令的下一条指令处继续执行。 当异常中断发生时,程序计数器PC所指的位置对于各种不同的异常中断是不同的,同样,返回地址对于各种不同的异常中断也是不同的。例外的是,复位异常中断处理程序不需要返回,因为整个应用系统是从复位异常中断处理程序开始执行的。 支持中断跳转的解析程序 解析程序的概念和作用 如前所述,ARM处理器响应中断的时候,总是从固定的地址开始的,而在高级语言环境下开发中断服务程序时,无法控制固定地址开始的跳转流程。为了使得上层应用程序与硬件中断跳转联系起来,需要编写一段中间的服务程序来进行连接。这样的服务程序常被称作中断解析程序。 每个异常中断对应一个4字节的空间,正好放置一条跳转指令或者向PC寄存器赋值的数据访问指令。理论上可以通过这两种指令直接使得程序跳转到对应的中断处理程序中去。但实际上由于函数地址值为未知和其它一些问题,并不这么做。 这里给出一种常用的中断跳转流程:

相关文档
相关文档 最新文档