Swi软件中断理解

Swi软件中断理解
Swi软件中断理解

1系统调用

操作系统的主要功能是为应用程序的运行创建良好的环境,保障每个程序都可以最大化利用硬件资源,防止非法程序破坏其它应用程序执行环境,为了达到这个目的,操作系统会将硬件的操作权限交给内核来管理,用户程序不能随意使用硬件,使用硬件(对硬件寄存器进行读写)时要先向操作系统发出请求,操作系统内核帮助用户程序实现其操作,也就是说用户程序不会直接操作硬件,而是提供给用户程序一些具备预定功能的内核函数,通过一组称为系统调用的(system call)的接口呈现给用户,系统调用把应用程序的请求传给内核,调用相应的内核函数完成所需的处理,将处理结果返回给应用程序。这好比我们去银行取款,用户自己的银行帐户不可能随意操作,必须要有一个安全的操作流程和规范,银行里的布局通常被分成两部分,中间用透明玻璃分隔开,只留一个小窗口,面向用户的是用户服务区,工作人员所在区域为内部业务操作区,取款时,将银行卡或存折通过小窗口交给业务员,并且告诉他要取多少钱,具体取钱的操作你是不会直接接触的,业务员会将银行帐户里减掉取款金额,将现金给你。上述操作流程可以很好保护银行系统,银行系统的操作全部由业务员来实现,用户只能向业务员提出自己的服务请求。银行里的小窗口就类似与操作系统的系统调用接口,是将用户请求传递给内核的接口。

图3-16系统调用接口示意图

操作系统里将用户程序运行在用户模式下,并且为其分配可以使用内存空间,其它内存空间不能访问,内核态运行在特权模式下,对系统所有硬件进行统一管理和控制。从前面所学知识可以了解到,用户模式下没有权限进行模式切换,这也就意味着用户程序不可能直接通过切换模式去访问硬件寄存器,如果用户程序试图访问没有权限的硬件,会产生异常。这样用户程序被限制起来,如果用户程序想要使用硬件时怎么办呢?用户程序使用硬件时,必须调用操作系统提供的API接口才可以,而操作系统API

接口通过软件中断方式切换到管理模式下,实现从用户模式下进入特权模式。

2软件中断

软中断是利用硬件中断的概念,用软件方式进行模拟,实现从用户模式切换到特权模式并执行特权程序的机制。

硬件中断是由电平的物理特性决定,在电平变化时引发中断操作,而软中断是通过一条具体指令SWI,引发中断操作,也就是说用户程序里可以通过写入SWI指令来切换到特权模式,当CPU执行到SWI指令时会从用户模式切换到管理模式下,执行软件中断处理。由于SWI指令由操作系统提供的API封装起来,并且软件中断处理程序也是操作系统编写者提前写好的,因此用户程序调用API时就是将操作权限交给了操作系统,所以用户程序还是不能随意访问硬件。

先来了解下SWI指令。

SWI 软中断号immed_24

软中断指令相对比较简单,只有一个操作数:immed_24,SWI指令编码格式如图3-17所示。

图3-17 SWI指令编码格式

SWI指令编码中immed_24为24位任意有效立即数(范围0~2^24-1),当该指令被执行时系统产生软中断异常,切换到管理模式下。用户程序切换到管理模式下后,进入到软中断处理程序,通常软中断异常处理程序都是系统开发人员提前写好的,SWI切换到了特权模式,执行的是系统开发人员写好的异常处理程序,只要该处理程序没有问题,那么用户程序还是不能为所欲为的。

SWI指令后面的24立即数是干什么用的呢?用户程序通过SWI指令切换到特权模式,进入软中断处理程序,但是软中断处理程序不知道用户程序到底想要做什么?SWI指令后面的24位用来做用户程序和软中断处理程序之间的接头暗号。通过该软中断立即数来区分用户不同操作,执行不同内核函数。如果用户程序调用系统调用时传递参数,根据ATPCSC语言与汇编混合编程规则将参数放入R0~R4即可。下面的例子通过系统调用函数int led_on(int led_no)实现点亮第led_no 个LED灯,由于C语言里没有SWI 指令对应的语句,因此这儿要用到C语言与汇编混合编程,led_on函数里将参数led_no的值传递给R0,通过软中断SWI指令切换到软中断管理模式,同时R0 软中断方式点亮LED灯,用户通过SWI #1指令可以点灯,具体点亮哪个灯,通过R0保存参数传递,如果亮灯成功返回对应LED号。

系统调用接口函数led_on:

#define __led_on_swi_no 1 // 软中断号1,调用管理模式下的do_led_on函数

int led_on(int led_no){

int ret; // 返回值

__asm{ // 由于C程序中没有SWI对应表达式,所以使用混合编程

mov r0, led_no // 根据ATPCS规则,r0存放第一个参数

swi __led_on_swi_no // 产生SWI软中断,中断号为__led_on_swi_no

mov ret, r0 // 软中断处理结束,取得中断处理返回值,传递给ret变量

}

return ret; // 将ret返回给调用led_on的语句

}

3软中断处理

CPU执行到swi xxx执行后,产生软件中断,由异常处理部分知识可知,软中断产生后CPU将强制将PC的值置为异常向量表地址0x08,在异常向量表0x08处安放跳转指令b HandleSWI,这样CPU就跳往我们自己定义的HandleSWI处执行。

