微控制器中絕對位址的訪問 CBYTE

2021-10-25 19:40:25 字數 2663 閱讀 8713

參考:

起因是看 英飛凌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...