1.变量绝对地址定位
1)在定义变量时使用 _at_ 关键字即可,如:
uint8 code value _at_ 0x5555; //把变量value定义在程序区的0x5555处
注:在使用 _at_ 关键字定位绝对地址时,不能对其赋初值。
2)使用Keil c51编译器定义绝对地址的变量
首先定义一个变量:
uint8 code value;
之后在编译器中打开project->options for Target菜单,选中BL51 Locate选项卡,在Code中输入:“?CO?MAIN(0x5555)”即可。如图:
注:只有全局变量可以绝对定位,局部变量无法实现绝对定位。
2.函数绝对地址定位
1)在程序中编写一函数MyTest
void MyTest(void)
{
//Add your code here
}
2)使用Keil C51编译器定位绝对地址的函数,打开project->options for Target菜单,选中BL51 Locate选项卡,在Code中输入:“?PR?MyTest?MAIN(0x4000)”。把函数MyTest定位到程序区0x4000处,再次编译就可以。
3)一次定位多个函数的方法
方法同定位一个函数的方法一样。
注:如有多个函数或者变量要进行绝对定位,则应按地址从低到高的顺序排列。
函数的表达模式为:?PR?函数名?文件名
而函数名又分1:无参函数 ?PR?函数名?文件名
2:有参函数 ?PR?_函数名?文件名
3:再入函数?PR?_?函数名?文件名
3.Keil C51绝对地址访问
C51提供了三种访问绝对地址的方法:
1)绝对宏
在程序中,用"#include <absacc.h>"即可使用其中定义的宏来访问绝对地址,包括:CBYTE、XBYTE、PWORD、DBYTE、CWORD、XWORD、PBYTE、DWORD,具体使用可看absacc.h头文件便知。例如:
value = CBYTE[0x0002]; //指向程序区存储器的0002h地址
value1 = XWORD[0x0002]; //指向外RAM的0002h地址
2) _at_ 关键字
直接在数据定义后加上 _at_ const 即可,但是注意:
1)绝对变量不能被初始化;
2)bit类型的变量及函数不能使用 _at_指定。
idata struct link list _at_ 0x40; //指定list结构体从40h开始
xdata char test[33] _at_ 0xE00; //指定test数组从E00h开始
提示;如果外部绝对变量是I/O端口等可自行变化数据,需要使用volatile关键字进行描述,参考absacc.h。
3)连接定位控制
不讨论