首先,软中断处理中通过STMFD SP!, {R0-R12, LR} 要保存程序执行现场,将R0~R12通用寄存器数据保存在管理模式下SP栈内,LR由硬件自动保存软中断指令下一条指令的地址(后面利用LR的地址取得SWI指令编码),该寄存器值也保存在SP栈内,将来处理完毕之后返回。由SWI指令编码知识可知, SWI指令低24位保存有软中断号,通过LDR R4, [LR, #-4]指令,取得SWI指令编码(LR为硬件自动保存SWI xxx指令的下一条指令地址,LR – 4就是SWI指令地址),将其保存在R4寄存器中。通过BIC R4, R4, #0xFF000000指令将SWI指令高8位清除掉,只保留低24位立即数,再根据24位立即数中的软中断号判断用户程序的请求操作。如果24位立即数为1,表示led_on系统调用产生的软中断,则在管理模式下调用对应的亮灯操作do_led_on。如果24位立即数为2,表示led_off系统调用产生的软中断,则调用灭灯操作do_led_on,根据ATPCS调用规则,R0~R3做为参数传递寄存器,在软中断处理中没有使用这4个寄存器,而是使用R4作为操作寄存器的。执行完系统调用操作之后,返回到swi_return (在调用对应系统操作时,通过LDREQ LR, =swi_return设置了返回地址),执行返回处理,通过LDMIA SP!, {R0-R12, PC}^ 指令将用户寄存器数据恢复到R0~R12,将进入软中断处理时保存的返回地址LR的值恢复给PC,实现程序返回,同时还恢复了状态寄存器。切换回用户模式下程序中继续执行。

; 异常向量表开始

; 0x00: 复位Reset异常

b Reset

; 0x04: 未定义异常(未处理)

HandleUndef

b HandleUndef

; 0x08: 软件中断异常,跳往软件中断处理函数HandleSWI

b HandleSWI

… …

; 省略其它异常向量和对应处理

… …

;***********************************************************************

; 软中断处理

;***********************************************************************

IMPORT do_led_on

IMPORT do_led_off

HandleSWI

STMFD SP!, {R0-R12, LR} ; 保存程序执行现场

LDR R4, [LR, #-4] ; LR - 4 为指令" swi xxx" 的地址,低24位是软件中断号

BIC R4, R4, #0xFF000000 ; 取得ARM指令24位立即数

CMP R4, #1 ; 判断24位立即数,如果为1,调用do_led_on系统调用

LDREQ LR, =swi_return ; 软中断处理返回地址

LDREQ PC, = do_led_on ; 软中断号1对应系统调用处理

CMP R4, #2 ; 判断24位立即数,如果为2,调用do_led_off系统调用

LDREQ LR, =swi_return ; 软中断处理返回地址

LDREQ PC, = do_led_off ; 软中断号2对应系统调用处理

MOVNE R0, #-1 ; 没有该软中断号对应函数,出错返回-1

swi_return

LDMIA SP!, {R0-R12, PC}^ ; 中断返回, ^表示将spsr的值复制到cpsr

1.1.4led系统调用实验

本实验通过Led跑马灯效果来模拟系统调用,本程序提供了两个系统调用接口led_on和led_off,用户程序main.c通过引入头文件led.h使用系统调用接口,用户调用led_on和led_off时通过软中断指令切换到管理模式,在管理模式下调用内核led操作系统do_led_on和do_led_off,实现Led的亮灭。实验源码适用于QQ2440,TQ2440,MINI2440开发板。

head.s:

本程序文件主要用于安装异常向量表,Reset异常处理,软中断处理和必要硬件初始化。

;**********************************************************************

; 系统调用实验(QQ2440, MINI2440,TQ2440)

;**********************************************************************

GPBCON EQU 0x56000010

GPBDAT EQU 0x56000014

SYS_STACK_BASE EQU 0x33000000

EXPORT SWI_LED

AREA SWI_LED ,CODE,READONLY

ENTRY

;**********************************************************************

; 设置中断向量,除Reset和HandleSWI外,其它异常都没有使用(如果不幸发生了,

; 将导致死机)

;**********************************************************************

; 0x00: 复位Reset异常

b Reset

; 0x04: 未定义异常(未处理)

HandleUndef

b HandleUndef

; 0x08: 软件中断异常,跳往软件中断处理函数HandleSWI

b HandleSWI

; 0x0c: 指令预取异常(未处理)

HandlePrefetchAbt

b HandlePrefetchAbt

; 0x10: 数据访问中止异常(未处理)

HandleDataAbt

b HandleDataAbt

; 0x14: 未使用异常(未处理)

HandleNotUsed

b HandleNotUsed

; 0x18: 一般中断异常(未处理)

HandleIRQ

b HandleIRQ

; 0x1c: 快速中断异常(未处理)

HandleFIQ

b HandleFIQ

Reset ; 复位异常处理入口

; 关闭看门狗

ldr r0, = 0x53000000

mov r1, #0

str r1, [r0]

bl initmem

ldr sp, =0x32000000 ; 设置管理模式栈指针

; LED灯初始化

ldr r0, =GPBCON ; LED的GPIO接口配置寄存器ldr r1, =0x00015400 ; GPIO配置数据

str r1, [r0] ; 设置GPIO

ldr r0, =GPBDAT ; Led数据寄存器

ldr r1, =0x1e0 ; 熄灭所有Led

str r1, [r0]

msr cpsr_c, #0xdf

ldr sp, =SYS_STACK_BASE

msr cpsr_c, #0x50 ; 开启系统中断,进入用户模式,该指令执行完

; 就进入用户空间,执行用户程序xmain

ldr lr, =halt_loop ; 设置管理模式下返回地址

IMPORT xmain

ldr pc, =xmain ; 跳入主函数main里执行

halt_loop

b halt_loop

;***********************************************************************

; 软中断处理

;***********************************************************************

IMPORT do_led_on

IMPORT do_led_off

HandleSWI

STMFD SP!, {R0-R12, LR} ; 保存程序执行现场

LDR R4, [LR, #-4] ; LR - 4 为指令" swi xxx" 的地址,指令低24位软件中断号

BIC R4, R4, #0xFF000000 ; 取得ARM指令24位立即数

CMP R4, #1 ; 判断24位立即数的值,如果为1,调用do_led_on系统调用LDREQ LR, =swi_return ; 软中断处理返回地址

LDREQ PC, = do_led_on ; 软中断号1对应系统调用处理

CMP R4, #2 ; 判断24位立即数的值,如果为2,调用do_led_off系统调用LDREQ LR, =swi_return ; 软中断处理返回地址

LDREQ PC, = do_led_off ; 软中断号2对应系统调用处理

MOVNE R0, #-1 ; 没有该软中断号对应函数,出错返回-1

swi_return

LDMIA SP!, {R0-R12, PC}^ ; 中断返回, ^表示将spsr的值复制到cpsr

initmem

ldr r0, =0x48000000 ; 内存控制寄存器起始地址

ldr r1, =0x48000034 ; 内存控制寄存器结束地址

adr r2, memdata ; 加载寄存器设置数据区首地址

initmemloop

ldr r3, [r2], #4

str r3, [r0], #4

teq r0, r1

bne initmemloop ; 循环设置每一个寄存器

mov pc, lr

memdata

DCD 0x22000000 ;BWSCON

DCD 0x00000700 ;BANKCON0

DCD 0x00000700 ;BANKCON1

DCD 0x00000700 ;BANKCON2

DCD 0x00000700 ;BANKCON3

DCD 0x00000700 ;BANKCON4

DCD 0x00000700 ;BANKCON5

DCD 0x00018005 ;BANKCON6

DCD 0x00018005 ;BANKCON7

DCD 0x008e07a3 ;REFRESH

DCD 0x000000b1 ;BANKSIZE

DCD 0x00000030 ;MRSRB6

DCD 0x00000030 ;MRSRB7

END ; 代码结束

main.c:

本程序文件是用户程序xmain,主要实现跑马灯效果,通过使用系统调用led_on,led_off实现Led控制。#include "led.h"

/* 亮灯延时 */

void delay(int msec)

{

int i, j;

for(i = 1000; i > 0; i--)

for(j = msec*10; j > 0; j--)

/* do nothing */;

}

/* 主函数跑马灯效果 */

int xmain()

{

while(1)

{

led_on(1);

delay(5); //delay

led_on(2);

delay(5); //delay

led_on(3);

delay(5); //delay

led_on(4);

delay(5); //delay

led_off(1);

delay(5); //delay

led_off(2);

delay(5); //delay

led_off(3);

delay(5); //delay

led_off(4);

delay(5); //delay

}

return 0;

}

led_lib.c

本程序文件是系统调用函数led_on, led_off的具体实现,通过swi软中断提交硬件访问请求,将具体请求以软中断号的方式通过参数传递给内核空间。#include "led.h"

#define __led_on_swi_no 1 // 软中断号1,调用管理模式下的do_led_on函数

#define __led_off_swi_no 2 // 软中断号2,调用管理模式下的do_led_off函数

int led_on(int led_no){

int ret; // 返回值

__asm{ // 由于C程序中没有SWI对应表达式,所以使用混合编程

mov r0, led_no // 根据ATPCS规则,r0存放第一个参数

swi __led_on_swi_no // 产生SWI软中断,中断号为__led_on_swi_no

mov ret, r0 // 软中断处理结束,取得中断处理返回值,传递给ret变量

}

return ret; // 将ret返回给调用led_on的语句

}

int led_off(int led_no){

int ret; // 返回值

__asm{ // 由于C程序中没有SWI对应表达式,所以使用混合编程

mov r0, led_no // 根据ATPCS规则,r0存放第一个参数

swi __led_off_swi_no // 产生SWI软中断,中断号为__led_off_swi_no

mov ret, r0 // 软中断处理结束,取得中断处理返回值,传递给ret变量

}

return ret; // 将ret返回给调用led_off的语句

}

led.h:

Led系统调用头文件。

extern int led_on(int num);

extern int led_off(int num);

sys_call.c:

本程序文件主要是系统调用接口内核空间do_led_on,do_led_off函数的实现。#include "register.h"

/* Led1~Led4初始化 */

#define LED1 (1<<5) //LED1 GPBDAT[5]

#define LED2 (1<<6) //LED2 GPBDAT[6]

#define LED3 (1<<7) //LED3 GPBDAT[7]

#define LED4 (1<<8) //LED4 GPBDAT[8]

/* 点亮对应num号Led */

extern int do_led_on (int num)

{

switch(num)

{

case 1:

GPBDAT = GPBDAT & ~LED1; break;

case 2:

GPBDAT = GPBDAT & ~LED2; break;

case 3:

GPBDAT = GPBDAT & ~LED3; break;

case 4:

GPBDAT = GPBDAT & ~LED4; break;

default:

return 0;

}

return num;

}

/* 关闭对应num号Led */

extern int do_led_off(int num)

{

switch(num)

{

case 1:

GPBDAT = GPBDAT | LED1; break;

case 2:

GPBDAT = GPBDAT | LED2; break;

case 3:

GPBDAT = GPBDAT | LED3; break;

case 4:

GPBDAT = GPBDAT | LED4; break;

default:

return 0;

}

return num;}

单片机 实验2-外部中断程序设计-中断按键按下次数计数数码管显示-硬件和程序设计参考

硬件电路参考如下:

程序参考如下: #pragma sfr #pragma interrupt INTP0 LED_INTP0 /* 定义使用INTP0中断,中断函数名LED_INTP0*/ #pragma di /*禁止使用中断功能声明*/ #pragma ei /*允许使用中断功能声明*/ /*数码管编码数组*/ unsigned char LED_light[10]={0x30,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x3F}; unsigned char j=0; /*按键次数变量*/ void hdinit() /*硬件初始化*/ { PM1=0; /*P1口输出数码管字型码,所以设置为输出*/ PU1=0XFF; /*由于P1口直接驱动数码管显示,为增大驱动,设置为内部上拉*/ PM12.0=0; /*P12.0口线要作为中断多功能,设置为输出和内部上拉 */ PU12.0=1; PIF0=0; /*中断请求标志,没有中断请求*/ PMK0=0; /*中断屏蔽标志,允许中断*/ PPR0=1; /*中断优先级,低优先级*/ EGP.0=1; /*与EGN组合,上升沿有效*/ EGN.0=0; } void main (void) { DI(); /*首先做准备,禁止中断*/ IMS=0XCC; IXS=0X00; hdinit(); EI(); /*准备完成,允许中断*/ while(1) { /*啥也不干,就等待中断,仅是在这个实验中使用中断,实际不是这样/* } } __interrupt void LED_INTP0() /*中断函数*/ { P1= LED_light[j]; /*P1赋值,数码管显示相应数值*/ j++; /*按键次数加一*/ if(j==10) /*如果按键次数达到十次,按键计数归0*/ {j=0;} } 思考: 如果用两位数码管,从0—99循环计数又该怎样设计硬件和软件呢?

中断程序编写与硬件仿真调试经验

1,中断程序的编写 一个编程经验是,所有的中断都要尽快的运行和退出,中断服务程序越短越好,这样才不至于干扰主程序的工作和其他中断的运行。也就是,我们应该尽量把程序代码从中断服务函数里搬出来。 对于定时器的中断的工作方式,我们可以建立一个全局的标记(变量flag),在中断里置这个标记,然后就退出。在主程序里去检查这个标记,再清0 标记和处理相应的工作。检查到这个标记之后,就运行相关的程序。对于CPU 任务比较多的项目来说,这种工作方式可以获得最佳的工作效率。当然,对于非常实时的应用要求,比如时钟,还是建议在中断里做完,因为使用标记的方式时,主程序可能太忙而造成错过标记信号,就是这个标记还没有开始处理呢,下一个该中断又来了。熟练的程序员还是可以避开这些异常的情况的。(实质上是看中断发生的频率与cpu主频的相对快慢,cpu处理速度快就不会产生这种问题) 2,在没有硬件的情况下,看看程序执行的如何,使用单步执行。但到外部中断的时候就过不去了,怎么让他接着执行外部中断的服务从程序呢? 在仿真运行时,在peripheral中打开对应的IO口或UART等,找到外部中断输入的那一位,手动给中断信号就可。 3,Keil中调试技巧 <1>查看变量的值 注意,要查看变量的值,只能在程序停下来的状态下查看。在程序运行的过程中,程序不断地运行,变量也在不断地变化,一般是无法查看的。 (1)点停止程序后,在C源文件窗口程序中,将鼠标放在的变量“n”上面,可以看到旁边出现了一个小框框,上面显示了n=0x47D3,这就是变量此时的值。 (2)如果觉得这样可能会点不准确,可以选中你要看的变量,同样会显示变量的值,个人感觉这种操作更为方便。 (3)在命令行窗口下,输入的方法也可以看变量,在命令行输入n,回车,就看到结果了。 (4)在watch 窗口看变量。点watch 图标,就是那个有个眼镜的图标,打开watch 窗口。注意要看某个变量,如果这个变量是某个函数私有的(局部变量),必须是程序停止时并且PC 已经停止在了这个函数中才可以看到(这就需要在该函数中设置断点),各种看变量的情况都是这样。 注:watch框内的变量只有在当前变量作用域的才可以添加,例如全局变量。局部变量即使添加后,在下次调试时也会从watch窗口移除,改到locals窗口内显示。这个' 符号似乎是表示该变量是上次调试时定义的,好像没其他什么作用。做过测试,只要成功被记录进watch窗口的全局变量,即使该量的物理地址发生了变化,下次调试时调试器也能准确跟踪到,并在watch内刷新结果。locals窗口是查看当前函数处内部变量值得窗口。不要被误导。KEIL调试时的watch窗口是查看的全局变量值,不能看内部变量值。 如果在watch窗口看内部变量,会是错误的。会误导你的!! <2>这里再教一招,如果我想让n 现在就变成我想要的值怎么办?这也是调试常见的手段,设置一个变量的值,比如,让n =0x1234,只要在命令窗口里输入“n=0x1234”就行了,几乎所有变量都可以这样直接设置,包括IO 口,比如你输入“P1.1=0”,结果第二个灯就亮了。 <3>还有一种直接看存储器的方法,可以看到所有存储器的值,但是和变量名称就不是那么好对应起来了。点memory 窗口图标,打开memory 窗口。在实际的硬件调试方式中,如果不用看memery 窗口,就建议不用打开它。因为保持它的打开会增加仿真时通讯的时间,特别是单步运行的时间。

汇编语言中断程序设计

汇编语言程序设计实验报告 学院:计算机科学与技术专业:计算机科学与技术班级:计科131

LEA DX,FNAME MOV CX,0 ;语句1 INT 21H JC EXIT MOV FNUM,AX MOV BX,AX ;语句2 MOV CX,100 MOV AH,40H LEA DX ,BUF INT 21H MOV BX,FNUM MOV AH,3EH INT 21H EXIT: MOV AH,4CH INT 21H CODE ENDS END START 使用相应的文本编辑器建立文件,内容如上所示。 2.汇编并运行此程序后,在当前目录建立的文件名是什么其内容是什么 1>汇编: C:\masm> masm lab7; 2>连接: C:\masm> link lab7; 3>运行: C:\masm> lab7 3.若将语句1 改为mov cx,1,则运行情况与前面会有什么区别 4.若将语句1 改为mov cx,2,则运行结果同上会有什么不同并简要说明此语句的作用. 5.若将语句2 改为mov bx,1,则运行结果会有什么不同简要说明则语句的作用. 实验二:编写0 号中断的处理程序,使得在除法溢出发生时,在屏幕中间显示字符串“divide error!”,然后返回到DOS。源程序下: assume cs:code code segment start: mov ax,cs mov ds,ax

mov si,offset do mov ax,0 mov es,ax mov di,200h mov cx,offset doend-offset do ;安装中断例程cld rep movsb mov word ptr es:[0],200h mov word ptr es:[2],0 ;设置中断向量表 mov dx,0ffffh mov bx,1 ;测试一下 div bx mov ax,4c00h int 21h do:jmp short dostart db 'divide error!' dostart: mov ax,0 mov ds,ax mov si,202h mov ax,0b800h mov es,ax mov di,160*12+60 mov cx,13 s: mov al,ds:[si] mov ah,15 mov es:[di],ax inc si inc di inc di loop s mov ax,4c00h int 21h doend:nop code ends end start

计算机组成原理中断实验报告

北京建筑大学 2015/2016 学年第二学期 课程设计 课程名称计算机组成原理综合实验 设计题目微程序控制器设计与实现 系别电信学院计算机系 班级计141 学生姓名艾尼瓦尔·阿布力米提 学号 完成日期二〇一六年七月八日星期五 成绩 指导教师 (签名) 计算机组成综合实验任务书

指令执行流程图; ?5、利用上端软件,把所编写的微程序控制器内容写入实验台中控制器中。 ?6、利用单拍测试控制器与编程的要求是否一致。如果有错误重新修改后再写入控制器中。 7、编写一段测试程序,测试控制器运行是否正确。 实验目的 1.融合贯通计算机组成原理课程,加深对计算机系统各模块的工作原理及相互联系(寄存器堆、运算器、存储器、控制台、微程序控制器)。 2.理解并掌握微程序控制器的设计方法和实现原理,具备初步的独立设计能力;3.掌握较复杂微程序控制器的设计、调试等基本技能;提高综合运用所学理论知识独立分析和解决问题的能力。 实验电路 1. 微指令格式与微程序控制器电路 2.微程序控制器组成 仍然使用前面的CPU组成与机器指令执行实验的电路图,但本次实验加入中断系统。这是一个简单的中断系统模型,只支持单级中断、单个中断请求,有中断屏蔽功能,旨在说明最基本的原理。

中断屏蔽控制逻辑分别集成在2片GAL22V10(TIMER1 和TIMER2)中。其ABEL语言表达式如下: INTR1 := INTR; INTR1.CLK = CLK1; IE := CLR & INTS # CLR & IE & !INTC; IE.CLK= MF; INTQ = IE & INTR1; 其中,CLK1是TIMER1产生的时钟信号,它主要是作为W1—W4的时钟脉冲,这里作为INTR1的时钟信号,INTE的时钟信号是晶振产生的MF。INTS微指令位是INTS机器指令执行过程中从控制存储器读出的,INTC微指令位是INTC机器指令执行过程中从控制存储器读出的。INTE是中断允许标志,控制台有一个指示灯IE显示其状态,它为1时,允许中断,为0 时,禁止中断。当INTS = 1时,在下一个MF的上升沿IE变1,当INTC = 1时,在下一个MF的上升沿IE变0。CLR信号实际是控制台产生的复位信号CLR#。当CLR = 0时,在下一个CLK1的上升沿IE变0。当 CLR=1 且INTS = 0 且 INTC = 0时,IE保持不变。 INTR是外部中断源,接控制台按钮INTR。按一次INTR按钮,产生一个中断请求正脉冲INTR。INTR1是INTR经时钟CLK1同步后产生的,目的是保持INTR1与实验台的时序信号同步。INTR脉冲信号的上升沿代表有外部中断请求到达中断控制器。INTQ是中断屏蔽控制逻辑传递给CPU的中断信号,接到微程序控制器上。当收到INTR脉冲信号时,若中断允许位INTE=0,则中断被屏蔽,INTQ仍然为0;若INTE =1,则INTQ =1。

中断系统简述

Harbin Institute of Technology 中断系统简述 院系:航天学院 班级:04103 姓名:李子豪 学号:1110410329 哈尔滨工业大学

中断系统简述 1.什么是中断?中断技术产生的原因,有什么优缺点? 答:作为计算机与外部设备交换信息的一种同步控制方式,中断是指执行当前程序的过程中,由于某种随机出现的外设请求,使CPU暂停(即中断)正在执行的程序而转去执行为外设服务的程序;当服务完毕后,CPU再返回到暂停处(即断点)继续执行原来的程序。主要分为硬中断和软中断。中断系统是计算机的重要组成部分。实时控制、故障自动处理、计算机与外围设备间的数据传送往往采用中断系统。中断系统的应用大大提高了计算机效率。 不同的计算机其硬件结构和软件指令是不完全相同的,因此,中断系统也是不相同的。计算机的中断系统能够加强CPU对多任务事件的处理能力。中断机制是现代计算机系统中的基础设施之一,它在系统中起着通信网络作用,以协调系统对各种外部事件的响应和处理。中断是实现多道程序设计的必要条件。中断是CPU对系统发生的某个事件作出的一种反应。 2.基本概念:中断源、中断嵌套、中断级联、软中断、硬中断、NMI、可屏蔽中断、中断 请求号、中断向量、中断响应INTA、中断周期、单步中断、IF中断允许标志位、IMR 中断屏蔽字、中断优先级、中断控制器、中断处理子程序、0号中断、1号中断 中断源:引起中断的原因或发出中断请求的来源 中断嵌套:在优先级已定的情况下,低优先级的中断服务程序可以被高优先级的中断源所中断,等高优先级的中断服务程序结束后,再返回去执行被中断的低优先级中断服务程序。 (嵌套的级数原则上不限,只取决于堆栈深度,实际上与要求的中断响应速度也有关。) 中断级联:众多的中断源是有级别的,必须划出级别来 软中断:由CPU内部原因(指令或异常)引起的中断又叫内中断,统称为异常 硬中断:由CPU外部事件引起的中断,又叫外中断。简称中断。 NMI:一种为外部紧急请求提供服务的中断,不受CPU内部的中断允许标志IF的屏蔽 可屏蔽中断:CPU用来响应各种异步的外部硬件中断的最常用方法,受CPU内部的中断允

内部中断、外部中断、硬件中断和软件中断分析

软件中断、硬件中断、外部中断、内部中断 2010-01-30 16:35:05| 分类:电子爱好者|字号订阅 8086/8088把中断分为内部中断和外部中断两大类。为了支持多任务和虚拟存储器等功能,80386把外部中断称为“中断”,把内部中断称为“异常”。与8086/8088一样,80386通常在两条指令之间响应中断或异常。80386最多处理256种中断或异常。 1.中断 对80386而言,中断是由异步的外部事件引起的。外部事件及中断响应与正执行的指令没有关系。通常,中断用于指示I/O设备的一次操作已完成。与8086/8088一样,80386有两根引脚INTR和NMI接受外部中断请求信号。INTR接受可屏蔽中断请求。NMI接受不可屏蔽中断请求。在80386中,标志寄存器EFLAGS中的IF标志决定是否屏蔽可屏蔽中断请求。 外部硬件在通过INTR发出中断请求信号的同时,还要向处理器给出一个8位的中断向量。处理器在响应可屏蔽中断请求时,读取这个由外部硬件给出的中断向量号。处理器对这个中断向量号并没有规定。但在具体的微机系统中,系统必须通过软件和硬件的配合设置,使得给出的这个中断向量号不仅与外部中断源对应,而且要避免中断向量号使用冲突情况的出现。可编程中断控制器芯片8259A可配合80386工作,能够根据设置向处理器提供上述中断向量号,还能处理中断请求的优先级。每个8259A芯片可以支持8路中断请求信号,如果使用9个8259A芯片(一个主片,8个从片),就可使80386在单个引脚INTR上接受多达64个中断源的中断请求信号。 处理器不屏蔽来自NMI的中断请求。处理器在响应NMI中断时,不从外部硬件接收中断向量号。与8086/8088一样,在80386中,不可屏蔽中断所对应的中断向量号固定为2。为了不可屏蔽中断的嵌套,每当接受一个NMI中断,处理器就在内部屏蔽了再次响应NMI,这一屏蔽过程直到执行中断返回指令IRET后才结束。所以,NMI处理程序应以IRET指令结束。 2.异常 异常是80386在执行指令期间检测到不正常的或非法的条件所引起的。异常与正执行的指令有直接的联系。例如,执行除法指令时,除数等于0。再如,执行指令时发现特权级不正确。当发生这些情况时,指令就不能成功完成。软中断指令“INT n”和“INTO”也归类于异常而不称为中断,这是因为执行这些指令产生异常事件。 80386识别多种不同类别的异常,并赋予每一种类别以不同的中断向量号。异常发生后,处理器就象响应中断那样处理异常。即根据中断向量号,转相应的中断处理程序。把这种中断处理程序称为异常处理程序可能更合适。 根据引起异常的程序是否可被恢复和恢复点不同,把异常进一步分类为故障(Fault)、陷阱(Trap)和中止(Abort)。我们把对应的异常处理程序分别称为故障处理程序、陷阱处理程序和中止处理程序。 故障是在引起异常的指令之前,把异常情况通知给系统的一种异常。80386认为故障是可排除的。当控制转移到故障处理程序时,所保存的断点CS及EIP的值指向引起故障的指令。这样,在故障处理程序把故障排除后,执行IRET返回到引起故障的程序继续执行时,刚才引起故障的指令可重新得到执行。这种重新执行,不需要操作系统软件的额外参与。故障的发现可能在指令开始执行之前,也可能在指令执行期间。如果在指令执行期间检测到故障,那么中止故障指令,并把指令的操作数恢复为指令开始执行之前的值。这可保证故障指令的重新执行得到正确的结果。例如,在一条指令的执行期间,如果发现段不存在,那么停止该指令的执行,并通知系统产生段故障,对应的段故障处理程序可通过加载该段的方法来排除故障,之后,原指令就可成功执行,至少不再发生段不存在的故障。

软中断实验报告

篇一:linux软中断通信实验报告 实验2 linux软中断通信 1.实验目的 通过本实验,掌握软中断的基本原理;掌握中断信号的使用、进程的创建以及系统计时器的使用。 2.实验内容(上交的实验2统一取名为:test2) 由父进程创建两个子进程,通过终端输入crtl+\组合键向父进程发送sigquit软中断信号或由系统时钟产生sigalrm软中断信号发送给父进程;父进程接受到这两个软中断的其中某一个后,向其两个子进程分别发送整数值为16和17软中断信号,子进程获得对应软中断信号后,终止运行;父进程调用wait()函数等待两个子进程终止,然后自我终止。 3. 设计思想及算法流程 4. 源程序 #include <stdio.h> #include <stdlib.h> #include <signal.h> #include <unistd.h> #define sec 5 void waiting(); void stop(); int wait_mark; int main() { int p1, p2; /*定义两个进程号变量*/while ((p1 = fork()) == -1); /*循环创建进程至成功为止*/if (p1 > 0) { while ((p2 = fork()) == -1); /*循环创建进程至成功为止*/ if (p2 > 0) { wait_mark = 1; alarm(sec); signal(sigquit, stop); signal(sigalrm, stop); waiting(); kill(p1, 16); kill(p2, 17); wait(0); wait(0); printf(parent process is killed!\n); exit(0); } else { signal(sigquit, sig_ign); signal(sigalrm, sig_ign); wait_mark = 1; signal(17, stop); /*接收到软中断信号17,转stop*/ waiting();/*在wait置0前,不可往下执行*/lockf(1, 1, 0); /*加锁*/ printf(child process 2 is killed by parent!\n);

郑州大学操作系统期末考试重点整理

操作系统是管理系统资源、控制程序执行、改善人机界面、提供各种服务、合理组织计算机工作流程和为用户有效使用计算机提供良好运行环境的一种系统软件。 资源管理1资源复用(空分复用共享,,时分复用共享)2资源虚化3资源抽象4组合使用抽象和虚化技术 .操作系统中的基础抽象——进程、虚存和文件(1)进程抽象(2)虚存抽象(3)文件抽象(4)其他资源抽象 操作系统的作用:(1)OS作为用户接口和公共服务程序:(2)OS作为扩展计算机或者虚拟计算机(2)OS作为资源的管理者和控制者(4)OS作为程序执行的控制着和管理者从资源管理的角度,看操作系统具有六项主要功能:处理器管理,存储管理,设备管理,文件管理,网络与通信管理,用户接口 操作系统的主要特性:并发性,共享性,异步性 并发性:指两个或两个以上事件或活动在同一时间间隔内发生。 并行性:指两个或两个以上事件或活动在同一时刻发生。 关系:并行活动一定是并发的,反之并发活动未必是并行的,并行性是并发性的特例,并发性是并行性的扩展。 共享性:指操作系统中的资源可被多个并发执行的进程共同使用,而不是被其中某一个程序所独占。 1,透明资源共享:必须妥善解决的问题有资源隔离, 授权访问2,显式资源共享:独占资源是指同一时间段内只允许一个进程访问的资源 异步性:由计算机系统中的资源有限而进程众多,每个进程的执行并非连贯的,而是以“走走停停”的方式向前推进。多道程序设计是指允许多个程序同时进入一个计算机系统的主存储器并启动进行交替计算的方法。从宏观上看,多道程序并发运行,它们都处于运行过程中,但都未运行结束。从微观上看,多道程序的执行是串行的,各道程序轮流占用CPU,交替地执行。好处:1,提高CPU、主存和设备的利用率,2,提高系统的吞吐率,是单位时间内完成的作业数增加。3充分发挥计算机系统部件的并行性 操作系统可分为三种基本类型:批处理操作系统分时操作系统.实时操作系统 通用操作系统:如果某个操作系统兼具批处理、分时、实时处理的全部或两种功能,则为通用OS 操作系统为用户提供两种调用其服务和功能的接口: 程序接口:允许运行程序调用操作系统的服务和功能。 许多操作系统的程序接口由一组系统调用(System Call))组成,用户程序使用“系统调用”就可获得操作系统的底层服务,使用或访问系统的各种软硬件资源。 操作接口:操作系统为用户提供的操作控制计算机工作和提供服务手段的集合,通常有操作控制命令、图形操作界面、以及批处理系统提供的作业控制语言等实现手段。 内核是一组程序模块,作为可信软件来支持进程并发执行的基本功能和基本操作,通常驻留在内核空间,运行于核心态,具有访问硬件设备和所有主存空间的权限,是仅有的能执行特权指令的程序。分类可分为微内核和单内核两种类型。功能1)资源抽象2)资源分配3)资源共享。 属性1)内核是由中断驱动的2)内核的执行是连续的3)内核在屏蔽中断状态下执行4)内核可以使用特权指令。 从操作系统的运行方式来看,可分成:独立运行的内核模型、在应用进程内执行的模型和作为独立进程运行的模型。 处理器流可以分作以下四类:单指令流单数据流(SISD):传统的计算机系统。单指令流多数据流(SIMD)和多指令流多数据流(MIMD)都属于并行计算机! 多指令流单数据流(MISD):在研究中 处理器现场:处理器包括一组寄存器,用于存放数据、变量和中间结果,这组寄存器所存储的信息与程序的执行有很大关系,构成了处理器现场。 特权指令是指只能提供给操作系统的核心程序使用的指令,如启动I/O设备、设置时钟、控制中断屏蔽位、清内存、建立存储键,加载PSW(程序状态字)等。 非特权指令:指供应用程序使用的、权限较低的指令。 处理器状态分类:核心状态和用户状态。 核心态具体的权限有:1,CPUU运行可信软件2,硬件执行全部机器指令3,可以访问所有内存单元和系统资源4,具体改变处理器状态的能力。 用户态具有的权限有:1,CPU运行非可信软件2,程序无法执行特权指令3,访问权限仅限于当前进程的地址空间4,不具有改变处理器状态的能力 处理器状态之间的转换:(1)用户状态向核心状态的转换:一是程序请求操作系统服务,执行一条系统调用;二是程序运行时,产生了一个中断(或者异常)事件,运行程序被中断,让中断处理程序工作。这两种情况都是通过中断机构发生的。中断(异常)是用户态到核心态转换的唯一途径。(2)核心状态向用户状态的转换:每台计算机通常会提供一条特权指令称作加载程序状态字LPSW(Load PSW),用来实现操作系统向用户程序的转换。 加载程序状态字指令的作用:把哪个程序的程序状态字加载到程序状态字寄存器中,就意味着该程序获得CPU控制权执行。 中断是指程序执行过程中,遇到急需处理的某个事件时,暂时中止CPU上现行程序的运行,转而执行相应的事件处理程序执行的过程,待处理完毕之后再返回断点(继续执行)或者调度其他程序执行。中断源是引起中断的事件。中断装置是发现中断源并产生中断的硬件。 中断源分类:1.从中断事件的性质和激活的手段来分,可以分成两类:强迫性中断事件和自愿性中断事件。2按照中断信号的来源和实现手段来分:可分为硬中断和软中断两类。硬中断可以分为外中断和内中断。

