2017-01-16 67 views
2

在我的项目中,我需要保留eeprom中的各种记录,但是我还需要搜索(按地址),删除和编辑这些记录。这些记录是这样的:如何在eeprom中创建数据

[n bytes address1][data1][data2][data3] 
[n bytes address2][data1][data2] 
[n bytes address3][data1][data2][data3][data4][data5][data6] 

我怕如果我只是删除一些记录,然后内存将被很多碎片(因为每一个记录有数据的各种长度)。

此任务的最佳解决方案是什么?

我与avr atxmega一起工作。

+0

什么是最大和最小记录长度?有多少条记录? –

+0

约3000条记录,最小值约为40,最大值为80字节,我使用外部存储器,但我的问题在组织中。如何轻松地搜索和访问记录 – ZonderComand

+0

您可能有3000x80字节可用,我可能会将所有记录80或128字节与潜在的页面边界对齐。你如何“搜索”记录取决于你在找什么。我不认为某种分类会有意义,但可能是某种索引/标记/分组。 –

回答

2

您可以定义记录的最大大小并使用它来保存数据。 你会得到几个空字节,但它会打败追踪记忆的麻烦。

同时要当心部门。部门是要抹掉的最小组。如果您的数据超出扇区边界,则可能导致数据损坏。

+1

有关扇区擦除问题的好处,但在AVR器件上,EEPROM是可擦写/可擦写的,所以这不应该成为问题。除此之外,我同意这是一种简单直接的方法,但只是记录长度不会太大。 –

0

如果您实施“最佳拟合”算法(理想情况下,完全)重新使用“洞”而不是“第一个拟合”(您将交换速度为效率,然后)。如果你的数据有一定的粒度(这似乎是这种情况),你可以非常有效地工作。

使用链接的自由列表在EEPROM中组织空白区域,并确保从整个空闲列表中搜索要存储的数据片段的区域,该区域恰好为,或在某个可接受的开销边界内。如果您找不到这样的区域,请使用最大的免费区域。这严重减少(如果不能避免,取决于您的数据)碎片。

0

有几种方法,选择取决于EEPROM的大小,记录的最大数量(用N表示)和记录的最大大小(让我们为S): 第一种方法很明显:if(N * S)< =可用EEPROM大小,那么您可以为每条记录分配相同的最大大小块。例如,如果EEPROM大小为2048,并且每条记录最大为31个字节,且不超过64条记录,则可以分配64条记录,每条记录的长度为32个字节,并使用第一个字节表示记录的大小。

如果每个记录的大小可在宽范围内变化,或总数为未定义的(要杉尽可能),则在两个碎片接近:

1)进行碎片整理的数据。每次没有连续的所需大小的块可用时,您将移动所有数据,直到出现所需大小的空闲块。

例如,如果记录大小在127字节内变化,则可以使用第一个字节来表示块的类型和大小。例如。高位是1 - 当块空闲时,0 - 如果它包含数据。低7位包含块大小。 这种方法已经足够好了,但是由于数据被移动了,它可能需要以适当的方式更新所有对数据的引用。

2)存储数据碎片。您可以分配特定大小的块数(例如,每个32字节= 2048字节EEPROM的最大64个记录)。第一个将包含数据继续的块的索引,假设0xFE是链中最后一个块的值,0xFF - 表示空块。其他31个字节的块包含数据。 它可能会使读取过程稍微复杂一些,但是每个记录的数据位置在整个一段时间内都不会改变。

+0

哇谢谢你!这是使用第一个字节的非常好的解决方案! – ZonderComand