[問題] 8051中實作queue link的問題

作者: deo2000 (800IM)   2014-01-28 12:35:05
用 malloc 時發現
在 keil 必須先用 xdata 全域變數要好空間,
再用 init_mempool() 指定這塊 xdata空間可供動態配置
問題1:這樣好像不是真的動態記憶體配置?
我用一個有 1024bytes XRAM 的 8051 實作 queue link list
目前先做 push only, 就是只能增加元素
每次都用 UART 傳入要 push 的字元,然後也用 UART 傳出陣列的所有元素
code如下
http://paste.ideaslabs.com/show/dDk6DPBITu
UART輸出如下
sizeof(struct Node)=4
sizeof(struct Node*)=3
sizeof(char)=1
FIFO Start!
&(ptrX->Humidity)=100y i=1
&(ptrX->Humidity)=100yy i=2
...(略)
&(ptrX->Humidity)=100yyyyyyyyyyyyyyyyyyyyyyyyyyyy i=28
&(ptrX->Humidity)=100yyyyyyyyyyyyyyyyyyyyyyyyyyyyy i=29
&(ptrX->Humidity)=100yyyyyyyyyyyyyyyyyyyyyyyyyyyyyy i=30
&(ptrX->Humidity)=100yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy i=31
&(ptrX->Humidity)=100yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy i=32
&(ptrX->Humidity)=100yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy i=32
&(ptrX->Humidity)=100yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy i=32
&(ptrX->Humidity)=100yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy i=32
問題2:為何sizeof(struct Node*)=3而不是2?
資料記憶體最大範圍只有0x0000~0xFFFF而已
問題3:ptrX為何每次都相同?
ptrX每次push都會接在尾巴用掉,下次push又會再用malloc重新要一塊,
    應該會不同才對啊?
為了確認這個問題,我在VS2012中做一次,的確是每次要到的位址都會固定增加
問題4:init_mempool要了0x100個char, 每個struct Node大小為4(單位大小同char)
應該可放256/4=64個struct Node,但是實驗結果只能放32個
作者: ksmrt0123 (ksmrt)   2014-02-04 11:40:00
問題2, 因為你宣告的是generic pointer, 需要多一個byte來判別pointer指到的位置是data, idata, xdata等改成sizeof(struct Node xdata *)應該就會變2 bytespush/pop是stack的operations, queue是enqueue/dequeue,
作者: ruemann (路人甲)   2014-02-05 14:11:00
問題3 你是怎麼觀察到每次ptrX都相同啊?
作者: ksmrt0123 (ksmrt)   2014-02-10 00:19:00
問題3你print出來的值不正確, 原因同問題2.問題4 去\keil\c51\lib找相關 .c source code

Links booklink

Contact Us: admin [ a t ] ucptt.com