找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

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

c51單片機(jī)中的動(dòng)態(tài)內(nèi)存分配問(wèn)題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
這兩天在學(xué)c51單片機(jī) 想著寫一個(gè)貪吃蛇練練手,關(guān)于蛇的移動(dòng)(頭插尾出)就想著用隊(duì)列(鏈表實(shí)現(xiàn)),因?yàn)橹耙矝](méi)專門學(xué)過(guò)c,發(fā)現(xiàn)鏈表用著比想象中麻煩好多,尤其是動(dòng)態(tài)內(nèi)存分配。c51中不能直接使用malloc和free等函數(shù),要先初始化一個(gè)堆(init_mempool函數(shù))但這個(gè)函數(shù)我看了官方文檔也沒(méi)看明白,照葫蘆畫瓢寫了個(gè)差不多的,但會(huì)有很奇怪的現(xiàn)象--只能往右邊走,而且走一會(huì)就停了 只有一個(gè)等在亮

堆初始化.png (7.99 KB, 下載次數(shù): 116)

堆初始化

堆初始化

全局函數(shù).png (6.22 KB, 下載次數(shù): 122)

全局函數(shù)

全局函數(shù)

蛇初始化.png (36.2 KB, 下載次數(shù): 120)

蛇初始化

蛇初始化

蛇的定義.png (89.74 KB, 下載次數(shù): 143)

蛇的定義

蛇的定義

蛇位置更新.png (9.97 KB, 下載次數(shù): 120)

蛇位置更新

蛇位置更新

移動(dòng)蛇1.png (47.57 KB, 下載次數(shù): 123)

蛇移動(dòng)函數(shù)1

蛇移動(dòng)函數(shù)1

移動(dòng)蛇2.png (52.56 KB, 下載次數(shù): 117)

蛇移動(dòng)函數(shù)2

蛇移動(dòng)函數(shù)2

主函數(shù).png (99.83 KB, 下載次數(shù): 126)

主函數(shù)

主函數(shù)

snake.rar

60.92 KB, 下載次數(shù): 7

工程

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

使用道具 舉報(bào)

沙發(fā)
ID:230742 發(fā)表于 2021-12-5 11:05 | 只看該作者
本論壇有強(qiáng)大的搜索功能,搜索一下。有其它大佬的程序,先下載下來(lái)學(xué)習(xí)一下。事半功倍。
回復(fù)

使用道具 舉報(bào)

板凳
ID:883242 發(fā)表于 2021-12-5 12:04 | 只看該作者
你好歹用個(gè)STM8啊,8051這么陳舊的結(jié)構(gòu)直接尋址能力只有120字節(jié)玩兒動(dòng)態(tài)分配內(nèi)存是不是開(kāi)玩笑?
回復(fù)

使用道具 舉報(bào)

地板
ID:139866 發(fā)表于 2021-12-5 12:34 | 只看該作者
回復(fù)

使用道具 舉報(bào)

5#
ID:988145 發(fā)表于 2021-12-5 14:58 | 只看該作者
Hephaestus 發(fā)表于 2021-12-5 12:04
你好歹用個(gè)STM8啊,8051這么陳舊的結(jié)構(gòu)直接尋址能力只有120字節(jié)玩兒動(dòng)態(tài)分配內(nèi)存是不是開(kāi)玩笑?

我用的是89c516, 還是說(shuō)不管是c51還是c516,我能訪問(wèn)的ram只有120字節(jié)?如果這么說(shuō)的話倒也就合理了,走了兩三下就不走了是因?yàn)橹蟮膬?nèi)存沒(méi)法訪問(wèn)?
回復(fù)

使用道具 舉報(bào)

6#
ID:988145 發(fā)表于 2021-12-5 15:01 | 只看該作者
  1. #include <stdlib.h>

  2. unsigned char xdata malloc_mempool [0x1000];


  3. void tst_init_mempool (void) {
  4.   int i;
  5.   xdata void *p;

  6.   init_mempool (&malloc_mempool, sizeof(malloc_mempool));

  7.   p = malloc (100);

  8.   for (i = 0; i < 100; i++)
  9.     ((char *) p)[i] = i;

  10.   free (p);
  11. }
