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通常在中斷服務函數定義時使用,我們可以爲不同的中斷服務函數指定不同的寄存器組,這樣可以減少堆棧操作,提高程序運行效率。


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