Keil C51对C语言的关键词扩展之十八:using

原创 2013年12月02日 22:16:34

在8051系列单片机中,内部ram的前32个字节被分为4组,每组8个寄存器。每组的8个寄存器名字都为R0-R7。通过设置PSW寄存器的两个位,可以选择使用4组寄存器中的哪一组。

寄存器组在处理中断或者使用实时操作系统时非常有用,可以在进入中断或者切换任务时使用不同寄存器组,而不用把8个寄存器的内容保存到堆栈。在退出中断或返回原任务时,只需切换回原来的寄存器组即可。

指定一个函数使用的寄存器组:

void rb_function (void) using 3
  {
  .
  .
  .
  }
using后跟数字0-3,不允许使用符号表达式指定代替该数字常量。只有定义函数时才可使用using关键词,在做函数原型声明时不允许使用using关键词。

using声明的函数具有以下特征:

1)函数入口处,当前使用的寄存器组被保存到堆栈;

2)指定的寄存器组被设置;

3)函数退出前,原来的寄存器组被恢复;

下面展示了using的用法,请注意生成的汇编程序中函数入口、出口处的代码:

C程序:

   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         }


生成的汇编程序:
0000 C0D0       PUSH  PSW	/* 函数入口处,将原来的寄存器组保存到堆栈 */
0002 75D018     MOV   PSW,#018H /* 切换到新的寄存器组 */
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:
000D D3         SETB  C
000E 9200   E   MOV   alarm,C
0010 9200   E   MOV   ?alfunc?BIT,C
0012 120000 E   LCALL alfunc
0015 D0D0       POP   PSW  /* 函数退出前,切换到原来的寄存器组 */
0017 22         RET
返回值保存在寄存器中的函数不能使用using。

即使使用相同的寄存器组,使用using的函数也不能返回bit类型的值。

using通常在中断服务函数定义时使用,我们可以为不同的中断服务函数指定不同的寄存器组,这样可以减少堆栈操作,提高程序运行效率。


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Keil C51对C语言的关键词扩展之十四: interrupt

8051/8052系列单片机标准向量表: 中断号       描述    地址              0 外部中断0  0003h 1 定时/计...

C语言关键词C/C++ Keywords

cppreference.com -> C/C++ Keywords C/C++ Keywords asm 插入一个汇编指令. auto 声明一个本地变量. ...

KEIL C51环境下,汇编与C语言交叉编译的问题

1. 关于如何在C语言中嵌入汇编命令: 转载自:http://www.keil.com/support/docs/2308.htm C51: GETTING INLINE ASSEMBLY T...

C51对C的扩展专题

  • 2011年12月23日 09:11
  • 2.08MB
  • 下载

如何利用keil C实现单片机中断功能(interrupt,using关键字的用法)

C语言在8051单片机上的扩展(interrupt、using关键字的用法)直接访问寄存器和端口 定义sfr P0 0x80 sfr P1 0x81 sfr ADCON; 0xDEsbit EA  0...
  • qp_12
  • qp_12
  • 2017年01月22日 00:11
  • 794

C语言精确延时 51单片机 Keil C

  • 2009年12月02日 13:16
  • 934B
  • 下载

KEIL C C语言使用初步

  • 2009年02月24日 12:56
  • 3.7MB
  • 下载

关于如何利用Keil C实现51单片机中断功能(interrupt、using关键字的用法)

转载自:http://blog.csdn.net/leizi_chn/article/details/7244377 C语言在8051单片机上的扩展(interrupt、using关...
  • qhyka
  • qhyka
  • 2013年10月10日 13:43
  • 908

Objective-C语言关键词, @property与@synthesize及其各个参数含义

@代表“Objective-C”的标志,证明您正在使用Objective-C语言   Objective-C语言关键词,@property与@synthesize配对使用。   ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Keil C51对C语言的关键词扩展之十八:using
举报原因:
原因补充:

(最多只允许输入30个字)