当前位置:文档之家› 中断处理程序设计

中断处理程序设计

中断处理程序设计
中断处理程序设计

课程实验报告

课程名称:汇编语言程序设计

实验名称:实验四

实验时间: 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码

要求:(1) 用文字描述中断服务程序的编程思想,并画出流程图;

(2) 中断程序驻留内存后,在C>状态下直接敲击键A和B,观察是否变成

了B和A。

2.3任务三

采用简化段定义,重新实现第3次上机实验的题目。

要求:(1) 子程序的定义、调用,请使用“完整的函数定义”、INVOKE伪指令(P242-P246);

(2) 输入、输出,可以定义并使用宏指令;

(3)进入TD观察子程序,查看堆栈段数据存放的情况

2.4任务四

安装MASM32软件包。试着编译、连接课本中的程序例6.9(《汇编语言程序设计》,p267),阅读该程序,熟悉基于窗口的windows程序的组成

3实验过程

3.1任务一

3.1.1实验要求

用三种方式获取中断类型码10H对应的中断处理程序的入口地址。

要求:(1) 直接运行调试工具(TD.EXE),观察中断矢量表中的信息;

(2) 编写程序,用DOS功能调用方式获取,观察相应的出口参数与(1)中看到的结果是否相同(使用TD观看即可)

(3) 编写程序,直接读取相应内存单元,观察读到的数据与(1)看到的结果是否相同(使用TD观看即可)。

3.1.2实验结果

实验结果:

(1)

从图中可以看出,当前CS值为0821,为代码段首地址,IP为0008,指向下一个语句的地址,bx=02C0,es=F100

(2)首先编译链接通过,进入TD里面查看

通过后单步执行,运行到int 21h后,观察记录bx=02C0,es=F100,ip为下一句指令的地址。

(3)首先编译链接通过,进入TD界面观察

观察得到bx=02C0,cx=F100,ip指向下一句地址。

3.2任务二

3.2.1设计思想及存储分配

设计思想及存储分配:在“int 16h”的入口参数中,AH用来制定功能号,根据不同的功能号完成不同的要求,本题中,不管采用什么方法获取按键,最后都是通过执行16H号软中断的0号和10号功能调用来实现的。所以只需要接管16H软中断的0号和10号功能调用并处理。中断程序功能是从键盘读取一个字符,显示在dos界面上。新的中断程序会在执行过程中调用到老中断程序,先将输入的字符的扫描码和a的扫描码比较,相等的话a的ASCII加1,若不等再和b的扫描那比较,若相等则b的ASCII码减1,否则直接读取该字符寄存器分配:AH为键入字符的扫描码,AL存放字符的ASCII码,BX存放原16H中断的偏移地址,ES为原16H的段地址。

3.2.2程序框图

Y

N

Y

N

输入键的扫描码给al

ah=1eh ?

ah=30h ? al 加1

访问原16H 中断程序

al 减1

访问新的16H 中断程序

主存单元驻留

结束

3.2.3源程序代码

.386

stack segment use16 stack

db 200 dup(0)

stack ends

code segment use16

assume cs: code, ds: code, ss: stack old_int dw ?,?

new16h proc far

cmp ah, 00h

je L0

cmp ah, 10h

je L0

jmp dword ptr cs: old_int

L0: pushf

call dword ptr cs: old_int

cmp ah,1eh

jne L1

inc al

L1: cmp ah,30h

jne exit

dec al

exit: iret

new16h endp

start: mov ax, 3516h

int 21h

mov cs: old_int, bx

mov cs: old_int+2, es

push cs

pop ds

lea dx, new16h

mov ax, 2516h

int 21h

mov ax, 3100h

int 21h

code ends

end start

3.2.4实验结果

3.3任务三

采用简化段定义,重新实现第3次上机实验的题目。

要求:(1) 子程序的定义、调用,请使用“完整的函数定义”、INVOKE伪指令(P242-P246);

(2) 输入、输出,可以定义并使用宏指令;

3.3.1源程序代码

主程序源程序为:

.MODEL SMALL, STDCALL

.386

;

SCANF PROTO FAR BUF:word, BASE: BYTE

PRINT PROTO FAR BUF:word

;

.DATA

note1 db 0ah, 0dh, "input N1: $"

note2 db 0ah, 0dh, "input N2: $"

note3 db 0ah, 0dh, "input number string:$ "

