文章目录
前言
本文主要学习C语言的中断,讲解中断的的本质和作用,并附上代码示例。文章内容来源网络,仅用于个人学习总结使用,侵权及删。
一、中断是什么?
中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行。
举一个例子更好理解,当你正在干饭时,听到门铃响,去开门然后返回继续干饭。其中“干饭”是程序当前执行指令,“门铃响”是中断请求,“去开门”是中断响应服务函数,“返回继续干饭”是中断返回。
二、中断的作用
现代计算机中采用中断系统的主要目的是 :
- 提高计算机系统效率。计算机系统中处理机的工作速度远高于外围设备的工作速度。通过中断可以协调它们之间的工作。当外围设备需要与处理机交换信息时,由外围设备向处理机发出中断请求,处理机及时响应并作相应处理。不交换信息时,处理机和外围设备处于各自独立的并行工作状态。
- 维持系统可靠正常工作。现代计算机中,程序员不能直接干预和操纵机器,必须通过中断系统向操作系统发出请求,由操作系统来实现人为干预。主存储器中往往有多道程序和各自的存储空间。在程序运行过程中,如出现越界访问,有可能引起程序混乱或相互破坏信息。为避免这类事件的发生,由存储管理部件进行监测,一旦发生越界访问,向处理机发出中断请求,处理机立即采取保护措施。
- 满足实时处理要求。在实时系统中,各种监测和控制装置随机地向处理机发出中断请求,处理机随时响应并进行处理。
- 提供故障现场处理手段。处理机中设有各种故障检测和错误诊断的部件,一旦发现故障或错误,立即发出中断请求,进行故障现场记录和隔离,为进一步处理提供必要的依据。
三、中断处理过程
中断处理的基本过程包括中断请求、中断判优、中断响应、中断服务 和中断返回等五个阶段。
按照事件发生的顺序,中断过程包括 :
- 中断源发出中断请求;
- 判断当前处理机是否允许中断和该中断源是否被屏蔽;
- 优先权排队;
- 处理机执行完当前指令或当前指令无法执行完,则立即停止当前程序,保护断点地址和处理机当前状态,转入相应的中断服务程序;
- 执行中断服务程序;
- 恢复被保护的状态,执行“中断返回”指令回到被中断的程序或转入其他程序。
上述过程中前四项操作是由硬件完成的,后两项是由软件完成的。
3.1.中断请求
- 发生在CPU内部的中断(内部中断),不需要中断请求,CPU内部的中断控制逻辑直接接收处理。
- 外部中断请求由中断源提出。外部中断源利用CPU的中断输入引脚 输入中断请求信号。一般CPU设有两个中断请求输入引脚:可屏蔽中断请求输入引脚和不可屏蔽中断请求输入引脚。
以89C51举例,其有六种中断请求源
中断请求源 | 标志位 |
---|---|
外部中断0,INT0引脚输入 | IE0 |
外部中断1,INT1引脚输入 | IE1 |
定时器/计时器T0 | TF0 |
定时器/计时器T1 | TF1 |
串行口 | 寄存器SCON的发送中断TI和接收中断TF |
定时器/计时器T2 | 计数溢出TF2和捕捉EXF2 |
3.1.1中断请求触发器
每个中断源发中断请求信号的时间是不确定的,而CPU在何时响应中断也 是不确定的。所以,每个中断源都有一个中断请求触发器,锁存自己的中断请求信号,并保持到CPU响应这个中断请求之后才将其清除。
3.1.2中断允许触发器
在CPU内部有一个中断允许触发器,当其为“1”时,允许CPU响应中断, 称为开中断。若其为“0”,不允许CPU响应中断,中断被屏蔽,称为关中断。
- 通常,当CPU复位时,中断允许触发器也复位为“0”,即关中断。当 CPU中断响应时,CPU自动关闭中断,禁止接受另一个新的中断。
- 中断允许触发器的状态可以用开中断或关中断指令来设置。
3.2.中断优先级
CPU一次只能接受一个中断源的请求,当多个中断源同时向CPU提出中断请求时,CPU必须找出中断优先级最高的中断源,处理器只响应其中优先权最高的中断源,这一过程称为中断判优。
当处理机正在运行某个中断服务程序期间出现另一个中断源的请求时,如果后者的优先权低于前者,处理机不予理睬,反之,处理机立即响应后者,进入所谓的“嵌套中断”。中断优先权的排序按其性质、重要性以及处理的方便性决定,由硬件的优先权仲裁逻辑或软件的顺序询问程序来实现 。
中断判优可以采用硬件方法,也可采用软件方法。
3.2.1软件判优
CPU检测到中断请求后,首先读取中断请求寄存器的内容,逐位检测它们的状态,检测到某一位为1,就确定对应的中断源有中断请求,转去执行它的中断服务程序。
先检测哪一个,哪一个的优先级就高,后检测哪一个,哪一个优先级就低,检测的顺序就是各中断源的优先级顺序。
软件判优耗时较长。如果中断源很多,中断的实时性就很差,但是软件判优优先权安排灵活。
3.2.2硬件判优
利用专门的硬件电路确定中断源的优先级,有两种常见的方式:菊花链判优电路和中断控制器判优。
详细内容后续展开说明。
3.3.中断响应
经过中断判优,中断处理就进入中断响应阶段。中断响应时,CPU向中断源发出中断响应信号,同时:
- 保护硬件现场;
- 关中断;
- 保护断点;
- 获得中断服务程序的入口地址。
3.4.中断服务阶段
中断服务程序的一般结构为:
- 保护现场。 在中断服务程序的起始部分安排若干条入栈指令,将各寄存器的内容压入堆栈保存。
- 开中断。 在中断服务程序执行期间允许级别更高的中断请求中断现 行的中断服务程序,实现中断嵌套。
- 中断服务。 完成中断源的具体要求。
- 恢复现场。 中断服务程序结束前,必须恢复主程序的中断现场。通常是将保存在堆栈中的现场信息弹出到原来的寄存器中。
- 中断返回。 返回到原程序的断点处,继续执行原程序。
3.5.中断返回
返回到原程序的断点处,恢复硬件现场,继续执行原程序。
中断返回操作是中断响应操作的逆过程。
四、中断的嵌套
中断嵌套俗称“加塞”是指中断系统正在执行一个中断服务时,有另一个优先级更高的中断提出中断请求,这时会暂时终止当前正在执行的级别较低的中断源的服务程序,去处理级别更高的中断源,待处理完毕,再返回到被中断了的中断服务程序继续执行的过程。
优先级高的中断源可以中断优先级低的中断服务程序,这就形成了中断服务程序中套着中断服务程序的情况,即形成了所谓的中断嵌套。
MCU暂停现行程序而转去响应中断请求的过程称为中断响应;为使系统能及时响应并处理发生的所有中断,系统根据引起中断事件的重要性和紧迫程序,硬件将中断源分为若干个级别,称作中断优先级。
4.1查询优先级
中断的优先级有两个:查询优先级和执行优先级。
查询优先级是datasheet或书上的默认(IP寄存器不做设置,上电复位后为00H)的优先级:
- 外部中断0> 定时/计数器0 > 外部中断1 > 定时/计数器1 > 串行中断
- int0,timer0,int1,timer1,serial port 或 INT0、T0、INT1、T1、UART
- PX0>PT0>PX1>PT1>PS>…
其实都是查询优级。首先查询优先级是不可以更改和设置的。这是一个中断优先权排队的问题,是指多个中断源同时产生中断信号时,中断仲裁器选择对哪个中断源优先处理的顺序。而这与是否发生中断服务程序的嵌套毫不相干。当CPU查询各个中断标志位的时候,会依照上述5个查询优先级顺序依次查询,当数个中断同时请求的时候,会优先查询到高优查询先级的中断标志位,但并不代表高查询优先级的中断可以打断已经并且正在执行的低查询优先级的中断服务。
例如:当计数器0中断和外部中断1(按查询优先级,计数器0中断>外部中断1)同时到达时,会进入计时器0的中断服务函数;但是在外部中断1的中断服务函数正在服务的情况下,这时候任何中断都是打断不了它的,包括逻辑优先级比它高的外部中断0计数器0中断。
4.2执行优先级
中断的执行优先级就是你对IP寄存器的设置了。在2个优先级的情况下,某位为1,则相应的中断源为高优先级;为0,则为低优先级。
关于中断的优先级有三条原则:
- CPU同时接收到几个中断时,首先响应优先级最高的中断请求;
- 正在进行的中断过程不能被新的同级或低优先级的中断请求所中断;
- 正在进行的低优先级中断服务,能被高优先级中断请求中断;
若:同一执行优先级中的中断申请不止一个时,则有一个中断优先权排队问题。同一执行优先级中断的排队,由中断系统硬件确定的自然优先级形成,优先权自高到低的顺序即:
外部中断0>定时/计数0>外部中断1>定时/计数1>串行接口
例如:设置IP =0x10,即设置串口中断为最高优先级,则串口中断可以打断任何其他的中断服务函数实现嵌套,且只有串口中断能打断其他中断的服务函数。若串口中断没有触发,则其他几个中断之间还是保持逻辑优先级,相互之间无法嵌套。
五、中断的约束
中断处理是由内核执行的最敏感的任务之一,因为它必须满足下列约束:
1)中断应该被尽可能快地处理完。
2)中断处理程序必须编成使相应的内核控制路径能以嵌套的方式执行。
3)内核在处理一个中断时,可接受新的中断。但存在一个临界区,中断必须被禁止。
出于1)和3)的约束,中断的设计一般将中断处理程序分为两部分执行(即上半部和下半部函数)。上半部为中断被禁止的临界区,执行关键而紧急的任务,如把接收到的帧拷贝到输入队列,以便下半部函数执行时能进行处理。
在这引申一个问题,当中断处理遇到要处理数据内容巨大如何解决
处理的数据内容巨大,也就是中断延迟过大,中断延时过长而降低中断响应速度
解决办法:
- 中断越少越好,中断频率越低越好,任务之间耦合度越低越好
- 设置优先级,保证重要的内容先执行
- 中断服务函数分上下部,生成临界区,保证执行关键而紧急的任务
- 尽量使用局部中断,不用全局开关中断
- 中断不要搞得太频繁,进出中断时间就给系统增加很大的负担
这里只是简单的回答一下,更详细内容将另起一文
四、中断的使用
以89C51举例
//外部中断
EA = 1; //总中断允许
EX0 = 1; //允许外部中断0中断
EX1 = 1; //允许外部中断1中断
IT0 = 1; //选择外部中断0为跳沿触发方式,置0为电平触发
IT1 = 1; //选择外部中断1为跳沿触发方式,置0为电平触发
PX0 = 0; //外部中断0为低优先级
PX1 = 1; //外部中断1为低优先级
//定时器T0中断
//定时时间 = (2^16 - X)* 12 / 晶振频率
//X为定时器计数初值,转16进制后装入TH0,TL0(例X=0xee00则TH0=0xee,TL0=0x00)
TMOD = 0x01; //定时器T0为方式1
TH0 = 0xee; //设置定时器的初值
TL0 = 0x00;
EA = 1; //总中断允许
ET0 = 1; //允许定时器T0中断
TR0 = 1; //启动定时器T0
总结
这里对文章进行总结:
- 中断系统是为了解决外界随机事件能及时响应并实时处理
- 中断处理基本过程中断请求、中断判优、中断响应、中断服务 和中断返回等五个阶段。
- 中断的优先级配置,决定中断延迟及中断嵌套的好坏
- 中断越少越好,中断频率越低越好,任务之间耦合度越低越好
以上就是今天的内容,本文简单介绍了中断及在89C51中的使用,在实践使用中还需要考虑很多因素。
参考资料
[ 1 ] CSDN博主「哦啦哦啦!」原文链接:https://blog.csdn.net/weixin_42240667/article/details/105071373
[ 2 ] CSDN博主「轮子学长」原文链接:https://blog.csdn.net/windeal3203/article/details/44588205
[ 3 ] 单片机原理及应用
[ 4 ] 《中国电力百科全书》编辑委员会.中国电力百科全书:中国电力出版社,2001