Keil C51中变量和函数的绝对地址的定位和访问

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)连接定位控制

不讨论


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值