note4 db 0ah, 0dh, "output: $"

buf1 db 6 dup('0')

buf2 db 6 dup('0')

buf3 db 20 dup('0')

buf4 db 20 dup('0')

flag db 0

base db 10

;

.STACK 1000

;

.CODE

START:

mov ax, @data

mov ds, ax

lea dx,note1

mov ah,9

int 21h

lea dx,buf1

mov ah,10

int 21h

lea dx,note2

mov ah,9

int 21h

lea dx,buf2

mov ah,10

int 21h

lea dx,note3

mov ah,9

int 21h

lea dx,buf3

mov ah,10

int 21h

lea dx,note4

mov ah,9

int 21h

invoke scanf,addr buf2, base

mov bx,ax

invoke scanf,addr buf1, base

mov base,al

lea si,buf3

mov cl,byte ptr 2[si]

sub cl,'-'

mov flag,cl

invoke scanf,addr buf3,base

invoke print,addr buf4

mov cl,flag

cmp cl,0

je L1

L2: lea dx,buf4

mov ah,9

int 21h

jmp exit

L1: mov dl,'-'

mov ah,2

int 21h

jmp L2

exit: mov ax, 4c00h

int 21h

END START

.MODEL SMALL,STDCALL

.386

;

.CODE CODE1

;

scanf proc far USES BX CX DX si ,BUF:word, BASE: BYTE mov si,buf

xor ax, ax

xor bx,bx

mov bl,base

xor cx,cx

add si,2

mov cl,[si]

cmp cl,'-'

je scan1

jne scan2

scan1:inc si

mov cl,[si]

scan2:cmp cx,0dh

je scan6

cmp cx,40h

jbe scan3

jmp scan4

scan3:sub cx,30h

jmp scan5

scan4:sub cx,37h

scan5:imul bx

add ax,cx

jmp scan1

scan6: ret

scanf endp

end

.MODEL SMALL, STDCALL

.386

.CODE CODE2

;

print proc far USES CX DX di BP, BUF: word mov di,buf

xor cx,cx

lop1:xor dx,dx

idiv bx

push dx

inc cx

cmp ax,0

jnz lop1

lop2:pop ax

cmp al,10

jb L1

add al,7

L1: add al,30h

mov [di],al

inc di

loop lop2

mov byte ptr [di],'$'

ret

print endp

END

3.3.2实验结果

3.4任务四

安装MASM32软件包。试着编译、连接课本中的程序例6.9(《汇编语言程序设计》,p267),阅读该程序,熟悉基于窗口的windows程序的组成

3.4.1源程序代码

.386

.MODEL FLAT, STDCALL

OPTION CASEMAP: NONE

WinMain PROTO :DWORD, :DWORD, :DWORD, :DWORD

WinProc PROTO :DWORD, :DWORD, :DWORD, :DWORD

Convert PROTO :BYTE, :DWORD

INCLUDE WINDOWS.INC

INCLUDE GDI32.INC

INCLUDE USER32.INC

INCLUDE KERNEL32.INC

INCLUDELIB GDI32.LIB

INCLUDELIB USER32.LIB

INCLUDELIB KERNEL32.LIB

.DA TA

ClassName DB "TryWinClass", 0

AppName DB "Our First Window", 0

hInstance DD 0

CommandLine DD 0

OurText DB "These words are printed in the windows!"

num1 = $ - OurText

OurStr DB "The ASCII of char '?' is: ", 20H

szASCII DB "00H", 20H, 20H

num2 = $ - OurStr

.CODE

START:

INVOKE GetModuleHandle, NULL

MOV hInstance, EAX

INVOKE GetCommandLine

MOV CommandLine,EAX

INVOKE WinMain, hInstance, NULL, CommandLine, SW_SHOWDEFAULT

INVOKE ExitProcess, EAX

WinMain PROC hInst: DWORD, hPrevInst: DWORD, CmdLine: DWORD, CmdShow: DWORD

LOCAL wc : WNDCLASSEX

LOCAL msg : MSG

LOCAL hwnd : HWND

MOV wc.cbSize, SIZEOF WNDCLASSEX

MOV wc.style, CS_HREDRAW or CS_VREDRAW

MOV wc.lpfnWndProc, OFFSET WndProc

MOV wc.cbClsExtra, NULL

MOV wc.cbWndExtra, NULL

