中断服务子程序和普通子程序有什么区别

中断服务子程序和普通子程序有什么区别,第1张

中断程序强调中断,必需保存现场,而且中断程序和原运行程序没有联系,有时甚至毫不相关。

子程序强调包含,是包含在另一个程序里的,是个包含运行的过程。并且子程序和母程序(或者主程序)是有联系的,而且是密不可分的。

1子程序调用是预先安排好的,程序中断是随机发生的;

2调用子程序,是为主程序服务的,而中断程序与主程序的程序毫无关系;

3子程序是由调用指令给出目标地址,中断是通过隐指令获得中断服务程序的入口地址

中断服务程序 调用子程

序随机产生的 程序中事先安排好的

保护断点、保护现场 只保护断点

为外设服务和处理各种事件 为主程序服务

中断是单片机的一个重要功能,中断子程序专为执行中断功能,它是在发生中断后,自动执行的,不需要主程序调用;普通子函数要主程序调用才能执行。

汇编里的区别:

普通子函数用RET返回;中断子程序用RETI返回,RETI返回时要清除中断标志的;

普通子函数调用时直接进入函数入口地址,中断函数在中断发生时先进中断入口

03H、08H、13H、18H、23H后随即写一个跳转指令,再跳转到相应语句。

C语言区别:

普通子函数用的是C语言里的主函数调用子函数的方法,子函数可以有参数,有返回值;中断函数没有参数,没有返回值;

中断函数的写法也不一样,以80c51为例:

void

INT0()

interrupt

0

using

1

{

}

interrupt

0不是是外部中断0引发的中断,必须写;

using

1

表示在中断函数里用第一组寄存器R0-R7这个可以省略。

用CALL调用子程序和用中断调用子程序区别为:发生时间不同、关系不同、系统不同。

一、发生时间不同

1、用CALL调用子程序:在主程序的调用指令(CALL)执行时发生主程序调用子程序过程,调用指令所在位置是已知的和固定的。

2、用中断调用子程序:中断过程发生的时间一般是随机的,CPU在执行某一主程序时受到中断源提出的中断申请,就发生中断过程。

二、关系不同

1、用CALL调用子程序:子程序完全为主程序服务,两者属于主从关系。主程序需要子程序时就去调用子程序,并把调用结果带回主程序继续执行。

2、用中断调用子程序:中断服务程序与子程序二者一般是无关的,两者是平行关系。

三、系统不同

1、用CALL调用子程序:主程序调用子程序的过程完全属于软件处理过程,不需要专门的硬件电路。

2、用中断调用子程序:中断处理系统是一个软、硬件结合的系统,需要专门的硬件电路才能完成中断处理的过程。

你的外部中断应该是属于下降沿触发,当有一个下降沿到来时外部中断请求标志IE0或IE1(外部中断0或外部中断1请求中断标志,下面简称为IEx)就会置1,当进入中断程序后IEx由硬件归零。也就是说单片机当检测到IEx为1的时候就会进入到外部中断程序。

现在来分析一下为什么你的程序会执行两次中断。

当单片机外部中断引脚第一次接收到一个下降沿时,IEx被置1,进入中断程序,随即IEx被硬件清零。然而由于你用杜邦线接触P32口存在抖动(你感觉不到),外部中断引脚再次接受到一个下降沿,IEx又被置1,单片机又要响应中断,但此时由于上一个中断程序未执行完,单片机将等待外部中断程序执行完(你可以理解为有两个中断事件,但这两个事件优先级相同,所有按顺序响应)。在这个过程中,你的接触仍然会产生很多下降沿,但因为IEx只有响应了中断事件后才会清零,因此IEx一直为1。当第一次的中断程序执行结束后,单片机检测到IEx又是1,马上又再次进入中断。因为你的接触时间远远小于你的中断程序执行时间,因此在第二次执行中断程序前已不存在下降沿,所以进入第二次中断程序后,IEx就被清零了,这样执行完第二次中断程序后就不会再次进入中断了。

说了那么多希望你能明白吧。不明白可以翻查相关单片机外部中断相关资料。

以上就是关于中断服务子程序和普通子程序有什么区别全部的内容,包括:中断服务子程序和普通子程序有什么区别、调用中断服务程序和调用子程序有何区别、c语言中中断服务子程序与其他子程序的区别等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址:https://54852.com/zz/9798000.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存