DSPBIOS软件中断(SWI)

DSP/BIOS软件中断(SWI) 一、SWI模块概述 在DSP/BIOS内核中,系统管理并运行的线程分为四个等级:硬件中断服务程序、软件中断服务程序、任务和后台空闲函数,优先级依次降低。每个软件中断服务程序都对应一个函数,当然,每个软件中断也可以单独设置优先级。高优先级的软件中断会抢占正在执行的低优先级的软件中断 所有软件中断都是通过DSP/BIOS内核的API调用来启动。一旦启动了一个SWI 对象,此时,系统将为该SWI对象中的函数创建一个运行时间表。因此,当一个软件中断被启动后,其对象函数不一定会立即执行,而是会按照时间表在执行队列中根据优先级排队等候运行。DSP/BIOS根据软件中断优先级来判断是否要暂停当前运行的线程。 中断线程(包括硬件中断和软件中断)都是使用相同的堆栈来执行的。当中断发生时,新的线程就会添加到栈顶,系统会执行一次任务切换(Context Switch)。由于高优先级软件中断会打断低优先级的软件中断的运行,所以SWI模块在运行高优先级软件中断前会自动保存寄存器中的内容。在高优先级软件中断运行完成后,寄存器会恢复原来的内容,以便继续运行原来的低优先级中断。如果没有启动其他高优先级的软件中断,低优先级的软件中断就会运行。DSP/BIOS内核虽然具有抢占的特点,但如果没有导致任务切换的API 函数调用,系统则不会主动切换道其他线程去执行的。(理解这点在实际应用中很重要,即如果现在运行的是低优先级软中断对应的函数,如果你不在函数中调用如SWI_post()启动更高优先级的软件中断或启动了比自身低的优先级中断,则当前软中断就不会被打断,执行直到退出)。 个人经验:尽量不要在一个软中断对应的函数中去启动另一个比其本身优先级高的软件中断,因为根据抢占原则,其本身将被打断,从而CPU转去执行高优先级软中断对应的函数,低优先级的实时性将得不到保证,当有多级优先级及系统复杂情况下甚至引起系统瘫痪。也不要设置很多的优先级。当然这也不是绝对的,如果系统规划的好,利用好软中断的基于优先级抢占式的特点会大大简化你的设计。 二、SWI的执行 通过调用SWI_andn,SWI_sec,SWI_inc,SWI_or,SWI_post可以使软件中断被调度执行。这些函数本身可以在程序的任何地方调用------中断服务程序ISR中,周期函数中,空闲函数中或其他软件中断函数中。 当一个SWI对象被触发时,SWI管理器将该软件中断添加到一个被触发软件中断的列表中等待,然后SWI管理器检查软件中断当前是否被使能。如果使能,SWI管理器将该SWI对象的优先级和当前运行线程的优先级进行比较。若当前运行线程是后台空闲循环IDL或是一个更低优先级的SWI,那么SWI管理器将这个SWI对象从被触发SWI对象列表中移除,并将CPU控制权从当前线程交给SWI对象,开始执行SWI函数。 Note:1.当一个SWI开始执行后,必须无阻塞地运行到结束; 2.当在HWI中调用时,调用任何会触发软件中断的SWI函数的代码必须包装在一个HWI_enter/HWI_exit宏调用中,或者由HWI调度程序调用; 3.如果一个软件中断在SWI管理器将其从被触发SWI对象列表中移除之前,被触发多次,其SWI函数只会执行一次。这个类似硬件中断的特征:即在CPU清除中断标志寄存器中相应的中断标志为之前,如果该硬件中断触发多次,对应的HWI只会执行一次。

