久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4760|回復(fù): 15
收起左側(cè)

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

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

堆初始化

堆初始化

全局函數(shù)

全局函數(shù)

蛇初始化

蛇初始化

蛇的定義

蛇的定義

蛇位置更新

蛇位置更新

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

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

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

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

主函數(shù)

主函數(shù)

snake.rar

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

工程

回復(fù)

使用道具 舉報(bào)

ID:230742 發(fā)表于 2021-12-5 11:05 | 顯示全部樓層
本論壇有強(qiáng)大的搜索功能,搜索一下。有其它大佬的程序,先下載下來學(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)存是不是開玩笑?
回復(fù)

使用道具 舉報(bào)

ID:139866 發(fā)表于 2021-12-5 12:34 | 顯示全部樓層
回復(fù)

使用道具 舉報(bào)

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)存是不是開玩笑?

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

使用道具 舉報(bào)

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]; 這條語句后面的 [0x1000] 是指定起始地址嗎
回復(fù)

使用道具 舉報(bào)

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)存是不是開玩笑?

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

使用道具 舉報(bào)

ID:883242 發(fā)表于 2021-12-5 16:28 | 顯示全部樓層
npn 發(fā)表于 2021-12-5 15:44
STC8一出現(xiàn),STM8就會(huì)慢慢淘汰了。
沒看見代碼里用了XDATA內(nèi)存? 有64KB的尋址范圍。

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

使用道具 舉報(bào)

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ū)別,這就是在國內(nèi)越來越?jīng)]人用三星,哪國的品牌只有那國人用的多。
回復(fù)

使用道具 舉報(bào)

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è),這就是在國內(nèi)開始淘汰的原因,你可以站內(nèi)高級搜索。
回復(fù)

使用道具 舉報(bào)

ID:624769 發(fā)表于 2021-12-5 20:00 來自手機(jī) | 顯示全部樓層
樓上的,你們樓歪了!!!
回復(fù)

使用道具 舉報(bào)

ID:624769 發(fā)表于 2021-12-5 20:34 | 顯示全部樓層
會(huì)會(huì)會(huì)不會(huì) 發(fā)表于 2021-12-5 14:58
我用的是89c516, 還是說不管是c51還是c516,我能訪問的ram只有120字節(jié)?如果這么說的話倒也就合理了,走 ...

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

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

ID:624769 發(fā)表于 2021-12-5 23:35 | 顯示全部樓層
會(huì)會(huì)會(huì)不會(huì) 發(fā)表于 2021-12-5 15:01
還有就是其中 unsigned char xdata malloc_mempool [0x1000]; 這條語句后面的 [0x1000] 是指定 ...

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

使用道具 舉報(bào)

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

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

使用道具 舉報(bào)

ID:988145 發(fā)表于 2021-12-6 13:27 | 顯示全部樓層
188610329 發(fā)表于 2021-12-5 23:35
后面 0x1000 是長度, 表示你定義這個(gè) 數(shù)組 4K字節(jié)的長度, 這不是 一般的 8051 能夠擁有的XDATA長度,要 ...

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

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 午夜视频在线 | 日韩成人在线视频 | 日中文字幕在线 | 久久精品国产久精国产 | 91色综合 | 综合久久国产 | 日韩精品久久久久久 | 人人干免费 | 国产一区二区电影 | 久久亚洲国产精品日日av夜夜 | 成人一区二区电影 | 国产免费拔擦拔擦8x高清 | 亚洲激情自拍偷拍 | 欧美一区二区三 | 亚洲人成在线播放 | 国产精品久久 | 精品美女视频在线观看免费软件 | 久在线| 日韩伦理一区二区 | 欧美日韩免费一区二区三区 | 国产精品一区一区三区 | 欧美黄色一级毛片 | 欧美激情黄色 | 欧美成人激情 | 人人种亚洲 | 欧美精品久久久 | 日韩一区二区三区av | 九九激情视频 | 中日av | 啪啪av| 玖玖玖av| 乱一性一乱一交一视频a∨ 色爱av | 欧美日韩精品一区二区三区四区 | 亚洲精品国产电影 | 一级片av | 日韩欧美在 | 日韩精品一区二区三区免费视频 | 日本涩涩视频 | 亚洲欧洲日韩精品 中文字幕 | 色一情一乱一伦一区二区三区 | 一区二区三区欧美 |