PUSH hInst

POP wc.hInstance

MOV wc.hbrBackground, COLOR_WINDOW + 1

MOV wc.lpszMenuName, NULL

MOV wc.lpszClassName, OFFSET ClassName

INVOKE LoadIcon, NULL, IDI_APPLICATION

MOV wc.hIcon, EAX

MOV wc.hIconSm, 0

INVOKE LoadCursor, NULL, IDC_ARROW

MOV wc.hCursor, EAX

INVOKE RegisterClassEx, ADDR wc

INVOKE CreateWindowEx, NULL, ADDR ClassName,

ADDR AppName,

WS_OVERLAPPEDWINDOW + WS_VISIBLE,

CW_USEDEFAULT, CW_USEDEFAULT,

CW_USEDEFAULT, CW_USEDEFAULT,

NULL, NULL,

hInst, NULL

MOV hwnd, EAX

StartLoop:

INVOKE GetMessage, ADDR msg, NULL, 0, 0

CMP EAX, 0

JE ExitLoop

INVOKE TranslateMessage, ADDR msg

INVOKE DispatchMessage, ADDR msg

JMP StartLoop

ExitLoop:

MOV EAX, msg.wParam

RET

WinMain ENDP

WndProc PROC hWnd: DWORD, uMsg: DWORD, wParam: DWORD, lParam: DWORD LOCAL hdc: HDC

.IF uMsg == WM_DESTROY

INVOKE PostQuitMessage, NULL

.ELSEIF uMsg == WM_CHAR

INVOKE GetDC, hWnd

MOV hdc, EAX

MOV EAX, wParam

MOV szASCII - 8, AL

INVOKE Convert, AL, ADDR szASCII

INVOKE TextOut, hdc, 10, 15, ADDR OurText, num1

INVOKE TextOut, hdc, 40, 40, ADDR OurStr, num2 .ELSE

INVOKE DefWindowProc, hWnd, uMsg, wParam, lParam

RET

.ENDIF

XOR EAX, EAX

RET

WndProc ENDP

Convert PROC bChar: BYTE, lpStr: DWORD

MOV AL, bChar

MOV ESI, lpStr

SHR AL, 4

CMP AL, 10

JB L1

ADD AL, 7

L1: ADD AL, 30H

MOV [ESI], AL

MOV AL, bChar

AND AL, 0FH

CMP AL, 10

JB L2

ADD AL, 7

L2: ADD AL, 30H

MOV [ESI + 1], AL

RET

Convert ENDP

END START

3.4.2实验结果

4.实验体会

通过此次试验回顾了汇编语言编译器的基本操作、利用编译器观察在程序执行过程中的变化以及汇编程序的子程序的编写和调用等等一些知识。这次试验使我更好的掌握的汇编语言的相关知识。同时也使我清晰的认识到在汇编语言的学习及使用中存在的一些问题。对于汇编这种相对于C语言更加贴近于物理层的程序语言,在编写的过程中,首先需要能够对所需要完成的任务又一个清晰的认识,然后用C语言来表示,之后将C语言中的操作转换为汇编语言中操作的组合,这也是由于汇编语言自身的性质所决定的。由于汇编语言只能进行很简单的物理层操作,所有通过对高级语言中步骤的合理分解能够很好的完成所需要完成的任务。汇编的学习使我觉得要掌握这门语言最重要的是需要清晰的认识到在每一个操作所对应的物理层的变化是什么。只有在清楚的了解了物理层的变化才能很好的掌握这门语言。

单片机 实验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 窗口,就建议不用打开它。因为保持它的打开会增加仿真时通讯的时间,特别是单步运行的时间。

中断原理应用程序设计

第六章中断原理应用程序设计 6.1 中断系统的基本概念 CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理(中断发生);CPU暂时中断当前的工作,转去处理事件B(中断响应和中断服务);待CPU将事件B处理完毕后,再回到原来事件A被中断的地方继续处理事件A(中断返回),这一过程称为中断。 中断源 引起CPU中断的根源,称为中断源。中断源向CPU提出的中断请求。CPU暂时中断原来的事务A,转去处理事件B。对事件B处理完毕后,再回到原来被中断的地方(即断点),称为中断返回。实现上述中断功能的部件称为中断系统(中断机构)。 MCS-51单片机提供了5个中断源,其中两个为外部中断请求源(P3.2)和(P3.3),两个片内定时器/计数器T0和T1的溢出请求中断源TF0(TCON的第5位)和TF1(TCON的第7位),1个片内串口发送或接收中断请求源TI(SCON的第1位)和RI(SCON的第0位)。 中断优先级 同一优先级中的中断申请不止一个时,则有中断优先权排队问题。同一优先级的中断优先权排队,由中断系统硬件确定的自然优先级形成,其排列如所示: 表6-4 MCS-51单片机中断源的自然优先级及入口地址

