51中断 用using 0

发布者:创意小巨人最新更新时间:2016-07-28 来源: eefocus关键字:51中断  用using 手机看文章 扫描二维码
随时随地手机看文章
就是告诉编译器,该段代码使用哪组寄存器。寄存器就是8051自带RAM的0x00-0x1F的8x4组R0-R7寄存器。 

中断服务程序对编译器来说首要需要考虑的就是现场寄存器的入栈保护。也就是说,一段在主程序内正在运行的代码,向R1内写了0xFF做为中间变量。而此时,突然来了中断,那么为了保护原有数据不被破坏,就必须将原R1压入堆栈。而PUSH动作是要花费指令周期去执行的,为了提高代码执行速度,若一开始就规划好主程序使用第0和第1组寄存器,而中断服务程序则指定为第2组。那么,编译器在编译的时候就可以做优化,不必再执行原PUSH动作(应为两组寄存器的物理地址不同)。 
所以,上述使用分组寄存器的办法是一种代码优化手段。 
下附KEIL的HELP文档,作为参考。 
//----------------------------------------- 

Register Banks 
In all members of the 8051 family, the first 32 bytes of DATA memory (0x00-0x1F) is grouped into 4 banks of 8 registers each. Programs access these registers as R0-R7. The register bank is selected by two bits of the program status word, PSW. 

Register banks are useful when processing interrupts or when using a real-time operating system because the MCU can switch to a different register bank for a task or interrupt rather than saving all 8 registers on the stack. The MCU can then restore switch back to the original register bank before returning. 

The using function attribute specifies the register bank a function uses. For example: 

void rb_function (void) using 3 
  { 
  . 
  . 
  . 
  } 

The argument for the using attribute is an integer constant from 0-3. Expressions with operators are not allowed. The using attribute is not allowed in function prototypes. The using attribute affects the object code of the function as follows: 

The currently selected register bank is saved on the stack at function entry.  
The specified register bank is set.  
The former register bank is restored before the function is exited.  
The following example shows how to specify the using function attribute and what the generated assembly code for the function entry and exit looks like. 

stmt level  source 

   1 
   2         extern bit alarm; 
   3         int alarm_count; 
   4         extern void alfunc (bit b0); 
   5 
   6         void falarm (void) using 3  { 
   7   1           alarm_count++; 
   8   1           alfunc (alarm = 1); 
   9   1         } 


ASSEMBLY LISTING OF GENERATED OBJECT CODE 

      ; FUNCTION falarm (BEGIN) 
0000 C0D0       PUSH  PSW 
0002 75D018     MOV   PSW,#018H 
                      ; SOURCE LINE # 6 
                      ; SOURCE LINE # 7 
0005 0500   R   INC   alarm_count+01H 
0007 E500   R   MOV   A,alarm_count+01H 
0009 7002       JNZ   ?C0002 
000B 0500   R   INC   alarm_count 
000D  ?C0002: 
                      ; SOURCE LINE # 8 
000D D3         SETB  C 
000E 9200   E   MOV   alarm,C 
0010 9200   E   MOV   ?alfunc?BIT,C 
0012 120000 E   LCALL alfunc 
                      ; SOURCE LINE # 9 
0015 D0D0       POP   PSW 
0017 22         RET 
      ; FUNCTION falarm (END) 

In the previous example, the code starting at offset 0000h saves the initial PSW on the stack and sets the new register bank. The code starting at offset 0015h restores the original register bank by popping the original PSW from the stack. 

 Note 

The using attribute may not be used in functions that return a value in registers. You must exercise extreme care to ensure that register bank switches are performed only in carefully controlled areas. Failure to do so may yield incorrect function results. Even when you use the same register bank, functions declared with the using attribute cannot return a bit value.  
The using attribute is most useful in interrupt functions. Usually a different register bank is specified for each interrupt priority level. Therefore, you could assign one register bank for all non-interrupt code, a second register bank for the high-level interrupt, and a third register bank for the low-level interrupt. 

Copyright © Keil, An ARM Company. All rights reserved.

假定你跟你老板共用一张办公桌,每次你老板来了你就得让开桌子给他用,等他用完,桌上原来的摆放已经乱七八糟了. 

高人出了个主意,桌子仍共用,但桌面上的板子可整块拆走,老板来了,换另一块桌板就好了,等他走了,把你的板搬回来. 

51这张桌子上一共配了4张桌板,使用using n来拆换编号为n的桌板.

关键字:51中断  用using 引用地址:51中断 用using 0

上一篇:74hc164驱动数码管程序
下一篇:51 温度PID经典算法

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

