中断处理的流程包括哪些步骤

中断处理的流程包括哪些步骤,第1张

一个完整的中断处理过程应该包括:中断请求、中断排队或中断判优、中断响应、中断处理和中断返回等环节。

   1.中断请求 

中断请求是由中断源向CPU发出中断请求信号。外部设备发出中断请求信号要具备以下两个条件:

(1)外部设备的工作已经告一段落。例如输入设备只有在启动后,将要输入的数据送到接口电路的数据寄存器(即准备好要输入的数据)之后,才可以向CPU发出中断请求。   (2)系统允许该外设发出中断请求。如果系统不允许该外设发出中断请求,可以将这个外设的请求屏蔽。当这个外设中断请求被屏蔽,虽然这个外设准备工作已经完成,也不能发出中断请求。

2.中断排队 

中民申请是随机的,有时会出现多个中断源同时提出中断申请。但CPU每次只能响应一断源的请求,那么究竟先响应哪一个中断源的请求呢?这就必须根据各中断源工作性质的轻重缓急,预先安排一个优先级顺序,当多个中断源同时申请中断时,即按此优先级顺序进行排队,等候CPU处理。一般是把最紧迫和速度最高的设备排在最优先的位置上。CPU首先响应优先级别最高的中断源。当中断处理完毕,再响应级别低的中断申请。

中断排队可以采用硬件的方法,也可以采用软件的方法。前者速度快,但需要增加硬设备;后者无需增加硬设备,但速度慢,特别是中断源很多时尤为突出。

  软件优用查询技术:

当CPU响应中断后,就用软件查询以确定是哪些外设申请中断,并判断它们的优先权。当CPU响应中断后,把中断寄存器的状态作为一个外设读入CPU,逐位检测它们的状态,若哪一位为1,则该位对应的外设有中断请求,应转到相应的服务程序的入口。

结构很规矩,这个程序。

首先单片机上电复位,运行死循环前面的程序(,你这里就是init_timer(); // 应该叫初始化定时器,才合适,让定时器按照你需要的定时长度工作,或叫产生中断 )

接下来单片机主程序就是一直在死循环了。我们的主要任务一般在这里处理。

中断,就是在处理一些特殊任务,比如按键,或定时处理的程序,或外部一个不知道什么时间发生的任务,或通信任务等等。你在主循环的时候,无论在什么时候,中断请求来了(可以理解为需要处理比较紧急任务,优先处理的任务),就会暂停主循环,进入对应中断服务程序。运行完,在回主循环的暂停地方,继续执行死循环的任务。

定时器中断,就是每过一定时间,运行一下中断服务程序。常用来计时和产生脉冲信号。

初始化定时器,就是给定时器的寄存器,设置工作模式,时钟源,溢出的计数值。设置好了,定时器就能根据每个时钟源的频率,进行计数,直至溢出,然后产生一个中断请求。如果不饿能自动加载计数初值的定时器,在中断处理函数(服务函数)必须手动加载初值。

驻留程序

通俗点讲

就是

程序运行完了,

还要保留

临时数据

运行状态,

等下一次

调用时

继续

执行

和普通程序的

区别:

普通程序(如一个

子函数)

调用完了

临时数据

不需要了,

分配的

内存

空间

回收了,

驻留程序

要保留这些的

驻留

程序

主要

用于

中断函数

非中断函数

有应用,较少。分别举个例子:

1)用于

中断:

假设

一个

定时器

做的

时钟函数,定时器

设置为

1s一个中断。

main()

{

显示

时间

hour,min,sec;

//

循环

刷屏显示

}

中断函数

{

sec++;

if(sec>=60)

{

sec=0;

min++;

}

if(min>=60)

{

min=0;

hour++;

}

if(hour>=24)

{

hour=0;

}

}

这时候

就能看出,

中断程序

运行完的

时候

不能

3个

变量

清空,

因为

下次

中断

还要用到

上次的

值,

这个程序

一直

驻留

内存;

2)再来个

普通

函数的

假设

做了一个程序

,程序中

有一个

函数aa,而

函数

aa

我只能

让它执行

3次就得

关闭程序(这个

用在

密码

验证上)

aa()

{

密码验证次数n+1

返回n

验证结果

}

那这个

aa函数

密码

验证

阶段

就要

常驻

内存

嗯,我猜你问的是PC的,不是单片机

一、汇编语言的中断分以下几种:

1BIOS中断,这是固化到BIOS程序中的,每次开机BIOS会自动加载到指定内存

2186下的DOS中断,在DOS系统被加载后,系统会延用BIOS的中断向量,并向里面添加一些新的向量,这些功能便是DOS系统自带的中断服务程序

3286及以上的系统中断,PC会进入保护模式,在OS被加载后,中断由IDT控制,这一机制类似于中断向量表,只不过中断向量换成了选择子。这样的中断机制对不同型号的CPU有略微的差别,这里不细说了,我自己也没全弄明白。

二、中断实现的方式(8086下的普通中断)

听说过“优先级编码器”没?——如果同时有两个信号被接收,会指定某一个信号的优先级高,先执行它。中断就是类似的处理方法。

当CPU获取到某一高 *** 作优先级的信号时(比如时钟,每固定时间就会触发一次;比如键盘响应,用户希望通过Ctrl+C来退出任何正在执行的DOS程序),CPU会将当前正在执行的程序挂起来,转而去处理该信号(类似于Call,但略有不同,你看的书应该会讲到)。

处理中断时,系统会将其解释为一个标号,比如int 9h、int 21h等等。这个标号是一个序号,在内存某处存放着连续的一个表格,这个标号便是表格中的“行号”,只不过,每一行是两列,包括了该中断的处理程序的段基址和偏移量。中断向量表是从0000:0000开始的,每4字节为一个表项。中断标号x4就是对应的中断向量表项所存的地址,高地址是基地址,低地址是偏移。

这么说不知道你懂不懂。。。

反正总结一下你的问题吧,中断服务程序是加载到内存中的,它在加载前可能是存在BIOS芯片上,也可能是存在硬盘里的;中断向量表里只能写上中断处理程序的入口地址,要知道每个表项只有4字节;具体的中断服务程序,我不信你学汇编的书上不讲,我大概讲一下:CPU的INTR引脚获得了中断信号,得到了标号,比方说是5号,中断向量表项为0000:000A,读取这个内存,得到中断程序入口地址比方说是AAAA:BBBB,那么它会将当前的CS/IP、Flags寄存器入栈,然后转到AAAA:BBBB处去执行一直到iret指令返回原任务(或许该中断结束了这个任务,就不会返回了)。

至于保护模式的中断,相信你暂时还没遇到。到后面还有 *** 控8259A芯片来实现高级中断的,这个就不是一般需要学的了。

以上就是关于中断处理的流程包括哪些步骤全部的内容,包括:中断处理的流程包括哪些步骤、单片机中断程序、如何用c语言编写一个可中断的程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10171669.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-06
下一篇 2023-05-06

发表评论

登录后才能评论

评论列表(0条)

保存