8051微控制器基礎7 函式的特殊用法

2021-10-10 03:47:37 字數 3148 閱讀 2101

函式宣告/定義時,與標準c語言存在一定差異,主要為以下幾個方面:

 funcname (

)/*return_type 函式返回值型別,如果沒有指定型別,編譯器預設返回型別為int型;

funcname 函式名

arg 函式形參

small 記憶體模式:small

compact 記憶體模式:compact

large 記憶體模式:large

reentrant 可重入函式

interrupt 中斷函式入口

x 中斷號

using 函式使用指定的工作暫存器組

y 工作暫存器組編號

*/

在8051架構中,堆疊指標只能訪問內部ram空間;

cx51編譯器在內部ram中的所有變數空間之後,開闢堆疊空間;

堆疊指標間接定址內部ram區域,並限制定址的最大位址為0xff,最大堆疊空間被限制在256位元組以內;

8051的堆疊是向上生長的;

函式的形參和實參,均不占用堆疊空間,cx51編譯器為每個函式形參分配乙個固定的記憶體空間。

當乙個函式被呼叫時,首先把實參資料拷貝到形參所處的記憶體空間,然後再執行函式**。

執行函式**過程中,從形參所在的記憶體區域讀寫資料。

在此過程中,只有返回位址會臨時存放在堆疊中。

呼叫中斷處理函式時,需要更多的堆疊空間。因為,必須切換暫存器組,並且在堆疊中儲存幾個暫存器的資料。

預設情況下,cx51在暫存器中最多傳遞3個函式實參,這樣可以提高執行速度。

使用data/idata變數時需要注意占用空間大小,因為這直接決定了給堆疊預留的空間大小。

使用cx51編譯器時,mcu的暫存器最多傳遞3個函式實參。這個機制會顯著提高效能,因為實參不會在ram中讀寫。

使用regpaarmsmoregparms指令傳遞函式形參/實參。

下圖詳細說明了不同數量和型別的實參所用到的暫存器:

實參數量

char/1-byte ptr

int/2-byte ptr

long/float

3-byte ptr1r7

r6&r7

r4~r7

r1~r32r5

r4&r5

r4~r7

r1~r33r3

r2&r3

r1~r3

如果函式的第乙個形參時bit型,那麼其他形參不會通過暫存器傳遞。這是因為暫存器中傳遞的引數和上面**中列出的不一致,所以如果有bit型形參時,應該放到函式形參的後面。

如果沒有足夠的暫存器來傳遞函式形參,那麼ram空間也可以用來傳遞引數。

函式的返回值總是被放在暫存器中,下表列出了返回值型別和對應使用的暫存器:

return type

registers

storge format

bitcarry flag

char, unsigned char, 1-byte ptr

r7int, unsigned int, 2-byte ptr

r6 & r7

msb in r6, lsb in r7

long, unsigned long

r4-r7

msb in r4, lsb in r7

float

r4-r7

32-bit ieee format

generic ptr

r1-r3

memory type in r3, msb r2, lsb r1

函式實參和區域性變數預設儲存在記憶體模型隱式指定的儲存空間。

針對單個函式宣告/定義時,可以使用small,compact,large關鍵字指定這個函式使用那種記憶體模型。

#pragma small         

/* default to small model */

extern

int calc (

char i,

int b) large reentrant;

extern

int func (

int i,

float f) large;

extern

void

*tcp (

char xdata *xp,

int ndx) compact;

int mtest (

int i,

int y)

/* small model */

int large_func (

int i,

int k) large /* large model */

使用small模型的好處是,函式形參/實參和區域性變數儲存在內部ram中,因此訪問速度快。

但是,實際應用時,small模型滿足不了大型程式的需要,這時候有必要針對部分函式使用compact/large模型。

在8051微控制器中,內部ram的低32個位元組空間(0x00~0x1f)被劃分給4個工作暫存器組,每個組包含8個暫存器(r0 ~ r7)。程式狀態字(psw)暫存器的其中兩位用來選擇使用那個工作暫存器組。

當處理中斷任務或使用rtos時,工作暫存器組非常有用,因為mcu可以為單個任務或中斷切換工作暫存器組使用,而不是使用堆疊儲存8個暫存器資料。切換任務或處理完中斷後,mcu可以把工作暫存器組切換回原來的狀態。

可以在函式定義後使用關鍵字using x,給這個函式指定使用某一暫存器組,例如:

void rb_function (

void

) using 3

本文完~

分享電子產品開發軟、硬體方面知識,51微控制器、stm32、arm、altiumdesigner pcb設計、開發平台、軟體工具等知識分享。

8051微控制器,彙編實現的氣泡排序

org 0000h mov50h,02h mov51h,10h mov52h,24h mov53h,14h mov54h,11h mov55h,36h mov56h,30h mov57h,25h mov58h,22h mov59h,26h 將 02h 10h 24h 14h 11h 36h 30h ...

51微控制器 8051指令簡介

專業課本上包含的指令會比較全面,而在我的這篇博文中不會寫的那麼全。我只是簡單的介紹一些常見的指令,這些指令是我考試內容中必須要掌握的,是我對知識點的乙個簡單梳理。在開始之前先介紹一些必要的符號意義,這樣不至於在指令中看到太過於突兀。傳送指令中常用的有mov,堆疊push pop操作,累加器與外部資料...

8051核心微控制器程式設計注意事項

1 巨集定義。例如 define debug log printf define degug log printf 2 51核心的堆疊空間只在pdata區。程式設計中,對於函式巢狀較多層,容易引起堆疊溢位的情況 程式執行至0xffff位址 因而需要減少函式的巢狀。3 51核心程式設計注意區域性變數和...