当前位置: 代码迷 >> 单片机 >> 关于STC 89c516 RD+在xdata区用链表的有关问题
  详细解决方案

关于STC 89c516 RD+在xdata区用链表的有关问题

热度:234   发布时间:2016-04-28 16:29:58.0
关于STC 89c516 RD+在xdata区用链表的问题
写了个链表程序,在keil上调试能成功,但是放在单片机里调试时就出问题了

#define mempoolsize 512; //定义动态内存分配池大小
#define startpool 511; //定义动态内存分配池开始地址

//节点结构
typedef struct Lnode{ 
uchar edata;
struct Lnode xdata *next;
}Lnode,xdata *Link;

//表结构
typedef struct {
Link head,tail;
uint len;
}Linklist;

Linklist xdata res; //接收回答链表
Linklist xdata datastream ; //数据流表
Linklist xdata callnumber,message; //号码以及信息链表
uint data PC_Value, SP_Value; //储存中断返回点、SP初值的全局变量
uchar data Ctrl_Code; //控制任务切换的全局变量,在中断函数里被赋值

void main()
{
int initpool;
int xdata *pool;
int size;
AUXR=0;
size=mempoolsize;
pool=startpool;
initpool=init_mempool (pool,size);
iniRs232(); //串行口初始化
if(initpool) sendchar('1'); *************************** (1)
else sendchar('0');  

initlist(&res); //链表初始化,程序见下.
initlist(&datastream);
initlist(&callnumber);
initlist(&message);
Ctrl_Code=0;
sendchar('2'); *************************** (2)
...............
............
........
....


void initlist(Linklist *l)
//构造一空链表
//input:指向链表l的指针
{
l->head=l->tail=(Link)malloc(sizeof(Lnode));
(*l).len=0;
(*l).tail->next=NULL;

}



用的是STC 89C516 RD+ 里面集成了一个1K的RAM,可以直接当外置RAM用。
我用的LARGE模式。

程序放单片机里运行时,打开串口调试,能接收到(1)处的sendchar('1');说明分配pool成功。
但是下面(2)处的sendchar('2');一直就收不到了;
悲剧啊。

请问是怎么回事?谢谢
p.s:是不是xdata速度太慢了? 不过也不会慢得这么离谱吧。

------解决方案--------------------
xdata的速度决不会那么慢的,它的慢是相对于data来说的。

照你的描述,你可以先尝试一下,把红字和蓝字部分互换位置,先搞清楚,是那个地方造成了现在的结果

initlist(&res); //链表初始化,程序见下.
initlist(&datastream);
initlist(&callnumber);
initlist(&message);
Ctrl_Code=0;
sendchar('2'); *************************** (2)