您的位置 首页 元件

KEIL C51之肯定地址定位

单片机空间分配看*.M51文件,ARM,DSP空间分配看*.map文件1、函数定位:假如要把C源文件tools.c中的函数intBIN2HEX(intxx){…}…

单片机空间分配看*.M51文件,ARM,DSP空间分配看*.map文件

1、函数定位:

假设要把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处了

2.赋初值的变量定位

要将某变量定位在一肯定方位且要赋初值,此刻用 _at_ 不能完结,则如下操作:

在工程中树立一个新的文件,如InitVars.c,在其间对要处理的变量赋初值(假设是code变

量):

char code myVer = {“COPYRIGHT 2001-11”};

然后将该文件参加工程,编译,翻开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)

再次编译即可。

相应地,如为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等变量,则相应处理即可。

3、若有多个变量或函数要进行肯定地址定位,则应按地址从低到高的次序

运用KeilC51软件,能够很方便地将代码或许数据肯定定位到某个地址。
1、代码定位:
办法1:运用伪指令CSEG。比方要将MyFunc1定位到代码区C:0x1000,则新建一个A51文件,增加以下内容:
PUBLIC MYFUNC1
CSEGAT 1000H
MYFUNC1:
;其它代码
RET
在其它源文件中,就能够调用MyFunc()函数了。需求留意的是,编译器不检测传递参数的数目,仅检测函数是否有返回值。
办法2:运用BL51 Locate选项。比方在main.c中界说了一个MyFunc2函数,而且要将该函数定位到代码区C:0x2000,则从菜单中挑选Project->Options for Target Target1,在弹出的对话框中挑选BL51 Locate页,鄙人面的code栏中写上?PR?MYFUNC2?MAIN(0x2000)即可。
假如想定位多个函数,也能够运用*通配符。
2、变量定位:
只要全局变量能够肯定定位,局部变量无法完成肯定定位。
办法1:运用_at_关键字。声明一个全局变量unsigned char data MyBuf1[8]_at_ 0x20;
办法2:运用BL51 Locate选项。比方将main.c中界说的一切data型的全局变量定位到数据区D:0x28开端的空间,则从菜单中
挑选Project->Options for Target Target1,在弹出的对话框中挑选BL51 Locate页,鄙人面的data栏中写上?DT?MAIN(0x28)即可。
假如是idata,则运用?ID?MAIN(0x28),假如是xdata,则运用?XD?MAIN(0x28),假如是pdata,则运用?PD?MAIN(0x28)
3、仓库定位:
在STARTUP.A51文件中界说了仓库区?STACK,其开始地址相同能够在BL51 Locate页中设置,在Stack栏写上?STACK(0x80)

还能够经过汇编完成
// my.a51

public my_flash_var

cseg at 0F100H

my_flash_var:
db 55h

end

然后C声明

// flash.c
extern unsigned char code my_flash_var;

BL51 locate 选项卡中
code range 和 xdata range假如不填写,编译默许将程序中相应代码和变量从空间前面取起

网上看到有人说到在keil中运用_at_进行肯定地址定位问题,我简略介绍一下它的用法。
运用_at_关键字对存储器进行肯定地址定位程序如下
#i nclude
char xdata LED_Data[50] _at_ 0x8000;
main()
{
LED_Data[0] = 0x23;
}
在keil中运转以上程序能够在存储器窗口中输入 x:0x8000 能够看到0x8000地址中的值为0x23.
值得指出的几点是
1.在给变量LED_Data[50]定位肯定地址空间时,不能对其赋初值。
2.char xdata LED_Data[50] _at_ 0x8000;这条句子不能主函数中。有些网友说到在按着keil阐明顶用_at_进行肯定地址定位时,编译会呈现过错274,便是将这条句子放在主函数中的原因。
3.keil中地址是主动分配的,所以除非特殊情况不然不发起运用肯定地址定位。初学者因帖别留意。不要把c当作汇编运用。
对需求/RST复位后要坚持变量不变,避免意外改动(比方升级到新程序,变量地址或许被编译器优化到其他地方),比较有用!!!!

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/xinpin/yuanjian/276735.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部