函式宣告/定義時,與標準c語言存在一定差異,主要為以下幾個方面:
funcname (
)/*return_type 函式返回值型別,如果沒有指定型別,編譯器預設返回型別為int型;
funcname 函式名
arg 函式形參
small 記憶體模式:small
compact 記憶體模式:compact
large 記憶體模式:large
reentrant 可重入函式
interrupt 中斷函式入口
x 中斷號
using 函式使用指定的工作暫存器組
y 工作暫存器組編號
*/
在8051架構中,堆疊指標只能訪問內部ram空間;函式的形參和實參,均不占用堆疊空間,cx51編譯器為每個函式形參分配乙個固定的記憶體空間。cx51編譯器在內部ram中的所有變數空間之後,開闢堆疊空間;
堆疊指標間接定址內部ram區域,並限制定址的最大位址為0xff,最大堆疊空間被限制在256位元組以內;
8051的堆疊是向上生長的;
當乙個函式被呼叫時,首先把實參資料拷貝到形參所處的記憶體空間,然後再執行函式**。
執行函式**過程中,從形參所在的記憶體區域讀寫資料。
在此過程中,只有返回位址會臨時存放在堆疊中。
呼叫中斷處理函式時,需要更多的堆疊空間。因為,必須切換暫存器組,並且在堆疊中儲存幾個暫存器的資料。
預設情況下,cx51在暫存器中最多傳遞3個函式實參,這樣可以提高執行速度。
使用data/idata變數時需要注意占用空間大小,因為這直接決定了給堆疊預留的空間大小。
使用cx51編譯器時,mcu的暫存器最多傳遞3個函式實參。這個機制會顯著提高效能,因為實參不會在ram中讀寫。
使用regpaarms
和moregparms
指令傳遞函式形參/實參。
下圖詳細說明了不同數量和型別的實參所用到的暫存器:
實參數量
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核心程式設計注意區域性變數和...