51单片机中将变量、数组、函数设置在固定位置,定位到绝对地址
2021-01-27 10:13
标签:编译 方法 main https csdn var 地址 tail xxx 一、不带初值的变量或数组 直接使用_at_ 关键字加上地址就行。 如: unsigned char idata myvar _at_ 0x40; unsigned char code myvar[10] _at_ 0x40; _at_ 关键字的前后都有空格。 二、带初值的变量或数组 要将某变量定位在一绝对位置且要赋初值,此时用 _at_ 不能完成,要进行如下操作: 1、相应地,如为xdata变量,则InitVars.c中写: 三、函数的定位 假如要把C源文件 tools.c 中的函数 如果同时定位多个函数,中间用“,”隔开就行了: ?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 } 51单片机中将变量、数组、函数设置在固定位置,定位到绝对地址 标签:编译 方法 main https csdn var 地址 tail xxx 原文地址:https://www.cnblogs.com/WayneKhouTech/p/12846840.html
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)
再次编译即可。
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等变量,则相应处理即可。
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处了
转自:https://blog.csdn.net/qlexcel/java/article/details/85038176
下一篇:Go中的数组切片的使用总结
文章标题:51单片机中将变量、数组、函数设置在固定位置,定位到绝对地址
文章链接:http://soscw.com/index.php/essay/47699.html