7324|16

302

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

C51中绝对地址的用法 [复制链接]

 
可不可以把一个变量放在固定区域同时对其初始化赋值?
此帖出自51单片机论坛

最新回复

同问,在C51代码中指定了绝对地址以后没有办法赋初值? 如果是混合编程,以前有个办法: 汇编A51代码中指定初始化数据: CSEG AT 0x1000 DB 12H,34H,56H,78H 然后在C51代码中定义引用: unsigned char code *pinfo =0x1000; 或者 code unsinged char pinfo[4] _at_ 0x1000;   详情 回复 发表于 2023-1-27 10:42
点赞 关注
 

回复
举报

6105

帖子

4

TA的资源

版主

沙发
 
网上或书上查  “C51中绝对地址” 就会有人告诉你。
此帖出自51单片机论坛

点评

ena
但他们都是只是定义,不能赋值  详情 回复 发表于 2018-3-16 12:00
 
 
 

回复

302

帖子

0

TA的资源

一粒金砂(高级)

板凳
 
damiaa 发表于 2018-3-16 11:46
网上或书上查  “C51中绝对地址” 就会有人告诉你。

但他们都是只是定义,不能赋值
此帖出自51单片机论坛

点评

你定义了,不就是给这个地址赋了个值吗?死脑筋!  详情 回复 发表于 2018-3-16 12:52
 
 
 

回复

1305

帖子

0

TA的资源

纯净的硅(高级)

4
 
ena 发表于 2018-3-16 12:00
但他们都是只是定义,不能赋值

你定义了,不就是给这个变量地址赋了个值吗?死脑筋!
此帖出自51单片机论坛

点评

ena
,只是定义这个变量存储在某个地址,但具体的值不知道啊?  详情 回复 发表于 2018-3-16 13:02
 
 
 

回复

302

帖子

0

TA的资源

一粒金砂(高级)

5
 
yang_alex 发表于 2018-3-16 12:52
你定义了,不就是给这个变量地址赋了个值吗?死脑筋!

,只是定义这个变量存储在某个地址,但具体的值不知道啊?
此帖出自51单片机论坛

点评

你是说你不知道变量的地址?还是说你不知道变量的值? 变量的地址你在定义的时候不指定了吗?像下面这样: C51提供了访问绝对地址的方法: 1. 绝对宏: 在程序中,用“#include”即可使用其中定义的宏来  详情 回复 发表于 2018-3-16 13:09
 
 
 

回复

1305

帖子

0

TA的资源

纯净的硅(高级)

6
 
ena 发表于 2018-3-16 13:02
,只是定义这个变量存储在某个地址,但具体的值不知道啊?

你是说你不知道变量的地址?还是说你不知道变量的值?

变量的地址你在定义的时候不指定了吗?像下面这样:

C51提供了访问绝对地址的方法:

1. 绝对宏:
在程序中,用“#include”即可使用其中定义的宏来访问绝对地址,包括:
CBYTE、XBYTE、PWORD、DBYTE、CWORD、XWORD、PBYTE、DWORD
具体使用可看一看absacc.h便知
例如:
rval=CBYTE[0x0002];指向程序存贮器的0002h地址
rval=XWORD   [0x0002];指向外RAM的0004h地址

2. _at_关键字
直接在数据定义后加上_at_ const即可,但是注意:
(1)绝对变量不能被初使化;
(2)bit型函数及变量不能用_at_指定。

例如:
idata struct link list _at_ 0x40;指定list结构从40h开始。
xdata char text[25b] _at_0xE000;指定text数组从0E000H开始

提示:如果外部绝对变量是I/O端口等可自行变化数据,需要使用volatile关键字进行描述,请参考absacc.h。
此帖出自51单片机论坛

点评

ena
我的意思是怎么给这个变量赋值,因为我在文档中看到的是“绝对变量不能被初始化”。但是在MDK中,使用__attribute__可以的: const int ID __attribute__((at(0xf200)))=0x10; 不知道C51中有没有这种方式。  详情 回复 发表于 2018-3-16 13:35
 
 
 

回复

302

帖子

0

TA的资源

一粒金砂(高级)

7
 
yang_alex 发表于 2018-3-16 13:09
你是说你不知道变量的地址?还是说你不知道变量的值?

变量的地址你在定义的时候不指定了吗?像下面这 ...

