51單片機中將變量、數組、函數設置在固定位置,定位到絕對地址


一、不帶初值的變量或數組

直接使用_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

                     }

轉發自:https://blog.csdn.net/qlexcel/article/details/85038176


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM