如何在eeprom中整理数据

时间:2017-01-16 12:59:01

标签: c avr eeprom

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

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

我担心如果我只删除一些记录,那么内存将非常碎片化(因为每条记录都有不同长度的数据)。

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

我与avr atxmega合作。

3 个答案:

答案 0 :(得分:2)

您可以为记录定义最大大小,并使用它来保存数据。 你会得到一些空字节,但这会让你记住记忆的麻烦。

还要注意行业。部门是最小的擦除组。如果您的数据超出扇区的边界,则可能导致数据损坏。

答案 1 :(得分:0)

如果你实现了最合适的记忆,那么记忆碎片往往不会成为问题。算法(理想情况下,完全)重新使用"孔"而不是第一次适应" (那么你的交易速度是为了提高效率)。如果您的数据具有特定的粒度(这似乎是这种情况),您可以非常有效地工作。

使用链接的免费列表组织EEPROM中的空白区域,并确保在整个空闲列表中搜索要存储的数据完全的区域,或者在某个区域内可接受的间接费用。如果找不到这样的区域,请使用最大的免费区域。这严重降低了(如果不是避免,取决于您的数据)碎片。

答案 2 :(得分:0)

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

如果每条记录的大小可能在很大范围内变化,或者总数未定义(您希望尽可能多地使用),那么有两种碎片方法:

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

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

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