Windows 中断程序设计(一)

Windows 中断程序设计(一) 摘要该文探讨Windows3.1的中断机制,并结合DPMI接口给出一种中断程序设计方法,以越过系统和应用程序的消息队列,处理外部实时事件。 一、前言 Windows提供强大的功能以及友好的图形用户界面(GUI),使得它不仅广泛的用作管理事务型工作的支持平台,也被工业领域的工程人员所关注。但Windows3.1并非基于优先级来调度任务,无法立即响应外部事件中断,也就不能满足工业应用环境中实时事件处理和实时控制应用的要求。因此,如何在Windows环境中处理外部实时事件一直是技术人员尤其是实时领域工程人员所关注的问题。目前已有的方法大都采用内挂实时多任务内核的方式,如Windows下的实时控制软件包FLX等,而iRMX实时操作系统则把Windows3.1当作它的一个任务来运行。对于大型的工程项目,开发人员可采用购买实时软件然后集成方式。 对中小项目,从投资上考虑就不很经济。如何寻找一种简明的方法来处理外部实时事件依然显得很必要。 本文首先阐述Windwos的消息机制及中断机制,然后结合DPMI接口,给出一种保护模式下中断程序的设计方法,以处理外部实时事件。经实际运行结果表明,该方法具有简洁、实用、可靠的特点,并同样可运行于Win95。 二、Windows的消息机制 Windows是一消息驱动式系统,见图1。Windows消息提供了应用程序