需要说明的是,为了便于用C语言编写单片机中断程序,C51编译器也支持51单片机的中断服务程序,而且用C语言编写中断服务程序,比用汇编语言方便的多。C语言编写中断服务函数的格式如下: 函数类型函数名(形式参数列表)[interrupt n] [using m] 其中,interrupt后面的n是中断编号,取值范围0~4,;using中的m表示使用的工作寄存器组号(如不声明,则默认用第0组)。 例如,定时器T0的中断函数可用如下方法编写: void Timer(void) interrupt 1 using 0 //定时器T0的中断服务函数,T0的中断编号为1,使用第0组工作寄存器 { ........//中断服务程序 } 6.2 中断系统的控制 定时器/计数器控制寄存器TCON TCON的功能是接收外部中断源(、)和定时器(T0、T1)送来的中断请求信号。字节地址为88H,可以进行位操作。表5-5列出了TCON的格式。 8FH 8EH 8DH 8CH 8BH 8AH 89H 88H TF1 TR1 TF0 TR0 IT0 IT1 IE0 IT0 表6-5 定时器/计数器控制寄存器TCON的格式

汇编语言中断程序设计

汇编语言程序设计实验报告 学院:计算机科学与技术专业:计算机科学与技术班级:计科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

单片机原理与应用及C51程序设计(第三版)(1、2、3、4、7章课后习题答案)

第一章: 1. 给出下列有符号数的原码、反码和补码(假设计算机字长为8位)。 +45 -89 -6 +112 答:【+45】原=00101101,【+45】反=00101101,【+45】补=00101101 【-89】原=11011001,【-89】反=10100110,【-89】补=10100111 【-6】原=10000110,【-6】反=11111001,【-6】补=11111010 【+112】原=01110000,【+112】反=01110000,【+112】补=01110000 2. 指明下列字符在计算机内部的表示形式。 AsENdfJFmdsv120 答:41H 73H 45H 4EH 64H 66H 4AH 46H 6DH 64H 73H 76H 31H 32H 30H 3.何谓微型计算机硬件?它由哪几部分组成?并简述各部分的作用。 答:微型计算机硬件由中央处理器、存储器、输入/输出设备和系统总线等组成,中央处理器由运算器和控制器组成,是微型计算机运算和控制中心。存储器是用来存放程序和数据的记忆装置。输人设备是向计算机输人原始数据和程序的装置。输出设备是计算机向外界输出信息的装置。I/O接口电路是外部设备和微型机之间传送信息的部件。总线是连接多个设备或功能部件的一簇公共信号线,它是计算机各组成部件之间信息交换的通道。微型计算机的各大功能部件通过总线相连。 4.简述8086CPU的内部结构。 答:8086微处理器的内部分为两个部分:执行单元(EU)和总线接口单元(BIU)。执行部件由运算器(ALU)、通用寄存器、标志寄存器和EU控制系统等组成。EU从BIU的指令队列中获得指令,然后执行该指令,完成指今所规定的操作。总线接口部件BIU由段寄存器、指令指针寄存器、地址形成逻辑、总线控制逻辑和指令队列等组成。总线接口部件负责从内部存储器的指定区域中取出指令送到指令队列中去排队。 5.何谓总线?总线按功能可分为哪几种? 答:总线是连接多个设备或功能部件的一簇公共信号线,它是计算机各组成部件之间信息交换的通道。总线功能来划分又可分为地址总线(Address Bus)、数据总线(Date Bus)和控制总线(Control Bus)三类。 6.内部存储器由哪几部分组成? 答:包括随机存储器(RAM)和只读存储器(ROM)。 7.简述8086中的存储器管理? 答:8086把1M空间分成若干块(称为“逻辑段”),各个逻辑段之间可在实际存储空间中完全分开,也可以部分重叠,甚至可以完全重叠。每个逻辑段容量不超过64K字节,这样就可用16位寄存器提供地址访问。一个存储单元的地址可由段基址和偏移地址组成,这个地址我们称为逻辑地址,一般表示为“段基址:偏移地址”。而1M存储空间中的20位地址称为物理地址。逻辑地址是程序中使用的地址,物理地址是访问存储器的实际地址。 物理地址=段基址×16 + 段内偏移地址 8.什么是接口电路?接口电路有何功能? 答:I/O接口电路是外部设备和微型机之间传送信息的部件。接口电路主要功能。(1) 数据的寄存和缓冲功能。(2) 信号转换功能。(3) 设备选择功能。(4) 外设的控制和监测功能。(5) 中断或DMA管理功能。(6) 可编程功能。 9.外部设备与CPU之间的数据传送方式常见有几种?各有什么特点? 答:外部设备与微机之间的信息传送传送方式一般有无条件传送方式、查询传送方式、中断控制方式等。无条件传送方式是指CPU直接和外部设备之间进行数据传送。查询传送方式又称为条件传送方式,是指CPU通过查询I/O设备的状态决定是否进行数据传输的方式。中断是一种使CPU暂停正在执行的程序而转去处理特殊事件的操作。即当外设的输入数据准备好,或输出设备可以接收数据时,便主动向CPU发出中断请求,CPU可中断正在执行的程序,转去执行为外设服务的操作,服务完毕,CPU再继续执行原来的程序。 10.什么是单片机? 答:单片机是把微型计算机中的微处理器、存储器、I/O接口、定时器/计数器、串行接口、中断系统等电路集成到一个集成电路芯片上形成的微型计算机。因而被称为单片微型计算机,简称为单片机。 11.和一般微型计算机相比,单片机有何特点? 答:主要特点如下: 1) 在存储器结构上,单片机的存储器采用哈佛(Harvard)结构 2) 在芯片引脚上,大部分采用分时复用技术 3) 在内部资源访问上,采用特殊功能寄存器(SFR)的形式

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

