C51程序设计中断及寄存器使用方法

发布者:代码漫游者最新更新时间:2018-01-05 来源: eefocus关键字:C51  程序设计  中断  寄存器 手机看文章 扫描二维码
随时随地手机看文章

如果在中断服务函数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中,函数重入时候,会破坏上次的数据,用下面两种方法解决函数重入问题:
在相应的函数前,加“#pramga disable”声明,只允许主程序或者中断之一调用该函数;
将该函数说明为可重入:VOID func(para..) reentrant;


指定存储模式



由small comPACt及large说明,例如:



void fun1(void) small { }



提示:small说明的函数内部变量全部使用内部RAM。关键的经常性的耗时的


地方可以这样声明,以提高运行速度。


关键字:C51  程序设计  中断  寄存器 引用地址:C51程序设计中断及寄存器使用方法

上一篇:在C51程序设计中变量的空间分配几个方法
下一篇:C51在程序设计中的头文件用法

推荐阅读最新更新时间:2024-03-16 15:51

89C52单片机 计时器 中断的使用
1.计时器 因为51单片机的机器周期计算公式是12/晶振频率MHz,若晶振为12MHz,则机器周期就是12/(12×10^6)=1us,也就是说计数器没1us计数一次。 一般来说,12MHz晶振下,16位定时器满计数是65536次,每次1us,最大就能计时65.536ms,则65536减去多少就是定时多少,如(65536-X)/256,就是定时X微秒。 那么T=1/(X/12)就是一个机器周期 ,(65536-Z(初值))*T就是定时的时间 比如是12M的晶振那么 设置TMOD=0x01, 计时器模式 TH0=(65536-50000)/256; TL0=(65536-50000)%256;就是设置了50ms的定时
[单片机]
89C52单片机 计时器 <font color='red'>中断</font>的使用
基于51单片机家具门屉耐用性自动检测装置程序设计
#include reg52.h #define uint unsigned int #define uchar unsigned char #define ZKB 6 //占空比初始值设定 #define max_time 100 //设置超出时间 sbit gd1=P1^0; //光电开关被挡住是高电平,没有被挡住是低电平 sbit gd2=P1^1; //光电开关被挡住是高电平,没有被挡住是低电平 sbit en=P1^2; //步进电机使能端,高电平工作,低电平不工作 sbit zx=P1^3; //高电平步进电机正
[单片机]
用ST16C2552实现DSP高速串行通讯扩展
1 引言 随着大规模集成电路工艺技术的迅速发展,DSP已经越来越广泛地应用于工业场合。工业现场由于许多场合通讯双方相距较远,为了保证通讯成本和可靠性,必须采用串行方式进行通讯。目前TI公司DSP都只有一个UART口,比如TMS320LF2407,当同时需要与上位机和下面的被控对象进行通讯,或者同时连接几个上位机时,则需要对DSP进行串行通讯口扩展,而使用可编程的ST16C2552可以一次扩展两组相互独立的串口,满足各种条件下串行通讯的要求。 2 ST16C2552介绍 ST16C2552是Exar公司生产的通用异步通讯扩展器件,并与飞利浦公司的SC16C2552相兼容,可扩展2路独立的串行通讯,可编程设定通讯起始位、停止位和
[嵌入式]
STM32F0单片机快速入门七 串口(UART)操作从轮询到中断
1.从轮询到中断 很多同学都不喜欢用中断,而偏爱用轮询的操作方式。 这是不是和我们的天性有关呢?每个人都喜欢一切尽在掌握中,肯定都不喜欢被打断。我们常常都有这样的经验:正在跟别人说一件事,然后突然有个电话打进来,Call打完后突然记不起来刚才讲到哪了!这种糟糕的体验对我们影响是如此深刻,以至于我们认定机器可能也是这样吧,频繁的中断会不会把事情搞乱呢?好在机器虽然大部分时间都比人笨一些,但在处理这种问题上却能做到一丝不苟。机器在中断来的时候总会老老实实地先把当前正在做的记录下来,然后转去处理中断事件,中断处理完后分毫不差地恢复原来的工作。 仔细想一想,我们是不是也可以在接电话前先用个小本儿记录一下正在讲的事情呢?我们为什么没有这么
[单片机]
S3c2440ARM异常与中断体系详解2---CPU模式(Mode)状态(State)
这节课我们来讲CPU的工作模式(Mode) 状态(State)寄存器 7种Mode: usr(用户模式) sys(系统模式) undefined(und)(未定义模式) Supervisor(svc)(管理者模式) Abort(abt)(中止模式) IRQ(irq)(中断模式) FIQ(fiq)(快速中断模式) 2种State: ARM state Thumb state 寄存器: 通用寄存器 备份寄存器(banked register) 当前程序状态寄存器(Current Program Status Register);CPSR CPSR的备份寄存器:SPSR(Save Program Statu
[单片机]
S3c2440ARM异常与<font color='red'>中断</font>体系详解2---CPU模式(Mode)状态(State)
关于STM32影子寄存器和预装载寄存器和TIM_ARRPreloadConfig
本文的说明依据STM32参考手册(RM0008)第10版: 英文:http://www.st.com/stonline/products/literature/rm/13902.pdf 中译文:http://www.stmicroelectronics.com.cn/stonline/mcu/images/STM32_RM_CH_V10_1.pdf 在STM32参考手册的第13、14章中,都有一张定时器的框图,下面是第14章中定时器框图的局部,图中黄色框所示的是auto-reload register,在下面的第14.3.2节 Counter Modes 就解释了auto-reload register的用法。 在图中可以看到au
[单片机]
关于STM32影子<font color='red'>寄存器</font>和预装载<font color='red'>寄存器</font>和TIM_ARRPreloadConfig
STM32之SPI_CR1寄存器的SSM, SSI位理解
近日调试STM32的SPI程序,现在记录下自己的一点小理解。 STM32之SPI_CR1寄存器的SSM, SSI位理解 SSM位,启用或禁止软件从设备选择。SSM置位时,NSS输入引脚的电平将被SSI的值代替。 SSI位,在SSM=1时有意义,决定NSS引脚上的电平,NSS引脚上的IO值将忽略。 NSS输入分为硬件输入和软件控制输入两种模式。NSS有内部和外部引脚。当NSS是软件控制输入模式时,NSS的内部引脚和外部引脚断开。内部引脚通过SPI_CR1寄存器的SSI位来驱动,外部引脚留作他用(可以作为GPIO驱动从设备的片选信号)。 当SSM位置位使能时,启用软件从设备选择,也就是软件控制输入模式。外
[单片机]
你不得不知的C51指针小结
一. 指针变量的定义 指针变量定义与一般变量的定义类似,其形式如下: 数据类型 * 标识符; 表示被定义为基于存储器的指针,无此选项时,被定义为一般指针。这两种指针的区别在于它们的存储字节不同。一般指针在内存中占用三个字节,第一个字节存放该指针存储器类型的编码(由编译时由编译模式的默认值确定),第二和第三字节分别存放该指针的高位和低位地址偏移量。存储器类型的编码值如下: 存储类型I Idata/data/bdata xdata pdata Code 编码值 0x00 0x01 0xFE 0xFF 用于指定指针本身的存储器空间。 char * c_ptr; int * i_ptr; long * l_ptr;
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved