xylslss 发表于 2012-12-10 16:46:27

在Atmega64的eeprom中如何创建链表?

本帖最后由 xylslss 于 2012-12-11 10:17 编辑

在做设计的过程中用到链表,想把该链表放在Atmega64的自带2K eeprom中,其间需要用到动态分配空间的函数malloc,现在出现的问题是malloc分配结果出错了,程序如下:
typedefstruct BOX
{
        unsigned int rly_num;            //继电器号
        unsigned int box_num;            //箱子号码
        unsigned int box_code;         //箱子密码
        unsigned char card_num;       //卡序列号
        unsigned char rank;            //级别:管理员/普通用户=1/2
        unsigned int year;               //截止日期:年
        unsigned char month;             //截止日期:月
        unsigned char day;               //截止日期:日
        unsigned char hour;            //截止日期:时
        unsigned char minute;            //截止日期:分
        struct BOX *last;                //链表链接,链接上一个单元
        struct BOX *next;                //链表链接,链接下一个单元
}sBOX;

sBOX*head=NULL,*tail=NULL;      //全局变量

//创建链表
void link_creat(sBOX *ps_in)            
{
        sBOX *ps_new;                                          //要插入的结构体指针
        ps_new=(sBOX *)malloc(sizeof(sBOX));         //分配空间程序在这出错:当链表为空时,这里分配一个空间作为表头,之后再次增加节点时,分配空间的结果为NULL

      if(ps_new==NULL) return;

        save1to2(ps_in,ps_new);

        if(head==NULL)                                           //链表为空
        {
                head=ps_new;
                (*head).last=head;
                (*head).next=NULL;
                tail=head;
        }
        else
        {
                (*tail).next=ps_new;
                (*ps_new).last=tail;
                (*ps_new).next=NULL;
                tail=ps_new;
        }
}

求高手指点!!!另外链表能存放在eeprom中吗?如果可以要怎么操作?


Excellence 发表于 2012-12-10 17:13:21

我认为链表不能存EEPROM。

jimmy_xt 发表于 2012-12-10 17:50:18

malloc函数(这里特指AVR Libc头文件stdlib.h中提供的那个),似乎只能用于内部or外部SRAM。

xylslss 发表于 2012-12-10 18:38:37

jimmy_xt 发表于 2012-12-10 17:50 static/image/common/back.gif
malloc函数(这里特指AVR Libc头文件stdlib.h中提供的那个),似乎只能用于内部or外部SRAM。 ...

我用的就是stdlib.h中的那个。那对于我红色标注的那个地方出错你有什么看法吗?有人说是内存空间不够用了,然后我就重新新建了一个工程,只用来编译这段程序,还是出错了,第二次返回的值还是null

duanll 发表于 2012-12-10 20:35:12

链表能用在EEPROM中,但指针要改为EEPROM地址

wxfje 发表于 2012-12-10 20:49:57

同意楼上,注意指针的地址

xylslss 发表于 2012-12-10 22:46:53

duanll 发表于 2012-12-10 20:35 static/image/common/back.gif
链表能用在EEPROM中,但指针要改为EEPROM地址

sBOX __eeprom *ps;

这样子定义的ps指针是不是就是存放在eeprom中了?
如果这样可以的话,malloc()这个函数要怎么在eeprom中分配空间给ps指针?

foxpro2005 发表于 2012-12-10 23:05:13

如果直接用malloc()来分配,估计在EEPROM中是没法实现的,具体你可以看对应编译器malloc函数的介绍。
如果你非得要这么用,可以换一种方式来实现,具体可以去看看傻孩子大侠的那本教材 《深入浅出AVR单片机》,第12章 指针、数组第13章 堆、栈 等部分内容,可能会从中得到答案...

xylslss 发表于 2012-12-10 23:18:07

foxpro2005 发表于 2012-12-10 23:05 static/image/common/back.gif
如果直接用malloc()来分配,估计在EEPROM中是没法实现的,具体你可以看对应编译器malloc函数的介绍。
如果 ...

谢谢,我先去看看这书,不会的再请教你。

duanll 发表于 2012-12-11 09:47:17

如果你真要用 malloc函数 的话,你得自己写此函数。你以前是做上位机编程的吧?看起来你还不完全理解EEPROM

armok 发表于 2012-12-11 10:06:21

页: [1]
查看完整版本: 在Atmega64的eeprom中如何创建链表?