如果在中断服务函数 ISR 中使用寄存器
- 格式:docx
- 大小:14.03 KB
- 文档页数:2
isr函数ISR函数是指中断服务程序,是一种特殊的函数,用于处理硬件中断。
当硬件设备发生中断时,CPU会暂停当前执行的程序,转而执行ISR函数,处理中断事件。
ISR函数的主要内容包括中断处理程序的初始化、中断处理程序的执行和中断处理程序的结束。
中断处理程序的初始化中断处理程序的初始化是指在程序开始执行之前,对中断处理程序进行一些必要的初始化操作。
这些操作包括:1. 确定中断源:在编写ISR函数之前,需要确定中断源,即哪个硬件设备会发生中断。
这可以通过查看设备手册或者硬件设计文档来确定。
2. 设置中断向量表:中断向量表是一个存储中断处理程序地址的表格,用于将中断源与ISR函数关联起来。
在初始化时,需要将ISR函数的地址写入中断向量表中。
3. 确定中断优先级:如果系统中存在多个中断源,需要确定每个中断源的优先级。
这可以通过设置中断控制器的优先级来实现。
中断处理程序的执行中断处理程序的执行是指当中断发生时,CPU会跳转到ISR函数的入口地址,开始执行中断处理程序。
中断处理程序的执行过程包括以下几个步骤:1. 保存现场:在进入ISR函数之前,CPU会自动保存一些寄存器的值,以便在中断处理程序执行完毕后,恢复现场。
如果ISR函数需要使用其他寄存器,需要手动保存和恢复这些寄存器的值。
2. 处理中断事件:中断处理程序的主要任务是处理中断事件。
这包括读取中断状态寄存器,确定中断类型,执行相应的处理操作等。
3. 清除中断标志:在中断处理程序执行完毕后,需要清除中断标志,以便下一次中断发生时,CPU能够正确地识别中断源。
4. 恢复现场:在ISR函数执行完毕后,CPU会自动恢复之前保存的寄存器的值,以便继续执行之前的程序。
中断处理程序的结束中断处理程序的结束是指当中断处理程序执行完毕后,CPU会返回到之前执行的程序,继续执行。
在结束ISR函数时,需要注意以下几个问题:1. 确保中断源已经被处理:在ISR函数执行完毕后,需要确保中断源已经被处理。
C语言的中断服务函数中断服务函数是一种特殊的函数,用于处理系统或外设发生的中断事件。
在C语言中,中断服务函数常用于嵌入式系统的开发中,用于实现硬件的响应和处理。
下面是关于C语言中断服务函数的详细介绍,包括定义、注册、实现和应用等方面。
一、中断服务函数的定义中断服务函数(Interrupt Service Routine,ISR)是一段特殊的代码,用于响应和处理中断事件。
它与普通的函数不同,不是由程序主动调用的,而是由系统或硬件触发的。
中断事件一般包括硬件的输入、定时器的溢出、软件触发等。
在C语言中,中断服务函数的定义方式与普通的函数类似,但需要使用特殊的关键字和参数。
如下是一个C语言中断服务函数的定义示例:```void interrupt_service_functio//中断处理代码```在上述示例中,`void`表示中断服务函数不返回值,`interrupt_service_function`是函数的名称。
根据不同的开发平台和编译器,中断服务函数的定义可能有所不同。
二、中断服务函数的注册要使用一个中断服务函数,需要将其注册到相应的中断源中。
中断源可以是系统的中断控制器,也可以是外设的中断引脚。
注册中断服务函数的目的是告诉系统,在相应中断事件发生时调用该函数。
以8051单片机为例,注册中断服务函数的方式如下所示:```void mairegister_interrupt_service_function(interrupt_service_functi on);//其他代码```在上述示例中,`register_interrupt_service_function`是用于将中断服务函数`interrupt_service_function`注册到系统中断控制器的函数。
在实际开发中,不同平台和配置会有不同的注册方式。
三、中断服务函数的实现中断服务函数的实现主要包括对中断事件的处理和相应操作。
中断服务函数的实现需要了解特定硬件的中断机制和相关的寄存器操作。
简述 8086 处理器的中断处理过程
8086处理器中断处理过程是用来处理外部引发的中断请求的一个过程。
当中断发生时,中断请求将引发中断向量(中断处理程序的程序入口地址)信号。
此向量会被传送到 CPU 的中断标志寄存器(IFR)中,IFR 会根据当前的中断优先级,将中断请求信号发送给 CPU ,以触发 CPU 的中断处理流程。
当中断请求信号触发处理器,处理器首先将当前的程序状态存储到堆栈中供以后恢复使用,然后根据中断向量从中断服务程序(ISR)中取出正确的处理程序。
此时处理器开始执行相应的 ISR,该程序将完成实际的中断处理程序,ISR 将根据外部事件对 CPU 和其他相关设备进行控制,例如改变 CPU 执行的指令,修改状态位,启动外设设备,等等。
完成中断处理程序后,处理器将恢复原来的程序状态,然后继续执行原来的程序,此时中断程序处理完毕,处理器继续执行程序继续完成任务。
- 1 -。
基于C51中断过程及interrupt和using的使用
8051 系列MCU 的基本结构包括:32 个I/O 口(4 组8 bit 端口);两个16 位定时计数器;全双工串行通信;6 个中断源(2 个外部中断、2 个定时/计数器中断、1 个串口输入/输出中断),两级中断优先级;128 字节内置RAM;独立的64K 字节可寻址数据和代码区。
中断发生后,MCU 转到 5 个中断入口处之一,然后执行相应的中断服务。
处理程序。
中断程序的入口地址被编译器放在中断向量中,中断向量位于程序代码段的最低地址处,注意这里的串口输入/输出中断共用一个中断向量。
8051的中断向量表如下:中断源中断向量
---------------------------
上电复位0000H
外部中断0 0003H
定时器0 溢出000BH
外部中断1 0013H
定时器1 溢出001BH
串行口中断0023H
定时器2 溢出002BH
interrupt 和using 都是C51 的关键字。
C51 中断过程通过使用interrupt 关键字和中断号(0 到31)来实现。
中断号指明编译器中断程序的入口地址中断序号对应着8051中断使能寄存器IE 中的使能位,对应关系如下:
IE寄存器C51中的8051的
的使能位中断号中断源
--------------------------------
IE.0 0 外部中断0
IE.1 1 定时器0 溢出。
使用中断指令的流程是什么1. 什么是中断指令?中断指令是计算机中一种特殊指令,用于在程序执行过程中暂停当前任务,转而执行一个被称为中断服务例程(ISR)的程序。
中断指令可以由外部硬件设备触发,也可以是由软件内部的某个条件满足时触发。
使用中断指令可以实现异步的任务处理和优先级调度,提高计算机系统的效率和可靠性。
2. 中断指令流程使用中断指令的流程主要包括中断请求、中断响应、中断处理和中断返回四个阶段。
2.1 中断请求中断请求是指外部硬件设备或软件内部的某个条件向中断控制器发出请求,并将中断信号发送给中央处理器(CPU)。
中断请求可以由外设的输入/输出设备触发,如键盘输入、鼠标点击等,也可以由软件内部的某个条件满足时触发,如计时器到时、异常错误等。
2.2 中断响应当中断请求被触发后,中央处理器需要做出响应,即暂停当前任务的执行,保存当前执行上下文(如程序计数器、寄存器等),并转到中断服务例程(ISR)的入口地址继续执行。
2.3 中断处理在中断服务例程中,执行与中断请求相关的操作。
这些操作可能包括读取外设数据、处理异常错误、更新系统状态等。
中断服务例程可以是预定义的系统函数,也可以是用户自定义的程序。
2.4 中断返回当中断服务例程执行完成后,需要返回到被中断的程序继续执行。
在中断返回的过程中,需要恢复之前保存的执行上下文,使被中断的程序能够从中断发生的地方继续执行。
3. 使用中断指令的优势使用中断指令可以带来以下几个方面的优势:•高效性:中断指令能够将计算机资源合理分配,避免了程序的轮询等待,提高了系统的响应速度和处理效率。
•可靠性:中断指令可以及时响应外设的请求,并进行相应的处理,极大地提高了系统的可靠性和稳定性。
•灵活性:中断指令可以根据不同的需求进行设置,实现硬件设备间的优先级调度,按照先后顺序依次处理中断请求。
4. 示例下面以一个简单的键盘输入中断为例,演示使用中断指令的流程。
1.外部键盘设备检测到用户按下了某个键,向中断控制器发送中断请求。
说明8259a中断控制器中的irr、isr和imr三个寄存器的功能8259A中断控制器是一种常用的外部设备,用于管理和分发系统中的中断请求。
它有三个重要的寄存器:IRR(中断请求寄存器)、ISR (中断服务寄存器)和IMR(中断屏蔽寄存器),这些寄存器在控制和处理中断时起到关键作用。
IRR寄存器(Interrupt Request Register)用于存储当前发生的中断请求。
每个位都对应一个中断源,当某个外部设备发出中断请求时,对应位会被置为1。
CPU可以通过读取IRR寄存器来检测当前的中断请求状态,以确定哪个中断源需要被处理。
ISR寄存器(Interrupt Service Register)用于记录正在被CPU处理的中断源。
当中断请求被CPU接受后,对应的中断源的位会被置为1,表示该中断正在被处理。
ISR寄存器的内容可以帮助CPU追踪当前正在处理的中断,以避免同时处理多个中断源。
IMR寄存器(Interrupt Mask Register)用于屏蔽中断请求。
每个位对应一个中断源,当对应位被置为1时,表示该中断源被屏蔽,即中断请求不会被接受。
通过设置IMR寄存器,CPU可以选择性地屏蔽或允许特定的中断源。
通过IRR、ISR和IMR这三个寄存器的配合使用,8259A中断控制器可以有效地管理和分发系统中的中断请求。
CPU可以通过读取IRR寄存器来检测中断请求,并根据IMR寄存器的设置来确定是否屏蔽某个中断源。
当CPU接受一个中断请求后,会将对应的中断源的位设置为1,并在ISR寄存器中记录下来,以便追踪和处理当前的中断。
当中断处理完成后,CPU会清除ISR寄存器中的相应位,表示中断已经处理完毕。
通过使用这些寄存器,8259A中断控制器可以实现多个中断源的优先级管理、中断请求的屏蔽和中断处理的跟踪。
这些功能对于保证系统可靠性和提高系统的响应能力非常重要。
Keil C51 中using 的用法
Keil C51 中using 的用法在C51 中断程序中很多时候会用到using 关键字,但是很多人并不明白到底是什么意思,这里转帖一篇帮助大家理解。
如果在中断服务函数ISR 中使用寄存器,那么必须处理好using 的使用问题:
1、中断服务函数使用using 指定与主函数不同的寄存器组(主函数一般使用Register bank 0)。
2、中断优先级相同的ISR 可用using 指定相同的寄存器组,但优先级不同的ISR 必须使用不同的寄存器组,在ISR 中被调用的函数也要使用using 指定与中断函数相同的寄存器组。
3、如果不用using 指定,在ISR 的入口,c51 默认选择寄存器组0,这相当于中断服务程序的入口首先执行指令:
MOV PSW #0
这点保证了,没使用using 指定的高优先级中断。
可以中断使用不同的寄存器组的低优先级中断。
4、使用using 关键字给中断指定寄存器组,这样直接切换寄存器组而不必进行大量的PUSH 和POP 操作,可以节省RAM 空间,加速MCU 执行时间。
寄存器组的切换,总的来说比较容易出错,要对内存的使用情况有比
较清晰的认识,其正确性要由你自己来保证。
特别在程序中有直接地址访问的
时候,一定要小心谨慎!至于什么时候要用到寄存器组切换,一种情况是:当
你试图让两个(或以上)作业同时运行,而且它们的现场需要一些隔离的时候,就会用上了。
在ISR 或使用实时操作系统RTOS 中,寄存器非常有用。
寄存器组使用的原则:。
中断寄存器详解中断寄存器详解2010-09-12 22:00●SUBSRCPND寄存器:它用来表示INT_RXD0、INT_TXD0等中断是否发生(注:这些中断是某一大类中断中的子类),每位对应一个中断。
当这些中断发生并且没有被INTSUBMSK寄存器屏蔽,则它们中的若干位将汇集出现在SRCPND寄存器的某一位上。
要清除中断,往此寄存器中某位写1。
●INTSUBMSK寄存器:与SUBSRCPND寄存器对应,它用来屏蔽SUBSRCPND寄存器所标识的中断。
INTSUBMSK寄存器中某位设置1时,对应的中断被屏蔽。
●SRCPND寄存器:它每一位被用来表示一个/一类中断是否发生。
要清除某一位,往此位写1,具体参考数据手册。
●INTMSK寄存器:与SRCPND寄存器对应,用来屏蔽SRCPND 寄存器所标识的中断。
INTMSK寄存器中某位被设为1时,对应的中断被屏蔽,它只能屏蔽IRQ中断,不能屏蔽FIQ。
●INTMOD寄存器:它某位被设为1时,对应的中断被设为FIQ。
同一时间,INTMOD只能有一位被设为1。
●PRIORITY寄存器:当有多个普通中断同时发生时,中断控制器选出最高优先级的中断,首先处理它。
中断优先级通过7个仲裁器来完成,每个仲裁器基于一个位仲裁器模式控制(ARB_MODE,对应寄存器的[6:0]位)和选择控制信号(ARB_SEL,对应寄存器的[20:7]位)的两位来处理6个中断请求。
●INTPND寄存器:经过中断优先级选出优先级最高的中断后,这个中断在INTPND寄存器中的相应位被置1,随后CPU进入中断模式处理它,同一时间,此寄存器只有一位被置1。
在ISR中,可以根据这个位确定是哪个中断,清除中断时,往此位写入1。
●INTOFFSET寄存器:用来表示INTPND寄存器中哪位被置1了,即INTPND寄存器中位[x]为1时,INTOFFSET寄存器的值为x(x为0-31)。
清除SRCPND、INTPND寄存器时,INTOFFSET寄存器被自动清除。
DSP中断设置简明教程DSP中断是一种用于处理实时信号的技术,允许处理器在执行其他任务时,响应外部事件或处理即时数据。
中断是一种非常重要的工具,用于实时系统中,例如音频处理、图像处理等领域。
本文将为您提供一个简明的DSP中断设置教程,帮助您了解如何在DSP中实现中断处理。
首先,我们需要了解DSP中断的基本原理和概念。
DSP中断是一种在执行主线程任务的过程中,当特定的事件发生时,系统自动中止主线程,并转而执行预定义的中断服务子程序(ISR)。
当ISR执行完毕后,系统将返回到主线程继续执行之前的任务。
因此,中断允许DSP准时响应外部事件,并在需要时采取必要的动作。
在DSP中,中断是通过中断控制器实现的。
中断控制器是一种硬件模块,用于检测外部事件并触发相应的中断。
通常,中断控制器有多个中断通道,每个通道可以连接一个外设,如定时器、ADC、UART等。
当外设的中断条件满足时,中断控制器会发送一个中断请求信号给DSP处理器。
下面是一个简单的DSP中断设置步骤:1.确定中断请求源:首先,确定哪个外设将触发中断。
例如,如果您想设置一个定时器中断,那么您需要选择一个定时器作为中断请求源。
2.配置中断控制器:将中断请求源连接到中断控制器的中断通道上。
这通常需要在DSP的寄存器中写入相应的配置值来选择中断通道。
3.编写中断服务子程序(ISR):中断服务子程序是一个函数,用于处理中断事件。
当中断发生时,DSP将暂停正在执行的主线程,并转而执行ISR。
在ISR中,您可以编写自己的处理逻辑,例如读取数据、计算、更新状态等。
4.配置中断向量表:中断向量表是一个存储中断服务子程序地址的表格。
在DSP启动或重新配置中断时,需要将ISR的地址写入中断向量表,以便DSP能够正确调用ISR。
5.启用中断:在DSP的控制寄存器中,设置相应的中断使能位,以启用中断功能。
这将使DSP能够接收到来自中断控制器的中断请求。
6.处理中断请求:当外设满足中断条件时,中断控制器会发送中断请求信号给DSP。
如果在中断服务函数ISR 中使用寄存器,那么必须处理好using 的使用问题:
1、中断服务函数使用using 指定与主函数不同的寄存器组(主函数一般使用Register bank 0)。
2、中断优先级相同的ISR 可用using 指定相同的寄存器组,但优先级不同的ISR 必须使用不同的寄存器组,在ISR 中被调用的函数也要使用using 指定与中断函数相同的寄存器组。
用reentranr指明可重入函数。
3、如果不用using 指定,在ISR 的入口,C51 默认选择寄存器组0,这相当于中断服务程序的入口首先执行指令:
MOV PSW #0
这点保证了,没使用using 指定的高优先级中断。
可以中断使用不同的寄存器组的低优先级中断。
4、使用using 关键字给中断指定寄存器组,这样直接切换寄存器组而不必进行大量的PUSH 和POP 操作,可以节省RAM空间,加速MCU 执行时间。
寄存器组的切换,总的来说比较容易出错,要对内存的使用情况有比较清晰的认识,其正确性要由你自己来保证。
特别在程序中有直接地址访问的时候,一定要小心谨慎!至于“什么时候要用到寄存器组切换”,一种情况是:当你试图让两个(或以上)作业同时运行,而且它们的现场需要一些隔离的时候,就会用上了。
在ISR 或使用实时操作系统RTOS 中,寄存器非常有用。
寄存器组使用的原则:
1、8051 的最低32 个字节分成4 组8 寄存器。
分别为寄存器R0 到R7。
寄存器组由PSW 的低两位选择。
在ISR 中,MCU 可以切换到一个不同的寄存器组。
对寄存器组的访问不可位寻址,C51 编译器规定使用using 或禁止中断的函数(#pragma disable )均不能返回bit 类型的值。
2、主程序(main函数)使用一组,如bank 0;低中断优先级的所有中断均使用第二组,如bank 1;高中断优先级的所有中断均使用再另外一组,如bank 2。
显然,同级别的中断使用同一组寄存器不会有问题,因为不会发生中断嵌套;而高优先级的中断则要使用与低优先级中断不同的一组,因为有可能出现在低优先级中断中发生高优先级中断的情况。
编译器会自动判断何时可使用绝对寄存器存取。
3、在ISR 中调用其它函数,必须和中断使用相同的寄存器组。
当没用NOAREGS 命令做明确的声明,编译器将使用绝对寄存器寻址方式访问函数选定(即用using 或REGISTERBANK 指定)的寄存器组,当函数假定的和实际所选的寄存器组不同时,将产生不可预知的结果,从而可能出现参数传递错误,返回值可能会在错误的寄存器组中。
举一例子:当需要在中断内和中断外调用同一个函数,假定按照程序的流程控制,不会出现函数的递归调用现象,这样的调用会不会出现问题?若确定不会发生重入情况,则有以下两种情况:
1、如果ISR 和主程序使用同一寄存器组(主程序缺省使用BANK 0,若ISR 没有使用using 为其指定寄存器区,则缺省也使用BANK 0),则不需其他设置。
2、如果ISR 和主程序使用不同的寄存器组(主程序缺省使用BANK 0,ISR 使用using 指定了其他BANK),则被调用函数必须放在:
#pragma NOAREGS
#pragma AREGS
控制参数对中,指定编译器不要对该函数使用绝对寄存器寻址方式;或者也可在Options->C51,选中“Dont use absolute register accesses”,使所有代码均不使用绝对寄存器寻址方式(这样,执行效率将稍有降低)。
不论以上的哪一种情况,编译器均会给出重入警告,需手工更改OVERLAY 参数,做重入说明。
3、还有一种办法:如果被调用函数的代码不是很长,还是将该函数复制一份,用不同的函数名代替,这种情况适合ROM有足够多余的空间。
因此,对using关键字的使用,如果没把握,宁可不用,交给编译系统自己去处理好了。
#pragma disable
在函数前声明,只对一个函数有用,该函数调用过程中,将不可被中断。
递归或可重入函数指定
在主程序和中断程序都调用的函数容易出现问题,用寄存器传递参数,内部变量在RAM 中,函数重入时候,会破坏上次的数据,用下面两种方法解决函数重入问题:在相应的函数前,加“#pragma disable”声明,只允许主程序或者中断之一调用该函数;
将该函数说明为可重入:VOID func(para..) reentrant;
指定存储模式
由small compact 及large 说明,例如:
void fun1(void) small { }
提示:small 说明的函数内部变量全部使用内部RAM。
关键的经常性的耗时的
地方可以这样声明,以提高运行速度。