与应用程序之间、应用程序与Windows系统之间进行通讯的手段。应用程序要实现的功能由消息来触发,并靠对消息的响应和处理来完成。Windows系统中有两种消息队列,一种是系统消息队列,另一种是应用程序消息队列。计算机的所有输入设备由Windows监控,当一个事件发生时,Windows先将输入的消息放入系统消息队列中,然后再将输入的消息拷贝到相应的应用程序队列中。应用程序中的消息循环从它的消息队列中检索每一个消息并发送给相应的窗口函数中。一个事件的发生,到达处理它的窗口函数必需经历上述过程。值得注意的是消息的非抢先性,即不论事件的急与缓,总是按到达的先后排队(一些系统消息除外),这就使得一些外部实时事件可能得不到及时的处理。 图1 三、Windows的保护模式及中断机制 1.Windows的保护模式 保护模式指的是线性地址由一个选择符间接生成的,该选择符指向描述表中的某一项;而实模式中则通过一个段/偏移量对来直接寻址。80386(486)CPU提供的保护模式能力包括一个64K的虚拟地址空间和一个4G的段尺寸。Windows3.1实现时有所差别,它支持标准模式和增强模式。标准模式针对286机器,不属本文探讨范围。增强模式是对386以上CPU而言,Windows正是使用保护模式来打破1M的屏障并且执行简单的内存保护。它使用选择器、描述器和描述器表控制访问指定内存的位置和段。描述器表包括全局描述器表、局部描述器表、中断描