北京建筑大学 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。

单片机_C语言函数_中断函数(中断服务程序)

单片机_C语言函数_中断函数(中断服务程序) 在开始写中断函数之前,我们来一起回顾一下,单片机的中断系统。 中断的意思(学习过微机原理与接口技术的同学,没学过单片机,也应该知道),我们在这里就不讲了,首先来回忆下中断系统涉及到哪些问题。 (1)中断源:中断请求信号的来源。(8051有3个内部中断源T0,T1,串行口,2个外部中断源INT0,INT1(这两个低电平有效,上面的那个横杠不知道怎么加上去))(2)中断响应与返回:CPU采集到中断请求信号,怎样转向特定的中断服务子程序,并在执行完之后返回被中断程序继续执行。期间涉及到CPU响应中断的条件,现场保护,现场恢复。 (3)优先级控制:中断优先级的控制就形成了中断嵌套(8051允许有两级的中断嵌套,优先权顺序为INT0,T0,INT1,T1,串行口),同一个优先级的中断,还存在优先权的高低。优先级是可以编程的,而优先权是固定的。 80C51的原则是①同优先级,先响应高优先权②低优先级能被高优先级中断③正在进行的中断不能被同一级的中断请求或低优先级的中断请求中断。 80C51的中断系统涉及到的中断控制有中断请求,中断允许,中断优先级控制 (1)3个内部中断源T0,T1,串行口,2个外部中断源INT0,INT1 (2)中断控制寄存器:定时和外中断控制寄存器TCON(包括T0、T1,INT0、INT1),串行控制寄存器SCON,中断允许寄存器IE,中断优先级寄存器IP 具体的是什么,包括哪些标志位,在这里不讲了,所有书上面都会讲。 在这里我们讲下注意的事项 (1)CPU响应中断后,TF0(T0中断标志位)和TF1由硬件自动清0。 (2)CPU响应中断后,在边沿触发方式下,IE0(外部中断INT0请求标志位)和IE1由硬件自动清零;在电平触发方式下,不能自动清楚IE0和IE1。所以在中断返回前必须撤出INT0和INT1引脚的低电平,否则就会出现一次中断被CPU多次响应。 (3)串口中断中,CPU响应中断后,TI(串行口发送中断请求标志位)和RI(接收中断请求标志位)必须由软件清零。 (4)单片机复位后,TCON,SCON给位清零。 C51语言允许用户自己写中断服务子程序(中断函数) 首先来了解程序的格式: void 函数名() interrupt m [using n] {} 关键字 interrupt m [using n] 表示这是一个中断函数 m为中断源的编号,有五个中断源,取值为0,1,2,3,4,中断编号会告诉编译器中断程序的入口地址,执行该程序时,这个地址会传个程序计数器PC,于是CPU开始从这里一条一条的执行程序指令。 n为单片机工作寄存器组(又称通用寄存器组)编号,共四组,取值为0,1,2,3 中断号中断源 0 外部中断0 1 定时器0 2 外部中断1 3 定时器1中断 4 串行口中断 (在上一篇文章中讲到的ROM前43个存储单元就是他们,这5个中断源的中断入口地址为: 这40个地址用来存放中断处理程序的地址单元,每一个类中断的存储单元只有8B,显然不

中断服务程序流程图

第一讲: 第六章I/O接口原理-接口、端口、编址 回顾:微机系统的层次结构,CPU、主机、接口电路及外部设备之间的结构关联,输入/输出的一般概念。 重点和纲要:微机系统主机与外部设备之间的数据传送,包括I/O端口的寻址方式,输入/输出的传送控制方式。 讲授内容: 6. 1 输入/输出数据的传输控制方式 一、输入/输出的一般概念 1.引言 输入/输出是微机系统与外部设备进行信息交换的过程。输入/输出设备称为外部设备,与存储器相比,外部设备有其本身的特点,存储器较为标准,而外部设备则比较复杂,性能的离散性比较大,不同的外部设备,其结构方式不同,有机械式、电动式、电子式等;输入/输出的信号类型也不相同,有数字信号,也有模拟信号;有电信号,也有非电信号;输入/输出信息的速率也相差很大。因此,CPU与外部设备之间的信息交换技术比较复杂。 CPU与外设之间的信息交换,是通过它们之间接口电路中的I/O端口来进行的,由于同一个外部设备与CPU之间所要传送的信息类型不同,方向不同,作用也不一样(例如数据信息、状态信息、控制信息、输入/输出等),所以接口电路中可以设置多个端口来分别处理这些不同的信息。 2.输入/输出端口的寻址方式 微机系统采用总线结构形式,即通过一组总线来连接组成系统的各个功能部件(包括CPU、内存、I/O端口),CPU、内存、I/O端口之间的信息交换都是通过总线来进行的,如何区分不同的内存单元和I/O端口,是输入/输出寻址方式所要讨论解决的问题。

根据微机系统的不同,输入/输出的寻址方式通常有两种形式:(1).存储器对应的输入、输出寻址方式 这种方式又称为存储器统一编址寻址方式或存储器映象寻址方式。 方法:把外设的一个端口与存储器的一个单元作同等对待,每一个I/O端口都有一个确定的端口地址,CPU与I/O端口之间的信息交换,与存储单元的读写过程一样,内存单元与I/O端口的不同,只在于它们具有不同的的地址。优点: ①CPU对I/O端口的读/写操作可以使用全部存储器的读/写操作指令,也可 以用对存储器的不同寻址方式来对I/O端口中的信息,直接进行算术、逻辑运算及循环、移位等操作。 ②内存与外设地址的分配,可以用统一的分布图。 ③不需要专门的输入、输出操作指令。 缺点: ①内存与I/O端口统一编址时,在地址总线根数一定的情况下,使系统中 实际可以直 接寻址的内存单元数减少。 ②一般情况下,系统中I/O端口数远小于内存单元数,所以在用直接寻址方 式来寻址这些端口时,要表示一个端口地址,必须用与表示内存单元地址相同的字节数,使得指令代码较长,相应地读/写执行时间也较长,这对提高系统的运行速度是不利的。 Mortorola公司的M6800CPU等均采用这种寻址I/O端口的方式。 3. CPU与外设之间所传送的信息类型 CPU与I/O端口之间所交换的信息,可以有下列几种类型: ①数据信息:包括数字量、模拟量、开关量等,可以输入、也可以输出 ②状态信息:这是I/O端口送给CPU的有关本端口所对应的外设当前状态 的信息。供CPU进行分析、判断、决策。 ③控制信息:这是CPU送给I/O端口的控制命令,使相应的外部设备完成 特定的操作。 数据信息、状态信息和控制信息是不同类型的信息,它们所起的作用也不一样。但在8086/8088微机系统中,这三种不同类型的信息的输入、输出过程是相同的。为了加以区分,可以使它们具有不同的端口地址,在端口地址相同的情况下,可以规定操作的顺序,或者在输入/输出的数据中设置特征位。

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

软件中断、硬件中断、外部中断、内部中断 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返回到引起故障的程序继续执行时,刚才引起故障的指令可重新得到执行。这种重新执行,不需要操作系统软件的额外参与。故障的发现可能在指令开始执行之前,也可能在指令执行期间。如果在指令执行期间检测到故障,那么中止故障指令,并把指令的操作数恢复为指令开始执行之前的值。这可保证故障指令的重新执行得到正确的结果。例如,在一条指令的执行期间,如果发现段不存在,那么停止该指令的执行,并通知系统产生段故障,对应的段故障处理程序可通过加载该段的方法来排除故障,之后,原指令就可成功执行,至少不再发生段不存在的故障。

51单片机中断系统编程

51单片机中断系统编程 51单片机中断系统编程 上传的图片 抱歉,您所在的组无权下载附件,请注册或登陆中断是指如下过程(如下图所示):CPU 与外设同时工作,CPU执行主程序,外设做准备工作。当外设准备好时向CPU发中断请求信 号,若条件满足,则CPU终止主程序的执行,转去执行中断服务程序。在中断服务程序中 CPU与外设交换信息,待中断服务程序执行完后,CPU再返回刚才终止的主程序继续执行。 5.3.1 中断系统 MCS-51单片机提供了5个固定的可屏蔽中断源,3个在片内,2个在片外,它们在程序存储 器中各有固定的中断入口地址,由此进入中断服务程序。5个中断源的符号、名称及产生 的条件如下。 ? INT0:外部中断0,由P3.2端口线引入,低电平或下跳沿引起。 ? INT1:外部中断1,由P3.3端口线引入,低电平或下跳沿引起。 ? T0:定时器/计数器0中断,由T0计数溢出引起。 ? T1:定时器/计数器l中断,由T1计数溢出引起。 ? TI/RI:串行I/O中断,串行端口完成一帧字符发送/接收后引起。 中断源有两级中断优先级,可形成中断嵌套。两个特殊功能寄存器用于中断控制和条件设 置。整个中断系统的结构框图如图所示。 上传的图片 抱歉,您所在的组无权下载附件,请注册或登陆 中断系统结构框图 2 中断系统的控制寄存器 中断系统有两个控制寄存器(IE和IP),它们分别用来设定各个中断源的打开/关闭和中

断优先级。此外,在TCON中另有4位用于选择引起外部中断的条件并作为标志位。 (1)中断允许寄存器IE IE在特殊功能寄存器中,字节地址为A8H,位地址(由低位到高位)分别是A8H-AFH。IE 用 来打开或关断各中断源的中断请求,基本格式如下: 上传的图片 抱歉,您所在的组无权下载附件,请注册或登陆 ? EA:全局中断允许位。EA=0,禁止一切中断;EA=1,打开全局中断控制,此时,由各 个中断控制位确定相应中断的打开或关闭。 ? ×:无效位。 ? ES:串行I/O中断允许位。ES=1,允许串行I/O中断;ES=0,禁止串行I/O中断。 ? ETl;定时器/计数器T1中断允许位。ETl=1,允许T1中断;ETl=0,禁止T1中断。 ? EXl:外部中断l中断允许位。EXl=1,允许外部中断1中断;EXl=0,禁止外部中断1中 断。 ? ET0:定时器/计数器T0中断允许位。ET0=1,允许T0中断;ET0=0,禁止TO中断。 ? EX0:外部中断0中断允许位。EX0=1,允许外部中断0中断;EX0=0,禁止外部中断0中 断。 (2)中断优先级寄存器IP IP在特殊功能寄存器中,字节地址为B8H,位地址(由低位到高位)分别是B8H一BFH。 MCS-51单片机的中断分为两个优先级,IP用来设定各个中断源属于两级中断中的哪一级, 其基本格式如下: 上传的图片

操作系统实验一中断处理

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

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的屏障并且执行简单的内存保护。它使用选择器、描述器和描述器表控制访问指定内存的位置和段。描述器表包括全局描述器表、局部描述器表、中断描

单片机简答+编程复习题

单片机简答复习题 1.MCS51的中断系统有几个中断源?几个中断优先级?中断优先级是如何控制的?在出现同级中断申请时,CPU按什么顺序响应(按由高级到低级的顺序写出各个中断源)?各个中断源的入口地址是多少? 答:MCS51单片机有5个中断源,2个中断优先级,中断优先级由特殊功能寄存器IP控制,在出现同级中断申请时,CPU按如下顺序响应各个中断源的请求:INT0、T0、INT1、T1、串口,各个中断源的入口地址分别是0003H、000BH、0013H、001BH、0023H。 2.已知单片机系统晶振频率为6MHz,若要求定时值为10ms时,定时器T0工作在方式1时,定时器T0对应的初值是多少?TMOD的值是多少?TH0=?TL0=?(写出步骤) 答:定时值为10ms时,定时器T0工作在方式1时,定时器T0对应的初值是1388H TMOD的值是00000001B,TH0=13H;TL0=88H。 3.MCS51系列单片机的内部资源有哪些?说出8031、8051和8751的区别。 答:MCS51系列单片机上有1个8位CPU、128B的RAM、21个SFR、4个并行口、1个串行口、2个定时计数器和中断系统等资源。8031、8051和8751的区别是8031内无ROM;8051内有4KB的掩膜ROM;8751内有4KB的EPROM。 4.如何正确使用P3口? (1)说明P3口有第一功能和第二功能的使用。 (2)P3口的第二功能各位线的含义。 (3)使用时应先按需要选用第二功能信号,剩下的口线才作第一功能I/O线用。 (4)读引脚数据时,必需先给锁存器输出“1”。 5.简述累加器的ACC的作用。 (1)8位专用寄存器。 (2)运算时存放一个操作数。 (3)运算后存放运算结果,所以称它为累加器。 6.简述寄存器间接寻址方式及其寻址范围。 (1)寄存器中存放的是操作数的地址,操作数是通过寄存器间接得到,这种寻址方式称为寄存器间接寻址方式。 (2)寻址范围: ①内部RAM低128单位,形式@Ri(i=0,1)。 ②外部RAM64K使用DPTR作间址寄存器,形式为@DPTR。 7.简述MCS-51单片机的中断入口地址。 中断入口地址为中断响应后PC的内容即中断服务的入口地址。 它们是:外部中断0 0003H 定时器T0中断 000BH 外部中断1 0013H 定时器T1中断 001BH 串行口中断 0023H 8.简述串行数据传送的特点。 (1)传送按位顺序进行,速度慢。 (2)传输线少,成本低。 (3)传送距离远,可达几公尺到几千公里。 9.51系列单片机具有几个中断源,分别是如何定义的?其中哪些中断源可以被定义为高优先级中断,如何定义? 答:具有5个中断源,分别是外部中断INT0和外部中断INT1、定时器溢出中断0和定时器溢出中断1以及串行中断。通过对中断优先级寄存器IP的设置,每个中断源都可以被定义为高优先级中断。

有关51单片机中断的形式和C语言编程格式

有关51单片机中断的形式和C语言编程格式 void INT0()interrupt 0 using 1 {.... ..... } interrupt 0 指明是外部中断0; interrupt 1 指明是定时器中断0; interrupt 2 指明是外部中断1; interrupt 3 指明是定时器中断1; interrupt 4 指明是串行口中断; using 0 是第0组寄存器; using 1 是第1组寄存器; using 2 是第2组寄存器; using 3 是第3组寄存器; 例如: /*------------------------------------------------ 外部中断程序 ------------------------------------------------*/ void ISR_Key(void) interrupt 0 using 1

{ P1=~P1; //s3按下触发一次,P1取反一次 } /*------------------------------------------------ 串口中断程序 ------------------------------------------------*/ void UART_SER (void) interrupt 4 //串行中断服务程序 { unsigned char Temp; //定义临时变量 if(RI) //判断是接收中断产生 { RI=0; //标志位清零 Temp=SBUF; //读入缓冲区的值 P1=Temp; //把值输出到P1口,用于观察 SBUF=Temp; //把接收到的值再发回电脑端} if(TI) //如果是发送标志位,清零 TI=0; }

相关主题
文本预览
相关文档 最新文档