标题: 关于51单片机内存理解问题 [打印本页]

作者: 842790397    时间: 2020-12-10 17:45
标题: 关于51单片机内存理解问题
在看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?



作者: csmyldl    时间: 2020-12-10 20:16
一方面可加快速度,另一方面是为了可改写数据
作者: KongQuan    时间: 2020-12-10 21:02
code就是程序区,一般都是只读的。有可能你看的程序在烧录时,同时在0x3A00中装入一些常数。
code区的指针不能强制转换为xdata, idata, data等指针类型
作者: liuzx66    时间: 2020-12-10 21:08
code是代码区,也就是ROM里,xdata是外部RAM,在你这个代码里没有使用到gCode,只有一个copy它的代码,它被编译器优化了,所以你看不到,后面使用的都是gXRam变量。至于类型转换,这个不太清楚,没有这样用过。估计和编译器有关系
作者: csmyldl    时间: 2020-12-10 22:52
将code区转换为data区,起始地址会不会改变?gCode的地址仍然是 0x3A00?gXRam的地址仍然是0x0,但gXRam区的数据变化了
作者: 842790397    时间: 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 大小为啥我可以把地址定义超过空间大小?地址跟内存大小无关吗?
作者: kjl123hh    时间: 2020-12-11 21:57
xdata是外部RAM,在你这个代码里没有使用到gCode,只有一个copy它的代码,它被编译器优化了,所以你看不到,后面使用的都是gXRam变量。
作者: MikeCai    时间: 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);

作者: liuzx66    时间: 2020-12-14 21:41
kjl123hh 发表于 2020-12-11 21:57
xdata是外部RAM,在你这个代码里没有使用到gCode,只有一个copy它的代码,它被编译器优化了,所以你看不到 ...

抄袭也能被奖励??!
作者: 842790397    时间: 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是数组 ...

数组名就是地址
作者: lzm102968    时间: 2020-12-15 12:53

uint8  code  gCode[256] _at_ 0x3A00; // gCode 是数组
uint8  xdata gXRam[256] _at_ 0; // gXRam是数组
作者: Sinner~    时间: 2020-12-15 16:44
强制转换为xdata, idata, data等指针类型




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1