找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1914|回复: 11
收起左侧

关于51单片机内存理解问题

[复制链接]
回帖奖励 20 黑币 回复本帖可获得 1 黑币奖励! 每人限 1 次(中奖概率 50%)
ID:427646 发表于 2020-12-10 17:45 | 显示全部楼层 |阅读模式
在看51单片机代码的时候,有一个疑问。

代码如下:
-------------------------

uint8  code  gCode[256] _at_ 0x3A00;
uint8  xdata gXRam[256] _at_ 0;

memcpy(gXRam, gCode, 256);
-------------------------
定义地址空间后,gCode 没有赋值,拷贝到 Ram 中,后续都是操作 gXRam,是为了加快执行速度吗?还是有其他的意义。
还有转换问题:
---------------------

(uint8 xdata *)gCode
---------------------
将code区转换为data区,起始地址会不会改变? gCode 是否等于 0x3A00?


回复

使用道具 举报

ID:235200 发表于 2020-12-10 20:16 | 显示全部楼层
一方面可加快速度,另一方面是为了可改写数据
回复

使用道具 举报

ID:822755 发表于 2020-12-10 21:02 | 显示全部楼层
code就是程序区,一般都是只读的。有可能你看的程序在烧录时,同时在0x3A00中装入一些常数。
code区的指针不能强制转换为xdata, idata, data等指针类型
回复

使用道具 举报

ID:160500 发表于 2020-12-10 21:08 | 显示全部楼层
code是代码区,也就是ROM里,xdata是外部RAM,在你这个代码里没有使用到gCode,只有一个copy它的代码,它被编译器优化了,所以你看不到,后面使用的都是gXRam变量。至于类型转换,这个不太清楚,没有这样用过。估计和编译器有关系
回复

使用道具 举报

ID:235200 发表于 2020-12-10 22:52 | 显示全部楼层
将code区转换为data区,起始地址会不会改变?gCode的地址仍然是 0x3A00?gXRam的地址仍然是0x0,但gXRam区的数据变化了
回复

使用道具 举报

ID:427646 发表于 2020-12-11 09:53 | 显示全部楼层
经过测试:
------------------------
u8  code  gCode[256] _at_ 0x3A00;
u8  xdata gXRam[256] _at_ 0x5000;

*gXRam = 6;
printf("%p\n", gXRam);
printf("%bd\n", *gXRam);
printf("%p\n", gCode);

*((u8 xdata *)gCode) = 5;

printf("%p\n", (u8 xdata *)gCode);
printf("%bd\n", *gCode);
printf("%bd\n", *((u8 xdata *)gCode));
-----------------------------
软件是 keil5,编译没有错误警告,单片机为 C8051F340。
串口打印结果为:
x:5000
6
c:3a00
x:3a00
-1
5
--------------------------
code定义的代码貌似可以转换为xdata,然后起始地址的值好像没有改变。
有个疑问就是是 C8051F340 的 RAM 只有 256字节+4KB 大小为啥我可以把地址定义超过空间大小?地址跟内存大小无关吗?
回复

使用道具 举报

ID:858925 发表于 2020-12-11 21:57 | 显示全部楼层
xdata是外部RAM,在你这个代码里没有使用到gCode,只有一个copy它的代码,它被编译器优化了,所以你看不到,后面使用的都是gXRam变量。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:764088 发表于 2020-12-14 09:05 | 显示全部楼层
uint8  code  gCode[256] _at_ 0x3A00; // gCode 是数组
uint8  xdata gXRam[256] _at_ 0; // gXRam是数组

memcpy(gXRam, gCode, 256); //  memcpy的要求头两参数(gCode,gXRam)是指针类型
应该为
memcpy(&gXRam, &gCode, 256);
回复

使用道具 举报

ID:160500 发表于 2020-12-14 21:41 | 显示全部楼层
kjl123hh 发表于 2020-12-11 21:57
xdata是外部RAM,在你这个代码里没有使用到gCode,只有一个copy它的代码,它被编译器优化了,所以你看不到 ...

抄袭也能被奖励??!
回复

使用道具 举报

ID:427646 发表于 2020-12-15 10:08 | 显示全部楼层
MikeCai 发表于 2020-12-14 09:05
uint8  code  gCode[256] _at_ 0x3A00; // gCode 是数组
uint8  xdata gXRam[256] _at_ 0; // gXRam是数组 ...

数组名就是地址
回复

使用道具 举报

ID:621026 发表于 2020-12-15 12:53 | 显示全部楼层

uint8  code  gCode[256] _at_ 0x3A00; // gCode 是数组
uint8  xdata gXRam[256] _at_ 0; // gXRam是数组
回复

使用道具 举报

ID:860714 发表于 2020-12-15 16:44 | 显示全部楼层
强制转换为xdata, idata, data等指针类型
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表