找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2396|回復(fù): 11
打印 上一主題 下一主題
收起左側(cè)

關(guān)于51單片機(jī)內(nèi)存理解問題

[復(fù)制鏈接]
回帖獎勵 20 黑幣 回復(fù)本帖可獲得 1 黑幣獎勵! 每人限 1 次(中獎概率 50%)
跳轉(zhuǎn)到指定樓層
樓主
ID:427646 發(fā)表于 2020-12-10 17:45 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
在看51單片機(jī)代碼的時候,有一個疑問。

代碼如下:
-------------------------

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

memcpy(gXRam, gCode, 256);
-------------------------
定義地址空間后,gCode 沒有賦值,拷貝到 Ram 中,后續(xù)都是操作 gXRam,是為了加快執(zhí)行速度嗎?還是有其他的意義。
還有轉(zhuǎn)換問題:
---------------------

(uint8 xdata *)gCode
---------------------
將code區(qū)轉(zhuǎn)換為data區(qū),起始地址會不會改變? gCode 是否等于 0x3A00?


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:235200 發(fā)表于 2020-12-10 20:16 | 只看該作者
一方面可加快速度,另一方面是為了可改寫數(shù)據(jù)
回復(fù)

使用道具 舉報

板凳
ID:822755 發(fā)表于 2020-12-10 21:02 | 只看該作者
code就是程序區(qū),一般都是只讀的。有可能你看的程序在燒錄時,同時在0x3A00中裝入一些常數(shù)。
code區(qū)的指針不能強(qiáng)制轉(zhuǎn)換為xdata, idata, data等指針類型
回復(fù)

使用道具 舉報

地板
ID:160500 發(fā)表于 2020-12-10 21:08 | 只看該作者
code是代碼區(qū),也就是ROM里,xdata是外部RAM,在你這個代碼里沒有使用到gCode,只有一個copy它的代碼,它被編譯器優(yōu)化了,所以你看不到,后面使用的都是gXRam變量。至于類型轉(zhuǎn)換,這個不太清楚,沒有這樣用過。估計和編譯器有關(guān)系
回復(fù)

使用道具 舉報

5#
ID:235200 發(fā)表于 2020-12-10 22:52 | 只看該作者
將code區(qū)轉(zhuǎn)換為data區(qū),起始地址會不會改變?gCode的地址仍然是 0x3A00?gXRam的地址仍然是0x0,但gXRam區(qū)的數(shù)據(jù)變化了
回復(fù)

使用道具 舉報

6#
ID:427646 發(fā)表于 2020-12-11 09:53 | 只看該作者
經(jīng)過測試:
------------------------
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,編譯沒有錯誤警告,單片機(jī)為 C8051F340。
串口打印結(jié)果為:
x:5000
6
c:3a00
x:3a00
-1
5
--------------------------
code定義的代碼貌似可以轉(zhuǎn)換為xdata,然后起始地址的值好像沒有改變。
有個疑問就是是 C8051F340 的 RAM 只有 256字節(jié)+4KB 大小為啥我可以把地址定義超過空間大。康刂犯鷥(nèi)存大小無關(guān)嗎?
回復(fù)

使用道具 舉報

7#
ID:858925 發(fā)表于 2020-12-11 21:57 | 只看該作者
xdata是外部RAM,在你這個代碼里沒有使用到gCode,只有一個copy它的代碼,它被編譯器優(yōu)化了,所以你看不到,后面使用的都是gXRam變量。

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復(fù)

使用道具 舉報

8#
ID:764088 發(fā)表于 2020-12-14 09:05 | 只看該作者
uint8  code  gCode[256] _at_ 0x3A00; // gCode 是數(shù)組
uint8  xdata gXRam[256] _at_ 0; // gXRam是數(shù)組

memcpy(gXRam, gCode, 256); //  memcpy的要求頭兩參數(shù)(gCode,gXRam)是指針類型
應(yīng)該為
memcpy(&gXRam, &gCode, 256);
回復(fù)

使用道具 舉報

9#
ID:160500 發(fā)表于 2020-12-14 21:41 | 只看該作者
kjl123hh 發(fā)表于 2020-12-11 21:57
xdata是外部RAM,在你這個代碼里沒有使用到gCode,只有一個copy它的代碼,它被編譯器優(yōu)化了,所以你看不到 ...

抄襲也能被獎勵??!
回復(fù)

使用道具 舉報

10#
ID:427646 發(fā)表于 2020-12-15 10:08 | 只看該作者
MikeCai 發(fā)表于 2020-12-14 09:05
uint8  code  gCode[256] _at_ 0x3A00; // gCode 是數(shù)組
uint8  xdata gXRam[256] _at_ 0; // gXRam是數(shù)組 ...

數(shù)組名就是地址
回復(fù)

使用道具 舉報

11#
ID:621026 發(fā)表于 2020-12-15 12:53 | 只看該作者

uint8  code  gCode[256] _at_ 0x3A00; // gCode 是數(shù)組
uint8  xdata gXRam[256] _at_ 0; // gXRam是數(shù)組
回復(fù)

使用道具 舉報

12#
ID:860714 發(fā)表于 2020-12-15 16:44 | 只看該作者
強(qiáng)制轉(zhuǎn)換為xdata, idata, data等指針類型
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表