我的意思是怎么给这个变量赋值,因为我在文档中看到的是“绝对变量不能被初始化”。但是在MDK中,使用__attribute__可以的:
const int  ID __attribute__((at(0xf200)))=0x10;
不知道C51中有没有这种方式。
此帖出自51单片机论坛

点评

你要理解一下绝对变量是什么,我理解是定义到地址定义到FLASH空间,你在程序中肯定不能对他初始化了!如果定义在RAM空间,则可以初始化。  详情 回复 发表于 2018-3-16 14:09
 
 
 

回复

6105

帖子

4

TA的资源

版主

8
 
text[25b]数组的任何一个都可以赋值。rval=XWORD   [0x0002];指向外RAM的0004h地址 这样rval可以赋值。

只要不是CCODE CBYTE等(被限制在代码空间)或者被const 限制了的(RAM   XDATA IDATA)。
此帖出自51单片机论坛
 
 
 

回复

1305

帖子

0

TA的资源

纯净的硅(高级)

9
 
ena 发表于 2018-3-16 13:35
我的意思是怎么给这个变量赋值,因为我在文档中看到的是“绝对变量不能被初始化”。但是在MDK中,使用__a ...

你要理解一下绝对变量是什么,我理解是定义到地址定义到FLASH空间,你在程序中肯定不能对他初始化了!如果定义在RAM空间,则可以初始化。
此帖出自51单片机论坛

点评

ena
嗯,估计是不能把  详情 回复 发表于 2018-3-16 14:36
 
 
 

回复

302

帖子

0

TA的资源

一粒金砂(高级)

10
 
yang_alex 发表于 2018-3-16 14:09
你要理解一下绝对变量是什么,我理解是定义到地址定义到FLASH空间,你在程序中肯定不能对他初始化了!如 ...

嗯,估计是不能把
此帖出自51单片机论坛
 
 
 

回复

5

帖子

0

TA的资源

一粒金砂(初级)

11
 
来学习了,通俗的讲法
此帖出自51单片机论坛
 
 
 

回复

525

帖子

235

TA的资源

版主

12
 
const int  ID __attribute__((at(0xf200)))=0x10;
楼主举得这个例子中ID其实就是个常量。存放在0XF200这个地址,在程序里可以通过访问ID来访问这个常量。
此帖出自51单片机论坛

点评

ena
但是在KEILC51中编译不通过  详情 回复 发表于 2018-3-17 08:57
 
个人签名爱电子,爱生活
 
 

回复

302

帖子

0

TA的资源

一粒金砂(高级)

13
 
wsdymg 发表于 2018-3-16 20:53
const int  ID __attribute__((at(0xf200)))=0x10;
楼主举得这个例子中ID其实就是个常量。存放在0XF200这 ...

但是在KEILC51中编译不通过
此帖出自51单片机论坛
 
 
 

回复

4008

帖子

0

TA的资源

版主

14
 
51里面用关键字code

code unsigned char Arry[256]  _at_ (0x1000) = {
0,1,2,3,4,5
};

此帖出自51单片机论坛

点评

ena
这样会提示错误; error C274:“icode”: absolute specifier illegal  详情 回复 发表于 2020-6-13 11:51
 
 
 

回复

302

帖子

0

TA的资源

一粒金砂(高级)

15
 
huo_hu 发表于 2018-3-18 17:12 51里面用关键字code code unsigned char Arry[256] _at_ (0x1000) = { 0,1,2,3,4,5 };

这样会提示错误;

error C274:“icode”: absolute specifier illegal

此帖出自51单片机论坛

点评

你得查一下后面指定的数值确实在flash区  详情 回复 发表于 2020-6-14 21:59
 
 
 

回复

4008

帖子

0

TA的资源

版主

16
 
ena 发表于 2020-6-13 11:51 这样会提示错误; error C274:“icode”: absolute specifier illegal

你得查一下后面指定的数值确实在flash区

此帖出自51单片机论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

17
 

同问,在C51代码中指定了绝对地址以后没有办法赋初值?

如果是混合编程,以前有个办法:

汇编A51代码中指定初始化数据:
CSEG AT 0x1000
DB 12H,34H,56H,78H
然后在C51代码中定义引用:
unsigned char code *pinfo =0x1000;

或者 code unsinged char pinfo[4] _at_ 0x1000;

此帖出自51单片机论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表