參考:
起因是看 英飛凌sp37 **的時候有點疑惑,51怎麼學過。
void read_sp37_id(unsigned char idata *idh,unsigned char idata *idl)
//說白了就是對乙個指標的解引用!!!
一.使用c51執行庫中預定義巨集
c51編譯器提供了一組巨集定義來對51系列微控制器的code、data、pdata和xdata空間進行絕對定址。規定只能以無符號數方式訪問,定義了8個巨集定義,其函式原型如下:
#define cbyte((unsigned char volatile*)0x50000l)
#define dbyte((unsigned char volatile*)0x40000l)
#define pbyte((unsigned char volatile*)0x30000l)
#define xbyte((unsigned char volatile*)0x20000l)
#define cword((unsigned int volatile*)0x50000l)
#define dword((unsigned int volatile*)0x40000l)
#define pword((unsigned int volatile*)0x30000l)
#define xword((unsigned int volatile*)0x20000l)
這些函式原型放在absacc.**件中。使用時須用預處理命令把該標頭檔案包含到檔案中,形式為:#include 。
其中:cbyte以位元組形式對code區定址,dbyte以位元組形式對data區定址,pbyte以位元組形式對pdata區定址,xbyte以位元組形式對xdata區定址,cword以字形式對code區定址,dword以字形式對data區定址,pword以字形式對pdata區定址,xword以字形式對xdata區定址。
【例】絕對位址對儲存單元的訪問
#include /將絕對位址標頭檔案包含在檔案中/
#include /將暫存器標頭檔案包含在檔案中/
#define uchar unsigned char /定義符號uchar為資料型別符unsigned char/
#define uint unsigned int /定義符號uint為資料型別符unsigned int/
void main(void)
{ uchar var1;
uint var2;
var1=xbyte[0x0005]; /xbyte[0x0005]訪問片外ram的0005位元組單元/
var2=xword[0x0002]; /xword[0x0002]訪問片外ram的0002字單元/
while(1);
在上面程式中,其中xbyte[0x0005]就是以絕對位址方式訪問的片外ram 0005位元組單元;xword[0x0002]就是以絕對位址方式訪問的片外ram 0002字單元。
二.通過指標訪問
採用指標的方法,可以實現在c51程式中對任意指定的儲存器單元進行訪問。
【例】 通過指標實現絕對位址的訪問。
#define uchar unsigned char /定義符號uchar為資料型別符unsigned char/
#define uint unsigned int /定義符號uint為資料型別符unsigned int/
void func(void)
{uchar data var1;
uchar pdata *dp1; /定義乙個指向pdata區的指標dp1/
uint xdata *dp2; /定義乙個指向xdata區的指標dp2/
uchar data *dp3; /定義乙個指向data區的指標dp3/
dp1=0x30; /dp1指標賦值,指向pdata區的30h單元/
dp2=0x1000; /dp2指標賦值,指向xdata區的1000h單元/
*dp1=0xff; /將資料0xff送到片外ram30h單元/
*dp2=0x1234; /將資料0x1234送到片外ram1000h單元/
dp3=&var1; /dp3指標指向data區的var1變數/
*dp3=0x20; /給變數var1賦值0x20/
三.使用c51擴充套件關鍵字_at_
[儲存器型別] 資料型別說明符 變數名 at 位址常數;
其中,儲存器型別為data、bdata、idata、pdata等c51能識別的資料型別,如省略則按儲存模式規定的預設儲存器型別確定變數的儲存器區域;資料型別為c51支援的資料型別。位址常數用於指定變數的絕對位址,必須位於有效的儲存器空間之內;使用_at_定義的變數必須為全域性變數。
【例】通過_at_實現絕對位址的訪問。
#define uchar unsigned char /定義符號uchar為資料型別符unsigned char/
#define uint unsigned int /定義符號uint為資料型別符unsigned int/
void main(void)
{data uchar x1 at 0x40; /在data區中定義位元組變數x1,它的位址為40h/
xdata uint x2 at 0x2000; /在xdata區中定義字變數x2,它的位址為2000h/
x1=0xff;
x2=0x1234;
while(1);
arr訪問絕對位址 定址
定址 按符號名對全域性變數定址 使用符號名稱進行定址時,則需輸入 plc變數表中的變數名稱。全域性變數的 符號名自動用 引號括起來 可以使用 plc變數的符號名稱,對基於 plc資料型別的結構 化變數進行定址。也可以使用句點分隔各元素的名稱。按絕對位址對全域性變數定址 使用絕對位址定址時,則需輸入 ...
IOS中相對位址與絕對位址的轉換
ios程式有固定的檔案訪問限制,只能在自己的沙盒內。uiimage img uiimage imagenamed cellicon.png 這段 從相對路徑載入了乙個png資源作為uiimage物件,沒有任何問題。因為它在內部已經偷偷得幫你把路徑轉化為相對路徑了,你還不知道吧!接下來,如果要載入一些...
對絕對位址的操作
嵌入式系統中往往需要讓程式跳到記憶體的某個位址去執行,比如想讓程式跳轉到絕對位址是0x100000去執行,應該怎麼做?這樣 void void 0x100000 即可。解釋一下,想讓程式跳到某個絕對位址去執行得用函式指標,這或許也是函式指標的乙個妙用吧!語句void void 宣告了乙個返回值是vo...