如何定位一个变量的绝对地址?

[复制链接]
 楼主| 幻阁 发表于 2010-3-17 19:57 | 显示全部楼层 |阅读模式
最近在做毕业设计,用的是C8051f单片机,需要将本机地址addr初始化为01,并写到片内FLASH的固定地址上,(例如写到0x01ff),在keil C51中如何实现 呢?
mohanwei 发表于 2010-3-17 20:25 | 显示全部楼层
试一下定义一个全局变量:
volatile unsigned char code addr=0x01 _at_ 0x01ff;
如果编译通不过就是语法的问题了,可以看一下Keil C51手册如何规定的。
还有一种方法:
volatile unsigned char code addr=0x01;
然后在project->option->BL51 Locate->Code里指定addr的位置
efen 发表于 2010-3-17 21:11 | 显示全部楼层
学习
xjycug 发表于 2010-3-17 21:53 | 显示全部楼层
前段时间研究过,不过在办公室的机子上。
还记得一点,
你可以新建一个C文件,定义这个地址常量,然后在keil的project菜单中选择“Options for Target”选项,在弹出的窗口中选择“BL51 Locate”,然后在Code栏中填入要写变量的名字及需要放入的地址。我办公室有参考,现在没有,明天看看再告诉你吧。这种方法对于写常量数组,如查找表,字库都很方便。好象是(?CO?[文件名]地址吧)这样的格式。呵呵
hxkc 发表于 2010-3-17 21:55 | 显示全部楼层
你要这个干嘛?为什么非得定位到FLASH的某个地址呢?
其实实现你的目的,不一定非得用这种剑走偏峰的路径的.
 楼主| 幻阁 发表于 2010-3-18 10:27 | 显示全部楼层
谢谢xjycug,最好能有个实例,呵呵
 楼主| 幻阁 发表于 2010-3-18 10:28 | 显示全部楼层
回复hxkc:之所以要写到固定地址上,是为了以后在线擦写的方便。
mohanwei 发表于 2010-3-18 15:15 | 显示全部楼层
晕……
uchar code addr=0x01;

要改的时候:
uint FlashAddr = &addr;//取得addr的地址
……
xjycug 发表于 2010-3-18 21:02 | 显示全部楼层
比如,新建一个文件名: mcu_addr.c

在该文件中定义变量
unsigned int code c_Mcu_Addr = 0x1fff;

然后,如我昨天说的方法编译该文件就可以把变量c_Mcu_Addr 指定到flash 0x01ff地址中。
xjycug 发表于 2010-3-18 21:12 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
xjycug 发表于 2010-3-18 21:14 | 显示全部楼层
第一张图就是设置,
第二张图,看watchwindow,可以看见指针变量P的值为0x01ff.应该是你要的结果吧。
由于是设定字库时用的招,估计有些复杂。我想可能有其他大虾还有比较简单的方法来实现的。
 楼主| 幻阁 发表于 2010-3-19 09:36 | 显示全部楼层
回复xjycgu:太感谢了,要是定义多个变量是不是也是这么弄啊
qingqiu647 发表于 2010-3-19 11:25 | 显示全部楼层
二楼的方法可以
andrew.xu 发表于 2010-3-19 15:31 | 显示全部楼层
不知道keil51是用啥
arm下是用__at(0x)的,应该一样的吧
别忘了要包含#include <absacc.h>文件
xjycug 发表于 2010-3-19 15:38 | 显示全部楼层
2楼的方法可以,只不过我是定义字库,所以就麻烦点。
多个变量应该按2楼的方法吧。我觉得应该是。
mohanwei 发表于 2010-3-19 16:09 | 显示全部楼层
如果是程序内部自己访问的,那么8楼的做法才是最合理的,通过取地址指针来获取即可……

除非你是利用外部工具,例如编程器,直接修改FLash内容,才需要指定地址。
csq463276932 发表于 2011-4-13 15:46 | 显示全部楼层
学习,顶起。
SHUJIEWS 发表于 2011-4-13 20:53 | 显示全部楼层
*(char*)addr=0x01;
chengfei21 发表于 2011-4-13 20:57 | 显示全部楼层
uchar *ucp_ptr = (uchar *)0x55;
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

25

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部