復(fù)制代碼
還有就是其中 unsigned char xdata malloc_mempool [0x1000]; 這條語(yǔ)句后面的 [0x1000] 是指定起始地址嗎
回復(fù)

使用道具 舉報(bào)

7#
ID:57657 發(fā)表于 2021-12-5 15:44 | 只看該作者
Hephaestus 發(fā)表于 2021-12-5 12:04
你好歹用個(gè)STM8啊,8051這么陳舊的結(jié)構(gòu)直接尋址能力只有120字節(jié)玩兒動(dòng)態(tài)分配內(nèi)存是不是開(kāi)玩笑?

STC8一出現(xiàn),STM8就會(huì)慢慢淘汰了。
沒(méi)看見(jiàn)代碼里用了XDATA內(nèi)存? 有64KB的尋址范圍。
回復(fù)

使用道具 舉報(bào)

8#
ID:883242 發(fā)表于 2021-12-5 16:28 | 只看該作者
npn 發(fā)表于 2021-12-5 15:44
STC8一出現(xiàn),STM8就會(huì)慢慢淘汰了。
沒(méi)看見(jiàn)代碼里用了XDATA內(nèi)存? 有64KB的尋址范圍。

知名大廠如intel、Siemens(現(xiàn)Infineon)、Philips(現(xiàn)NXP)都曾經(jīng)是51生產(chǎn)大廠,然而20年前紛紛停產(chǎn)了所有的51產(chǎn)品。如果真有市場(chǎng),輪得到STC吃殘羹剩飯?用STC的人聲勢(shì)浩大,但是有用嗎?每個(gè)人出貨量能有幾片???跟STM8、PIC等單片機(jī)比產(chǎn)量,就是個(gè)笑話,別不以為恥反以為榮。
回復(fù)

使用道具 舉報(bào)

9#
ID:57657 發(fā)表于 2021-12-5 18:41 | 只看該作者
Hephaestus 發(fā)表于 2021-12-5 16:28
知名大廠如intel、Siemens(現(xiàn)Infineon)、Philips(現(xiàn)NXP)都曾經(jīng)是51生產(chǎn)大廠,然而20年前紛紛停產(chǎn)了所 ...

STC和STM的區(qū)別等于華為和三星的區(qū)別,這就是在國(guó)內(nèi)越來(lái)越?jīng)]人用三星,哪國(guó)的品牌只有那國(guó)人用的多。
回復(fù)

使用道具 舉報(bào)

10#
ID:57657 發(fā)表于 2021-12-5 19:02 | 只看該作者
Hephaestus 發(fā)表于 2021-12-5 16:28
知名大廠如intel、Siemens(現(xiàn)Infineon)、Philips(現(xiàn)NXP)都曾經(jīng)是51生產(chǎn)大廠,然而20年前紛紛停產(chǎn)了所 ...

3個(gè)月內(nèi)有200多個(gè)STC的帖子,STM8的帖子不到30個(gè),這就是在國(guó)內(nèi)開(kāi)始淘汰的原因,你可以站內(nèi)高級(jí)搜索。
回復(fù)

使用道具 舉報(bào)

11#
ID:624769 發(fā)表于 2021-12-5 20:00 來(lái)自手機(jī) | 只看該作者
樓上的,你們樓歪了!。
回復(fù)

使用道具 舉報(bào)

12#
ID:624769 發(fā)表于 2021-12-5 20:34 | 只看該作者
會(huì)會(huì)會(huì)不會(huì) 發(fā)表于 2021-12-5 14:58
我用的是89c516, 還是說(shuō)不管是c51還是c516,我能訪問(wèn)的ram只有120字節(jié)?如果這么說(shuō)的話倒也就合理了,走 ...

STC89c516  的話, RAM 是1280     , 256 IDATA(前部的128 可為DATA)  和 1024 的 XDATA 共計(jì)1280。