C51中断讲解
一、中断的概念 CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理(中断发生);CPU暂时中断当前的工作,转去处理事件B(中断响应和中断服务);待CPU将事件B处理完毕后,再回到原来事件A被中断的地方继续处理事件A(中断返回),这一过程称为中断 。 引起CPU中断的根源,称为中断源。中断源向CPU提出的中断请求。CPU暂时中断原来的事务A,转去处理事件B。对事件B处理完毕后,再回到原来被中断的地方(即断点),称为中断返回。实现上述中断功能的部件称为中断系统。 随着计算机技术的应用,人们发现中断技术不仅解决了快速主机与慢速I/O设备的数据传送问题,而且还具有如下优点: 分时操作。CPU可以分时为多个I/O
[单片机]
C<font color='red'>51</font><font color='red'>中断</font>讲解
51单片机中断源的扩展方法
一、采用硬件请求和软件查询的方法: 这种方法是:把各个中断源通过硬件“或非(高有效,如CD4002)”(与,低有效)门引入到单片机外部中断源输入端(INT0或INT1),同时再把外部中断源送到单片机的某个输入输出端口,这样当外部中断时,通过“或非”(与)门引起单片机中断,在中断服务程序中再通过软件查询,进而转相应的中断服务程序。 显然,这种方法的中断优先级取决于软件查询的次序。其硬件连接和软件编程如下: Void zhongduan (void) interrupt 0 using 3 //中断函数 { EX0=0;//关中断 If(P0_0=1) { *****}//中断查询 If(P0_1=1) {
[单片机]
<font color='red'>51</font>单片机<font color='red'>中断</font>源的扩展方法
实验四 外中断(80C51单片机汇编语言编程)
S1加1键,S2减1键 要求:上电全灭。每按一次S1亮的灯多一盏;每按一次S2亮的灯少一盏。按8次后重复开始状态。 ORG 0000H LJMP MAIN ORG 0003H LJMP INT0 ORG 0013H LJMP INT1 ORG 0030H MAIN:SETB EA SETB EX0 SETB EX1 SETB IT0 SETB IT1 MOV B,#00H HERE:SJMP HERE INT0:MOV A,B RL A INC A MOV B,A MOV P1,A RETI INT1:MOV A,B
[单片机]
51单片机实验10:定时器中断
目的:通过定时器中断控制延时,使第一盏led的状态反转 开发板muc与led模块电路图如下: 关于定时器和计数器的要点请参考:https://blog.csdn.net/cax1165/article/details/86659302 关于中断的要点请参考:https://blog.csdn.net/cax1165/article/details/86633086 #include reg52.h #define uc unsigned char sbit led=P2^0; void timeint0() { TMOD=0X01;//工作方式 TH0=0XFC;//定时1ms TL0=0X18;//定时
[单片机]
<font color='red'>51</font>单片机实验10:定时器<font color='red'>中断</font>
51单片机计数器编程举例 计数值到一定大小后中断报警
程序: ORG 0000H AJMP START ORG 001BH AJMP TIMER1 ;定时器1的 中断 处理 ORG 30H START: MOV SP,#5FH MOV TMOD,#01010000B ;定时/计数器1作计数用,模式1,0不用全置0 MOV TH1,#0FFH MOV TL1,#0FAH ;预置值,要求每计到6个脉冲即为一个事件 SETB EA SETB ET1 ;开总中断和定时器1中断允许 SETB TR1 ;启动计数器1开始运行. AJMP $ TIMER1: PUSH ACC PUSH PSW CPL P1.0 ;计数值到,即取反P1.0 MOV TH1,#0F
[单片机]
keil51中断处理过程
中断函数注意如下: (1)中断函数不能进行参数传递,如果中断函数中包含任何参数声明都将导致编译出错。 (2)中断函数没有返回值,如果企图定义一个返回值将得不到正确的结果,建议在定义中断函数时将其定义为void类型,以明确说明没有返回值。 (3)在任何情况下都不能直接调用中断函数,否则会产生编译错误。因为中断函数的返回是由8051单片机的RETI指令完成的,RETI指令影响8051单片机的硬件中断系统。如果在没有实际中断情况下直接调用中断函数,RETI指令的操作结果会产生一个致命的错误。 (4)如果在中断函数中调用了其它函数,则被调用函数所使用的寄存器必须与中断函数相同。否则会产生不正确的结果。 (5)C51编译器对中断函数编译时会
[单片机]
C51单片机 写一个外部中断(入门单片机)
代码部分 void main() { /*---------------EA,IT,EX必须写-------------*/ EA=1; //开启总中断 IT1=1; //中断触发模式 //=0为低电平触发,=1为下降沿触发 EX1=1; //外部中断允许位 while(1) { led1=0; } } void int1() interrupt 0 { led=~led1; } 解释: 1.外部中断(按键中断)最最重要的部分就是EA,IT,EX三条语句,这三条是必不可少的。 2.EA是中断总开关,类似家里电闸的总闸,总闸
[单片机]
C<font color='red'>51</font>单片机 写一个外部<font color='red'>中断</font>(入门单片机)
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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