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

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章