如其他品牌,你可以查找相關(guān)手冊(cè), 造51的太多了,沒(méi)人能全知道。
回復(fù)

使用道具 舉報(bào)

13#
ID:624769 發(fā)表于 2021-12-5 20:45 | 只看該作者
也就整個(gè)貪吃蛇,壓根沒(méi)必要整什么動(dòng)態(tài)內(nèi)存。而且,你本質(zhì)上不應(yīng)該把它當(dāng)作“蛇”,就應(yīng)該是認(rèn)為是一個(gè)二維的流水燈,無(wú)非給這個(gè)流水燈加一些判斷,比如下一個(gè)亮起的燈,由按鍵決定 橫坐標(biāo) +-1 還是縱坐標(biāo) +-1。然后,這個(gè)新的燈的坐標(biāo),超出邊界,則判定 GAME OVER , 這個(gè)燈的坐標(biāo),等于已經(jīng)亮著的流水燈中的某一個(gè)燈的時(shí)候,判定 GAME OVER, 就夠了。 如果你用的是 STC89C516的話,做8x8的貪吃蛇就沒(méi)意思了,做16x16 的不好么? 剛好256,尋址正好1個(gè)字節(jié),充分利用8位單片機(jī)的所有性能。
回復(fù)

使用道具 舉報(bào)

14#
ID:624769 發(fā)表于 2021-12-5 23:35 | 只看該作者
會(huì)會(huì)會(huì)不會(huì) 發(fā)表于 2021-12-5 15:01
還有就是其中 unsigned char xdata malloc_mempool [0x1000]; 這條語(yǔ)句后面的 [0x1000] 是指定 ...

后面 0x1000 是長(zhǎng)度, 表示你定義這個(gè) 數(shù)組 4K字節(jié)的長(zhǎng)度, 這不是 一般的 8051 能夠擁有的XDATA長(zhǎng)度,要么是增強(qiáng)型51,要么是 真的外置擴(kuò)展 芯片了。 至少如果你的是 STC89C516的話,是無(wú)法提供那么多的。
回復(fù)

使用道具 舉報(bào)

15#
ID:57657 發(fā)表于 2021-12-6 07:51 | 只看該作者
188610329 發(fā)表于 2021-12-5 20:45
也就整個(gè)貪吃蛇,壓根沒(méi)必要整什么動(dòng)態(tài)內(nèi)存。而且,你本質(zhì)上不應(yīng)該把它當(dāng)作“蛇”,就應(yīng)該是認(rèn)為是一個(gè)二維 ...

無(wú)論是什么點(diǎn)陣游戲,都屬于二維流水燈,這類算法本身就有難度,你應(yīng)該先用C或C++實(shí)現(xiàn),然后再移植進(jìn)去。
回復(fù)

使用道具 舉報(bào)

16#
ID:988145 發(fā)表于 2021-12-6 13:27 | 只看該作者
188610329 發(fā)表于 2021-12-5 23:35
后面 0x1000 是長(zhǎng)度, 表示你定義這個(gè) 數(shù)組 4K字節(jié)的長(zhǎng)度, 這不是 一般的 8051 能夠擁有的XDATA長(zhǎng)度,要 ...

感謝!
昨天看上面說(shuō)不能用內(nèi)存分配我就數(shù)組寫了,用數(shù)組確實(shí)簡(jiǎn)單很多,但看了你說(shuō)的,我把內(nèi)存池調(diào)到一個(gè)合適大小就能正常運(yùn)行了,但可惜運(yùn)行一會(huì)就會(huì)出錯(cuò)了,我猜測(cè)可能是因?yàn)閮?nèi)存實(shí)在是太小了再加上碎片化導(dǎo)致運(yùn)行一段時(shí)間后malloc就不能正確分配內(nèi)存了。用struct和malloc主要還是c++的編程思路一直會(huì)影響我,看來(lái)以后寫單片機(jī)還是得認(rèn)清性能問(wèn)題
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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