微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 在DSP系统中Nand+Flash存储管理的实现

在DSP系统中Nand+Flash存储管理的实现

时间:05-06 来源:3721RD 点击:

,如不存在坏块管理表则应首先应建立相应的坏块管理表, 参照坏块表根据每一块的第517字节建立各个链表Free_List,Valid_List,Invalid_List, Reserved_List,初始化并按擦除次数非递减序排列各链表。当无效块因擦除成为新的空闲块 时,根据块擦除次数插入到空闲链表中相应位置,当需要写入数据到新的空闲块时则取用空 闲链表的链首所指空闲块,写入数据有效后则标识该块为有效块,否则标识为无效块,通过 这样的管理方式保证每次都是使用空闲链表中擦除次数最小的块,从而使磨损达到均衡。

对于静态数据块(指的是Flash中存储的不经常被修改的数据)[3],在本文中采用的处 理方法是当空闲块中的最大擦除次数与有效块中的最小擦除次数之差大于某一设定阀值(该 阀值不能过小,否则数据搬迁将过于频繁),则迁移该有效块中数据至空闲链表中擦除次数 最大的块中,从而避免因某些数据块被静态数据长时间占用而使得其它数据块的磨损加剧, 进而可使得整个Flash的磨损趋于平衡。

对于无效块的擦除回收本文的设计是在有足够空闲块的情况下一般是在系统空闲或上 电时进行,这样能节约更多宝贵的系统资源以进行更重要的工作,当在系统运行过程中,如 果空闲块块数与无效块块数的比值超出一个阀值(本系统取50),则启动程序回收所有无效 块。这个阀值应取得适中,如太大则使得回收过于频繁,太少的话一方面使空闲空间过少, 另一方面一旦启动回收程序,因要回收块数过多,从而使采集数据的实时输入受到影响,本 系统中取空闲块与无效块的比值作为阀值,好处是只要空闲块块数足够,无效块回收基本在系统初始化是进行,即使在采集过程中回收占用的时间也是十分微小,这样的设计对实时性要求极高的嵌入式系统是很有好处的。

3.4 Flash存储管理的程序实现

对于Nand Flash在DSP嵌入式系统中的使用,其接口方式与读写方法与在其他单片机中的方法都是一样的,参考[1]中提供的流程图就可以完成,其难点在于如何管理,在其管理中,对链表数据结构的操作是最重要的,下面将给出本文系统中用DSP TMS320F28x如何实现Nand Flash存储管理的链表操作的关键程序代码,结合具体的要求只需要进行简单的修改即可满足在新系统中的应用。

在DSP系统工程中的CMD文件中,对于段的定义一定要为.systemmem分配一定的可用RAM空间[ 4 ],这个大小跟系统后面malloc函数要分配的动态内存空间有关,以便在产生一个新的结点时申请一个结点类型大小的空间,在结点销毁时可对空间进行释放,定义系统中链表结点的类型为:

typedef struct List_Data
{
unsigned int Block_ld; //用以存储该结点对应的FLASH物理块地址0-1023
unsigned long Erase_Data; //用以存储该结点对应的FLASH物理块的擦除次数
struct List_Data *next; //指向下一个结点
}TagList, TagNode; //两种变量类型,区分链表与结点
TagList, Free_List, Valid_List,Reserved_List; //根据名称依次对应四个链表

通过这样的定义就可以得到四个带头结点的链表,头结点的数库域中是没有信息的,每 一个链表的头结点都指向该链表的首元素,如不存在则指向NULL,程序中必须初始化指针, 否则会造成致命的系统错误。下面给出链表的初始化程序,结点生成及销毁程序,其他的函 数就不一一列举,只给出其相应函数名及功能介绍。

void InitList(TagList * list)
{//---------带头结点的链表初始化---------//}
list->next=NULL;
TagNode * NewNode (unsigned int NewBlock_Id, unsigned long NewErase_Count)
{//-----------由块号与擦除次数生成一个链表结点-------------//}
TagNode *pNew=NULL;
pNew=(TagNode *)malloc(sizeof(TagNode));
if(pNew!=NULL)
{
pNew->Block_Id=NewBlock_Id;
pNew->Erase_Data=NewErase_Count;
pNew->next=NULL;
}
retuen pNew;
}
void DeleteFirst(TagList *list)
{//---------删除链表中首元素----------//}
TagNode *pCur=NULL;
pCur=list->next;
if(pCur)
{list->next=pCur->next;
free(pCur);}
}
void InsertNode(TagList *list, TagNode *pNew)
{//-----------按块擦除次数非递减次序将新点插入链表-----------//}
......}
TagNode * GetNode(TagList * list, unsigned int position)
{//----------按取指定位置元素如超出链表长度则返回最后一个----------//}
......}
unsigned int GetListLength(TagList *list)
{//----------获取链表长度----------//}
......}

4 结论

本文创新点在于:从Nand Flash的特性出发,深入讨论了

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top