linux 中断分析

Linux系统中有很多不同的硬件设备。你可以同步使用这些设备,也就是说你可以发出一个请求,然后等待 一直到设备完成操作以后再进行其他的工作。但这种方法的效率却非常的低,因为操作系统要花费很多的等待时间。一个更为有效的方法是发出请求以后,操作系统继续其他的工作,等设备完成操作以后,给操作系统发送一个中断,操作系统再继续处理和此设备有关的操作。 在将多个设备的中断信号送往CPU的中断插脚之前,系统经常使用中断控制器来综合多个设备的中断。这样即可以节约CPU的中断插脚,也可以提高系统设计的灵活性。中断控制器用来控制系统的中断, 它包括屏蔽和状态寄存器。设置屏蔽寄存器的各个位可以允许或屏蔽某一个中断,状态寄存器则用来返回系统中正在使用的中断。 大多数处理器处理中断的过程都相同。当一个设备发出中段请求时,CPU停止正在执行的指令,转而跳到包括中断处理代码或者包括指向中断处理代码的转移指令所在的内存区域。这些代码一般在CPU的中断方式下运行。在此方式下,将不会再有中断发生。但有些CPU的中断有自己的优先权,这样,更高优先权的中断则可以发生。这意味着第一级的中断处理程序必须拥有自己的堆栈,以便在处理更高级别的中断前保存CPU的执行状态。当中断处理完毕以后,CPU将恢复到以前的状态,继续执行中断处理前正在执行的指令。 中断处理程序十分简单有效,这样,操作系统就不会花太长的时间屏蔽其他的中断。 [设置Softirq] cpu_raise_softirq是一个轮训,唤醒ksoftirqd_CPU0内核线程, 进行管理 cpu_raise_softirq |__cpu_raise_softirq |wakeup_softirqd |wake_up_process ·cpu_raise_softirq [kernel/softirq.c] ·__cpu_raise_softirq [include/linux/interrupt.h] ·wakeup_softirq [kernel/softirq.c]

