单片机编程时中断程序如何使用

单片机编程时中断程序如何使用,第1张

中断程序不是使用的,是当单片机的中断源有中断请求时,以允许中断的情况下,就是自动转到中断程序去执行了。所以,编程时,需要在中断完成什么任务,都要写到中断程序中就行了,会自己去执行的。而不需要你去使用的。

这样给你说吧。当单片机运行起来的时候是高速运转你while(1)里面的程序。但是这样是不够的,比如你想把某个信号传递给单片机让它处理,比如说:你按了某个键来控制某个灯的亮灭,这时候就需要单片机来响应你的动作,响应的方式就是中断。也就是说你在主程序中完成了某个中断的触发条件时,当达到这个条件时程序就会跳转到中断服务函数中去,执行完中断服务函数中的程序后再返回主程序中继续循环执行。你说的调用其实不太正确,中断服务函数只能触发,它是由单片机内特定的某些寄存器的标志位控制的,当这些满足触发条件的时候,标志位被硬件置1,然后自动执行你编写的中断服务函数。

说的不是很清楚,请见谅,中断是单片机内最重要的功能之一,与之对应的还有定时器(这是单片机的心脏),这些内容在51里面都是很简单的,但是到了32位单片机里面会变得特别复杂。

希望这些内容能给你一些帮助。

对中断请求的整个处理过程是由硬件和软件结合起来而形成的一套中断机构实施的。发生中断时,CPU暂停执行当前的程序,而转去处理中断。这个由硬件对中断请求作出反应的过程,称为中断响应。一般说来,中断响应顺序执行下述三步动作:

◆中止当前程序的执行;

◆保存原程序的断点信息(主要是程序计数器PC和程序状态寄存器PS的内容);

◆从中断控制器取出中断向量,转到相应的处理程序。

通常CPU在执行完一条指令后,立即检查有无中断请求,如果有,则立即做出响应。

当发生中断时,系统作出响应,不管它们是来自硬件(如来自时钟或者外部设备)、程序性中断(执行指令导致“软件中断”—Software Interrupts),或者来自意外事件(如访问页面不在内存)。

如果当前CPU的执行优先级低于中断的优先级,那么它就中止对当前程序下条指令的执行,接受该中断,并提升处理机的执行级别(一般与中断优先级相同),以便在CPU处理当前中断时,能屏蔽其它同级的或低级的中断,然后保存断点现场信息,通过取得的中断向量转到相应的中断处理程序的入口。

(2)中断处理

CPU从中断控制器取得中断向量,然后根据具体的中断向量从中断向量表IDT中找到相应的表项,该表项应是一个中断门。于是,CPU就根据中断门的设置而到达了该通道的总服务程序的入口。

核心对中断处理的顺序主要由以下动作完成:

◆保存正在运行进程的各寄存器的内容,把它们放入核心栈的新帧面中。

◆确定“中断源”或核查中断发生,识别中断的类型(如时钟中断或盘中断)和中断的设备号(如哪个磁盘引起的中断)。系统接到中断后,就从机器那里得到一个中断号,它是检索中断向量表的位移。中断向量因机器而异,但通常都包括相应中断处理程序入口地址和中断处理时处理机的状态字。

◆核心调用中断处理程序,对中断进行处理。

◆中断处理完成并返回。中断处理程序执行完以后,核心便执行与机器相关的特定指令序列,恢复中断时寄存器内容和执行核心栈退栈,进程回到用户态。如果设置了重调度标志,则在本进程返回到用户态时做进程调度。

2系统调用

在Unix/Linux系统中,系统调用像普通C函数调用那样出现在C程序中。但是一般的函数调用序列并不能把进程的状态从用户态变为核心态,而系统调用却可以做到。

C语言编译程序利用一个预先确定的函数库(一般称为C库),其中有各系统调用的名字。C库中的函数都专门使用一条指令,把进程的运行状态改为核心态。Linux的系统调用是通过中断指令“INT 0x80”实现的。

每个系统调用都有惟一的号码,称作系统调用号。所有的系统调用都集中在系统调用入口表中统一管理。

系统调用入口表是一个函数指针数组,以系统调用号为下标在该数组中找到相应的函数指针,进而就能确定用户使用的是哪一个系统调用。不同系统中系统调用的个数是不同的,目前Linux系统中共定义了221个系统调用。

另外,系统调用表中还留有一些余项,可供用户自行添加。

当CPU执行到中断指令“INT 0x80”时,硬件就做出一系列响应,其动作与上述的中断响应相同。CPU穿过陷阱门,从用户空间进入系统空间。相应地,进程的上下文从用户堆栈切换到系统堆栈。

接着运行内核函数system_call()。首先,进一步保存各寄存器的内容;接着调用syscall_trace( ),以系统调用号为下标检索系统调用入口表sys_call_table,从中找到相应的函数;然后转去执行该函数,完成具体的服务。

执行完服务程序,核心检查是否发生错误,并作相应处理。如果本进程收到信号,则对信号作相应处理。最后进程从系统空间返回到用户空间。

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

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

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

中断服务程序 调用子程

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

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

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

通常在中断子程序中是不调用延时子程序的,这样会增加中断处理时间,如果有其它低级中断了,就会延误响应中断了。所以,中断子程序中不要写调用延时子程序,中断子程序也不要写得过长,处理过多的任务,要尽快处理后及时返回,如果中断一次有很多任务需要执行完全,可以在中断子程序中设置一个标志位,在主程序中查这个标志位,当标志为1时,就在主程序中完成这些任务,这样就不会影响其它中断源的中断,也不会使中断产生混乱。

但不知,你这提问是想帮你写程序昵,还是帮你分析中断程序的写法。

以上就是关于单片机编程时中断程序如何使用全部的内容,包括:单片机编程时中断程序如何使用、mcs-51单片机程序中可以直接调用中断服务程序吗为什么、dos中断调用等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

    保存