一、不帶初值的變量或數組
直接使用_at_ 關鍵字加上地址就行。
如:
unsigned char idata myvar _at_ 0x40;
unsigned char code myvar[10] _at_ 0x40;
_at_ 關鍵字的前后都有空格。
二、帶初值的變量或數組
要將某變量定位在一絕對位置且要賦初值,此時用 _at_ 不能完成,要進行如下操作:
1、在工程中建立一個新的文件,如InitVars.c,在其中對要處理的變量賦初值(假設是code變量):
char code myVer = {"COPYRIGHT 2001-11"};
2、然后將該文件加入工程,編譯,打開M51文件,若定義的是code型,則在
* * * C O D E M E M O R Y * * *
下可找到:
CODE xxxxH xxxxH UNIT ?CO?INITVARS
然后在:
Project->Options for Target ...->BL51 Locate:Code
中填入:
?CO?INITVARS(0x200)
再次編譯即可。
1、相應地,如為xdata變量,則InitVars.c中寫:
char xdata myVer = {"COPYRIGHT 2001-11"};
然后將該文件加入工程,編譯,打開M51文件,在
* * * X D A T A M E M O R Y * * *
下可找到:
XDATA xxxxH xxxxH UNIT ?XD?INITVARS
然后在:
Project->Options for Target ...->BL51 Locate:Xdata
中填入:
?XD?INITVARS(0x200)
再次編譯即可。相應地,若定義的是data/idata等變量,則相應處理即可。
三、函數的定位
假如要把C源文件 tools.c 中的函數
int BIN2HEX(int xx)
{
...
}
放在CODE MEMORY的0x1000處,先編譯該工程,然后打開該工程的M51文件,在
* * * C O D E M E M O R Y * * *
行下找出要定位的函數的名稱,應該形如:
CODE xxxxH xxxxH UNIT ?PR?_BCD2HEX?TOOLS
然后在:
Project->Options for Target ...->BL51 Locate:Code
中填寫如下內容:
?PR?_BCD2HEX?TOOLS(0x1000)
再次Build,在M51中會發現該函數已放在CODE MEMORY的0x1000處了
如果同時定位多個函數,中間用“,”隔開就行了:
?PR?myTest1?MAIN(0x3900), ?PR?myTest2?MAIN(0x4000)
四、知道函數地址但不知道函數名字的調用方法(使用函數指針調用絕對地址處的函數)
1、定義調用的函數原形
typedef void (*CALL_MYTEST)(void);
這是一個回調函數的原形, 參數為空.
2、定義相應的函數指針變量
CALL_MYTEST myTestCall = NULL;
3、函數指針變量賦值, 指向我們定位的絕對地址的函數
myTestCall = 0x3900;
4、函數指針調用
if (myTestCall != NULL)
{
myTestCall(); // 調用函數指針處的函數 myTest1, 置 PC 指針為 0x3900