搜索
bottom↓
回复: 10

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

[复制链接]

出0入0汤圆

发表于 2012-12-10 16:46:27 | 显示全部楼层 |阅读模式
本帖最后由 xylslss 于 2012-12-11 10:17 编辑

在做设计的过程中用到链表,想把该链表放在Atmega64的自带2K eeprom中,其间需要用到动态分配空间的函数malloc,现在出现的问题是malloc分配结果出错了,程序如下:
typedef  struct BOX
{
        unsigned int rly_num;            //继电器号
        unsigned int box_num;            //箱子号码
        unsigned int box_code;           //箱子密码
        unsigned char card_num[4];       //卡序列号
        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中吗?如果可以要怎么操作?


阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2012-12-10 17:13:21 | 显示全部楼层
我认为链表不能存EEPROM。

出0入42汤圆

发表于 2012-12-10 17:50:18 | 显示全部楼层
malloc函数(这里特指AVR Libc头文件stdlib.h中提供的那个),似乎只能用于内部or外部SRAM。

出0入0汤圆

 楼主| 发表于 2012-12-10 18:38:37 | 显示全部楼层
jimmy_xt 发表于 2012-12-10 17:50
malloc函数(这里特指AVR Libc头文件stdlib.h中提供的那个),似乎只能用于内部or外部SRAM。 ...

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

出0入0汤圆

发表于 2012-12-10 20:35:12 | 显示全部楼层
链表能用在EEPROM中,但指针要改为EEPROM地址

出0入0汤圆

发表于 2012-12-10 20:49:57 | 显示全部楼层
同意楼上,注意指针的地址

出0入0汤圆

 楼主| 发表于 2012-12-10 22:46:53 | 显示全部楼层
duanll 发表于 2012-12-10 20:35
链表能用在EEPROM中,但指针要改为EEPROM地址

sBOX __eeprom *ps;

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

出0入76汤圆

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

出0入0汤圆

 楼主| 发表于 2012-12-10 23:18:07 | 显示全部楼层
foxpro2005 发表于 2012-12-10 23:05
如果直接用malloc()来分配,估计在EEPROM中是没法实现的,具体你可以看对应编译器malloc函数的介绍。
如果 ...

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

出0入0汤圆

发表于 2012-12-11 09:47:17 | 显示全部楼层
如果你真要用 malloc函数 的话,你得自己写此函数。你以前是做上位机编程的吧?看起来你还不完全理解EEPROM
头像被屏蔽

出0入0汤圆

发表于 2012-12-11 10:06:21 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 05:15

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表