深入C51中断向量表
- 格式:docx
- 大小:9.85 KB
- 文档页数:2
1.什么是中断?什么是中断向量?中断向量表的地址范围?答:中断就是CPU在执行当前程序时由于内外部事件引起CPU暂时停止当前正在执行的程序而转向执行请求CPU暂时停止的内外部事件的服务程序,该程序处理完后又返回继续执行被停止的程序;中断向量是中断处理子程序的入口地址;地址范围是00000H-003FFH。
2.3.微机系统的硬件由哪几部分组成?答:微型计算机(微处理器,存储器,I/0接口,系统总线),外围设备,电源。
4.什么是微机的总线,分为哪三组?答:是传递信息的一组公用导线。
分三组:地址总线,数据总线,控制总线。
5.8086/8088CPU的内部结构分为哪两大模块,各自的主要功能是什么?答:总线接口部件(BIU)功能:根据执行单元EU的请求完成CPU与存储器或IO 设备之间的数据传送。
执行部件(EU),作用:从指令对列中取出指令,对指令进行译码,发出相应的传送数据或算术的控制信号接受由总线接口部件传送来的数据或把数据传送到总线接口部件进行算术运算。
6.8086指令队列的作用是什么?答:作用是:在执行指令的同时从内存中取了一条指令或下几条指令,取来的指令放在指令队列中这样它就不需要象以往的计算机那样让CPU轮番进行取指和执行的工作,从而提高CPU的利用率。
7.8086的存储器空间最大可以为多少?怎样用16位寄存器实现对20位地址的寻址?完成逻辑地址到物理地址转换的部件是什么?答:8086的存储器空间最大可以为2^20(1MB);8086计算机引入了分段管理机制,当CPU寻址某个存储单元时,先将段寄存器内的内容左移4位,然后加上指令中提供的16位偏移地址形成20位物理地址。
8.段寄存器CS=1200H,指令指针寄存器IP=FF00H,此时,指令的物理地址为多少?指向这一物理地址的CS值和IP值是唯一的吗?答:指令的物理地址为21F00H;CS值和IP值不是唯一的,例如:CS=2100H,IP=0F00H。
基于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 溢出。
51单片机的中断号以及中断向量
51单片机的中断号以及中断向量
1、外部中断 0、1;分别由引脚/INT0、/INT1的电平信号引起。
2、定时/计数器 0、1;分别由T0、 T1的溢出引起。
3、串行口发送、接收;发送完一个字节或接收到一个字节引起。
上述共5个中断源。
一、中断号
外部中断0 0
定时器T0 1
外部中断1 2
定时器T1 3
串口中断 4
二、 interrupt 和 using 在C51中断中的使用
8051 系列 MCU 的基本结构包括:32 个 I/O 口(4 组8 bit 端口);两个16 位定时计数器;全双工串行通信;6 个中断源(2 个外部中断、2 个定时/计数器中断、1 个串口输入/输出中断),两级中断优先级;128 字节内置RAM;独立的 64K 字节可寻址数据和代码区。
中断发生后,MCU 转到 5 个中断入口处之一,然后执行相应的中断服务处理程序。
中断程序的入口地址被编译器放在中断向量中,中断向量位于程序代码段的最低地址处,注意这里的串口输入/输出中断共用
一个中断向量。
8051的中断向量表如下:。
C语言在8051单片机上的扩展(interrupt、using关键字的用法)直接访问寄存器和端口定义sfr P0 0x80sfr P1 0x81sfr ADCON; 0xDEsbit EA 0x9F操作ADCON = 0x08 ;P1 = 0xFF ;io_status = P0 ;EA = 1 ;在使用了interrupt 1 关键字之后,会自动生成中断向量在ISR中不能与其他"后台循环代码"(the background loop code) 共享局部变量因为连接器会复用在RAM中这些变量的位置,所以它们会有不同的意义,这取决于当前使用的不同的函数复用变量对RAM有限的51来将很重要。
所以,这些函数希望按照一定的顺序执行而不被中断。
timer0_int() interrupt 1 using 2{unsigned char temp1 ;unsigned char temp2 ;executable C statements ;}"interrupt"声明表示向量生成在(8*n+3),这里,n就是interrupt参数后的那个数字这里,在08H的代码区域生成LJMP timer0_int 这样一条指令"using" tells the compiler to switch register banks on entry to an interrupt routine. This "context" switch is the fastest way of providing a fresh registerbank for an interrupt routine's local data and is to be preferred to stacking registers for very time-critical routines. Note that interrupts of the same priority can share a register bank, since there is no risk that they will interrupt each other.'using' 告诉编译器在进入中断处理器去切换寄存器的bank。
c51中断函数如何返回值c51中断函数如何返回值c51中断函数如何返回值匿名提问2009-04-20 16:14:40 发布电脑软件2个回答BiG299792458 | 2009-09-25 08:19:33有0人认为这个回答不错 | 有0人认为这个回答没有帮助主要用于多任务环境中,一个可重入的函数简单来说就是可以被中断的函数,也就是说,可以在这个函数执行的任何时刻中断它,转入OS调度下去执行另外一段代码,而返回控制时不会出现什么错误;而不可重入的函数由于使用了一些系统资源,比如全局变量区,中断向量表等,所以它如果被中断的话,可能会出现问题,这类函数是不能运行在多任务环境下的。
也可以这样理解,重入即表示重复进入,首先它意味着这个函数可以被中断,其次意味着它除了使用自己栈上的变量以外不依赖于任何环境(包括static),这样的函数就是purecode(纯代码)可重入,可以允许有该函数的多个副本在运行,由于它们使用的是分离的栈,所以不会互相干扰。
如果确实需要访问全局变量(包括static),一定要注意实施互斥手段。
可重入函数在并行运行环境中非常重要,但是一般要为访问全局变量付出一些性能代价。
编写可重入函数时,若使用全局变量,则应通过关中断、信号量(即P、V操作)等手段对其加以保护。
说明:若对所使用的全局变量不加以保护,则此函数就不具有可重入性,即当多个进程调用此函数时,很有可能使有关全局变量变为不可知状态。
示例:假设Exam是int型全局变量,函数Squre_Exam返回Exam 平方值。
那么如下函数不具有可重入性。
unsigned int example( int para ) {unsigned int temp;Exam = para; // (**)temp = Square_Exam( );return temp;}此函数若被多个进程调用的话,其结果可能是未知的,因为当(**)语句刚执行完后,另外一个使用本函数的进程可能正好被激活,那么当新激活的进程执行到此函数时,将使Exam赋与另一个不同的para值,所以当控制重新回到“temp = Square_Exam( )”后,计算出的temp很可能不是预想中的结果。
中断向量码和中断类型码1.引言1.1 概述中断向量码和中断类型码是计算机系统中重要的概念和组成部分。
在计算机运行过程中,当发生某些特定事件或条件时,系统需要立即中断当前操作,转而处理这些事件或条件的相应操作。
中断向量码和中断类型码就是用来识别和区分不同中断事件和类型的标识符。
简单来说,中断向量码是一种用于唯一标识各种不同中断事件的编码方式。
它通常是一个整数值,拥有特定的含义和对应的处理程序。
当发生中断事件时,系统会根据中断向量码找到对应的处理程序,从而按照预定义的方式对中断事件进行处理。
而中断类型码则是用于区分不同类型中断的编码方式。
计算机系统中可能存在多种不同类型的中断,如硬件中断、软件中断等。
每种类型的中断都有特定的中断类型码,用于区分和识别不同类型的中断。
通过中断类型码,系统可以准确地判断中断的来源和类型,从而进一步调度相应的处理程序或资源。
中断向量码和中断类型码在计算机系统中起到了至关重要的作用。
它们不仅为系统提供了灵活、快速的中断处理机制,还允许系统针对不同类型的中断事件进行有针对性的处理。
通过合理设计和使用中断向量码和中断类型码,可以提高系统的稳定性、可靠性和响应能力。
在接下来的篇章中,我们将详细介绍中断向量码和中断类型码的定义、作用以及使用方法。
通过深入了解这些概念,读者将能够更好地理解中断处理的机制和原理,并且能够在实际应用中灵活使用和调度中断处理程序。
我们希望通过这篇文章的介绍,读者能够对中断向量码和中断类型码有更深入的认识,并且能够将其应用于自己的实际工作和学习中。
1.2 文章结构本文共分为三个主要部分:引言、正文和结论。
下面将详细介绍每个部分的内容和结构安排。
1. 引言部分将提供本文的背景和目的。
首先,我们将概述中断向量码和中断类型码的基本概念和作用。
然后,我们将介绍本文的结构和各个部分的内容安排。
最后,我们将明确本文的目的,即深入探讨中断向量码和中断类型码对于中断处理的重要性。
C51的中断函数C51的中断函数的格式为:void FuncIr(void) interrupt x [using y]以下是一些分析:一、中断函数是一个特殊的函数,没有参数,也没有返回值;但是程序中允不允许使用return呢?答案是允许的,不过只能用"return;",不能用"return(z);";用在一些需要快速返回的地方,对应的汇编会有多个ret语句,相对效率会高一些。
二、using的用法,using可以修饰任何函数,不过个人建议只用来修饰中断函数;简单的说,“using”会指定工作寄存器组,由于中断函数一般都是比较紧急的事情,有时一条语句都会斤斤计较,所以使用using切换寄存器组可以省去一些压栈的动作,由于51只有两级中断,同级中断不能被打断,因此,我们可以同级中断设成同样的寄存器组,从某种意义上来说,有一组寄存器是多余的。
同时个人建议中断函数应该使用using这个关键字。
三、中断中调用函数,首先要讨论中断函数中调用函数的必要性,前天在论坛上我和别人争论过这个问题,现在我还是这个观点:有些情况中断中调用函数还是必要的,这个时候是不是该调用函数,其实和普通函数差不多,首先是这个函数如果调用多次,或者要带一些参数什么的就更加必要的;前天有人跟我叫劲,说假如只调用一次且无参数无返回的函数要直接写,因为如果用函数,至少会增加CALL和RET两条语句,我不敢苟同,我是实际调试发现的,当你程序比较复杂时,你将那部分单独拉出来做成函数,可能代码和时间都会更好。
四、中断中调用的函数最好不要被中断外的其它函数调用,因为会出现“重复调用”的警告,有时这种调用是很致命的,有人说这个函数可以用reentrant来修饰,是的,的确可以这样解决,不过个人不建议这么做,也许这样会跟你减少很多堆栈空间,并且整个程序的优化要差很多,个人建议出现这种情况就把这个函数写两遍,分成两个函数分别调用。
深入C51中断向量表
在FLASH 中有一组特殊的保留单元000H~00ABH
0000H-0002H 这三个单元包含一个无条件跳转指令(LJMP),当系统复位后,
PC=0000H,跳转到main 函数(不确切)
LJMP 是三字节指令。
就是由指令码02H(一个字节) + 16 位地址(2 个字节)
组成
16 位地址就是Main()函数的地址,其实也不然,由于main()函数在调用
之前,要进行堆栈的初始化之类的工作,在KEIL 中,这部分代码是自动生成
的(对于C 程序来说),跳转地址实际就是这个堆栈汇编的代码开头处!
以下是一个C 程序转换成汇编的部分代码
C:0x0000 020410 LJMP C:0410 ;跳转到堆栈初始化的开头处. ......................................................... ;中断向量表C:0x0023 020527 LJMP UART0_ISR(C:0527) ;跳转到串口中断函数地址
C:0x0410 787F MOV R0,#0x7F ;堆栈初始化程序C:0x0412 E4 CLR AC:0x0413 F6 MOV @R0,AC:0x0414 D8FD DJNZ R0,C:0413C:0x0416 75814F MOV SP(0x81),#0x4FC:0x0419 020457 LJMP C:0457C:0x041C 02049C LJMP main(C:049C) ;跳转到main
void UART0_ISR (void) interrupt 4 using 3 ;串口中断函数
C:0x0527 C0E0 PUSH ACC(0xE0)C:0x0529 C083 PUSH DPH(0x83)C:0x052B C082 PUSH DPL(0x82)。
显然当我们编写C 程序代码的时候,000H~00ABH 的内容KEIL 编译转换
成汇编后,会自动帮我们添加。