第5章 中断服务程序设计

第5章中断服务程序设计 中断服务程序(ISR)是嵌入式应用系统获取各种事件的基本手段,而“事件”是实时性问题的讨论基础和时间计算的起点。ISR的设计质量直接影响到系统的实时性指标和操作系统的工作效率。 只要没有关中断,中断服务程序可以中断任何任务的运行,可将中断服务程序可成比最高优先级(0级)还高的“任务”。 5.1中断优先级安排原则 中断源是系统及时获取异步事件的主要手段,其优先级安排原则如下: ●紧迫性:触发中断的事件允许耽误的时间越短,设定的中断优先级就越高。 ●关键性:触发中断的事件越关键(重要),设定的中断优先级就越高。 ●频繁性:触发中断的事件发生越频繁,设定的中断优先级就越高。 ●快捷性:ISR处理越快捷(耗时短),设定的中断优先级就越高。 中断服务程的功能应尽量简单,只要将获取的异步事件通信给关联任务,后续处理由关联任务完成。 5.2不受操作系统管理的中断服务程序 正常情况下,ISR应受操作系统的管理,因很多任务是靠ISR触发的。 但在两种情况下ISR不受操作系统管理:①没有必要;②操作系统没有对该ISR进行管理。 实时操作系统uC/OS-Ⅱ移植到ARM7体系的CPU上时,没有对FIQ进行处理,即FIQ 是不受操作系统管理的。 选用FIQ来响应实时性要求最高的高速采样操作是一个有效措施,保护现场的工作量很小(FIQ专有的8个寄存器不需要保护)。 在工程模板的系统启动文件Startup.s中,已经把汇编代码部分处理好,用户只需要用C 语言编写快速中断服务函数FIQ_Exception()即可,不需考虑保护现场和恢复现场的问题。 程序:Startup.s中队FIQ的处理 Reset ;异常向量表 LDR PC,ResetAddr ;跳转到复位入口地址 LDR PC,UndefinedAddr LDR PC,SWI_Addr ;跳转到软件中断入口地址 LDR PC,PrefetchAddr LDR PC,DataAbortAddr DCD 0xb9205f80 LDR PC,[PC,#-0xff0] ;跳转到向量中断入口地址(向量中断控制器) LDR PC,FIQ_Addr ;跳转到快速中断入口地址 ResetAddr DCD ResetInit UndefinedAddr DCD Undefined SWI_Addr DCD SoftwareInterrupt PrefetchAddr DCD PrefetchAbort Nouse DCD 0

中断概述和中断处理过程

第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.进程的基本状态有_____________、_____________、_____________。 2.常用的存管理方法有、、和段页式管理。 3.文件的三种物理结构是_________、_________、_________。 4.一次仅允许一个进程使用的共享资源称为。每个进程中访问临界资源的那 段程序称为。 5.从结构上讲,每个进程都是由、和部分组成。 6.按照设备的使用方式将设备分为:独享设备、共享设备和_________设备。 7.进程具有下面的特征性质:________、__________、_________和异步性 8.产生死锁的必要条件____________、____________、___________和____________ 9.在请求页式管理中,当地址转换机构发现所需的页不在时,产生中断 信号,由中断处理程序作相应的处理。 10.缓冲引入的目的是缓和CPU与I/O设备间_______,减少对CPU的_______,提高 CPU和I/O设备之间的_________。 11.进程之间的通讯类型分为:_______________、_____________和________________。 12.用户进程从用户态变为系统态的途径是___________________。 13.操作系统的基本特性包括:__________、_________、___________和异步性 14.动态重定位是指。 15.设备按传输数据类型分为:和 16.常用的进程调度算法有优先级调度算法、____________和算法。 17.操作系统具有四大功能分别为______________、_______________、_____________ 和设备管理。 18.常用的页面置换算法是_________、_________、________和Clock置换算法。 19.按照设备的使用方式将设备分为:独享设备、设备和________设备。 20.在请求分页存储管理模式中,页面调入时,可采用两种策略,它们分别是 和。 21.虚拟存储器具有__________和___________功能。 22.设备按传输数据类型分为:和。

PIC单片机中断程序的设计技巧

PIC单片机中断程序的设计技巧 所有的中档系列PIC单片机,PORTB端口最高的4个引脚(RB7~RB4)在设为输入模式时,当输入电平由高到低或由低到高发生变化时,可以让单片机产生中断。这就是通常所说的引脚状态变化中断。 在设计引脚中断程序时,有三个需要特别注意的地方。一是,在清除P0RTB中断标志位RBIF之前,必须安排一条必不可少的,以PORTB端口数据寄存器PORTB为源寄存器的读操作指令。放置这一指令的目的有时并不只是为了读取有用的数据,而是为了取消状态变化的硬件信号,以便顺利清除RBIF标志位,为下一次中断做好准备。二是,由于端口PORTB 是引脚电子变化中断,即无论引脚出现上升沿还是下降沿都会产生中断请求,所以必须处理好不需要的虚假中断。三是,一般都利用PIC单片机的引脚功能来检测按键,所以必须处理好按键消抖的问題。 2 引脚中断程序设计 在主程序里先设置有关的寄存器。 ◇设置TRISB寄存器,使RB7~RB4相关的引脚处于输入状态; ◇如果需要弱上拉,通过OPTION_REG的第7位设置; ◇RBIF=O; ◇RBIE=1; ◇GIF=1。 响应状态变化后的中断服务程序。 ◇检查RBIF是否为l,为l则是引脚变化引起的中断; ◇调用延时程序,延时20~30 ms,目的是为了按键去抖; ◇判断是引脚出现上升沿还是下降沿引起的中断; ◇调用按键处理程序; ◇读PORTB口的值,取消状态变化的硬件信号; ◇清除RBIF标志。 笔者认为上面程序设计最大的问题是在中断程序里调用延时程序。大家知道,中档PIC 单片机只有8层深度的硬件堆栈,在中断里调用于程序出现极易堆栈溢出的情况。另外,PIC单片机中断程序人口只有一个,在响应中断的请求时,PIC单片机就会自动把全局中断的使能位(INTCON的第7位GIF)清除,这样其他中断就暂时不能被响应(此时,如果别的中断发出的中断请求,标志位将一直保留着),直到这个中断程序退出后才会得到响应。这就要求我们设计中断程序的时候必须尽量短,避免调用子程序,更不要在中断里进行复杂的运算。 下面给出笔者设计程序时的思路。 当引脚状态变化引起中断时,在中断子程序里首先判断引起中断的原因是不是我们需要的变化引起的中断。如果是,不要在这里延时,而是设置一个标志位,接着清除中断标志,退出中断。中断程序如下: else if((RBIE&RBlF)==1){ //如果引脚变化引起中断 if(RB4==0){ //RB4上的按钮接地 key=1;//按键标志位置位 } RBIF=0;//清除引脚中断标志位 }

软中断和硬中断

软中断和硬中断 1.软中断, 也称内中断, 是由执行某些指令引起的 软中断, 一般是由下列这4种情况引发的: 1) DIV或IDIV指令:当执行这些除法指令,若除数为0或商溢出,则一定会产生中断,这叫0型中断 2) INT指令:当执行INT n时,则产生n型中断 3) INTO指令:若指令序列执行过程中,前面指令的执行结果使溢出标志位OF=1, 接着若执行INTO指令,则会引起内部中断,称为4型中断 4) 单步执行 2.硬中断, 也称外中断, 是由外部接口设备引起的 80x86有两条中断请求线:非屏蔽中断NMI线和可屏蔽中断INTR线,当这两条线上收到中断请求信号而引起中断时, 称这类中断为硬中断.(NMI线直接接CPU 引脚, INTR线接8259A中断控制器) 非屏蔽中断和屏蔽中断 1. 非屏蔽中断 当NMI线上出现一个由低上跳的高电平中断请求信号后(持续时间须大于两个时钟周期),不管标志位I状态如何,当前指令执行完后, X86 CPU马上转入中断处理.此类型中断有来源;系统板上RAM产生奇偶错, 协处理器上来的中断请求, I/O通道检查出错, Intel保留的中断0x00~0x1F, 软中断. 2.可屏蔽中断 当INTR线上出现一个高电平中断请求信号后(必须保持到当前执行的指令结束为止), CPU是否响应该中断,取决于标志信I的状态,若I=0,则不响应.(INTR线接8259A中断控制器) 附: IF是个开关, 其控制8259中断控制器发给CPU的中断是否有效,这种来自外部硬件通过8259到CPU的中断就是可屏蔽的中断. IF对非屏蔽中断不起作用即Intel保留的中断, NMI, 软中断。

相关文档
最新文档