c51編譯器支援用星號(*)進行指標宣告。你可以用指標完成在標準c語言中有的所有操作。
另外,由於8051及其派生系列所具有的獨特結構,c51編譯器支援兩種不同型別的指標:儲存器指標和通用指標。
通用指標
通用或未定型的指標的宣告和標準c語言中一樣。如:
char *s; /* string ptr */
int *numptr; /* int ptr */
long *state; /* long ptr */
通用指標總是需要三個位元組來儲存。第乙個位元組是用來表示儲存器型別,第二個位元組是指標的高位元組,第三位元組是指標的低位元組。
通用指標可以用來訪問所有型別的變數,而不管變數儲存在哪個儲存空間中。因而許多庫函式都使用通用指標。通過使用通用指標,乙個函式可以訪問資料,而不用考慮它儲存在什麼儲存器中。
通用指標很方便,但是也很慢。在所指向目標的儲存空間不明確的情況下,它們用的最多。
儲存器指標
儲存器指標或型別確定的指標在定義時包括乙個儲存器型別說明,並且總是指向此 說明的特定儲存器空間。例如:
char data *str; /* ptr to string in data */
int xdata *numtab; /* ptr to int(s) in xdata */
long code *powtab; /* ptr to long(s) in code */
正是由於儲存器型別在編譯時已經確定,通用指標中用來表示儲存器型別的位元組就不再需要了。
指向idata,data,bdata和pdata的儲存器指標用乙個位元組儲存,指向code和xdata的儲存器指標用兩個位元組儲存。使用儲存器指標比通用指標效率要高,速度要快。當然,儲存器指標的使用不是很方便。在所指向目標的儲存空間明確並不會變化的情況下,它們用的最多。
儲存器指標和通用指標的比較
使用儲存器指標可以顯著的提高8051 c程式的執行速度。
下面的示例程式說明了使用不同的指標在**長度,占用資料空間和執行時間上的不同。
description idata pointer xdata pointer generic pointer
c源程式 idata *ip; char xdata *xp; char *p;
char val; har val; char val;
val = *ip; val = *xp; val = *xp;
編譯後的
** mov r0,ip mov dpl,xp +1 mov r1,p + 2
mov val,@r0 mov dph,xp mov r2,p + 1
mov a,@dptr mov r3,p
mov val,a call cldptr
指標大小 1 byte 2 byte 3 byte
**長度 4 bytes 9 bytes 11 bytes + library call
執行時間 4 cycles 7 cycles 13 cycles
用c51譜寫化蝶
演奏原理 2 樂譜單位元組編碼方法 1 定時器0 1產生各種音訊的方法 表1 為c調的發音頻率表,給出了各個音的頻率f,可以用定時器 計數器,定時產生對應頻率的方波訊號,將方波訊號送給喇叭,便可使喇叭發出同頻率的聲音。定時初值x與發聲頻率f的關係如下 由公式 t 2n x tmc 式中 t t 2 ...
C51儲存的優化
我們知道51微控制器只有128byte的ram,有的增強型有xram,此時程式設計時就要注意,否則就有可能超出空間 1 對於各模組的全域性變數 靜態變數 全域性列舉型常量,靜態列舉型常量 個別操作儲存 如外部spi flash 的區域性變數都要修飾成xdata型別,從而節省空間。2 對於bit型變數...
C51用巨集定義代替printf函式
有時候我們想用巨集定義來決定是編譯debug版本的 還是release的 dubug版本的 會通過printf列印除錯資訊,release版本的 則不會。我們總不能對每一條printf都這樣寫 if debug printf hello world endif這樣子實在是太麻煩了!萬一要各個地方都要...