[问题] 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