在我的项目中,我需要在eeprom
中保存各种记录,但也需要搜索(按地址)、删除和编辑这些记录。记录如下:
[n bytes address1][data1][data2][data3]
[n bytes address2][data1][data2]
[n bytes address3][data1][data2][data3][data4][data5][data6]
我担心如果我只是删除一些记录,那么内存将非常分散(因为每个记录都有不同长度的数据)。
此任务的最佳解决方案是什么?
我在avr atxmega
工作。
您可以定义记录的最大大小,并使用它来保存数据。你会得到一些空字节,但它可以省去跟踪内存的麻烦。
同时也要注意行业。扇区是要擦除的最小组。如果您的数据超出扇区边界,可能会导致数据损坏。
如果你实现了一个"最佳匹配"算法来(理想情况下,完全)重新使用"孔"而不是"第一次匹配"(那么,你会用速度换取效率),那么内存的碎片化问题往往会小得多。如果您的数据具有一定的粒度(似乎就是这样),您可以非常高效地工作。
使用链接的空闲列表组织EEPROM中的空白区域,并确保在整个空闲列表中搜索要存储的数据完全符合的区域,或者在一定可接受的开销范围内。如果你找不到这样的区域,请使用最大的空闲区域。这会严重减少(如果不能避免,取决于您的数据)碎片。
有几种方法,选择取决于EEPROM大小、记录的最大数量(用N表示)和记录的最大大小(用s表示):第一种方法非常明显:如果(N*S)<=空闲EEPROM大小,然后您可以为每个记录分配最大大小的相等块。例如,如果EEPROM大小为2048,每条记录的最大值为31字节,并且记录不超过64条,则可以分配64条记录,每条记录32字节,使用第一个字节表示记录的大小。
如果每条记录的大小可以在很大的范围内变化,或者总数没有定义(你想尽可能多地fir),那么有两种分段方法:
1) 对数据进行碎片整理。每次没有所需大小的连续块可用时,您都会移动所有数据,直到有所需尺寸的空闲块为止。
例如,如果记录大小在127字节内变化,您可以使用前一个字节来表示块的类型和大小。例如,较高的位是1-当块空闲时,0-如果它包含数据。低7位包含块大小。这种方法已经足够好了,但由于数据被移动,可能需要以适当的方式更新对数据的所有引用。
2) 将数据分段存储。您可以分配特定大小的块的数量(例如,每个32字节=2048字节EEPROM的最大64条记录)。第一个将包含数据继续的块的索引,假设0xFE是链中最后一个块的值,0xFF-表示空块。包含数据的块的其他31个字节。这可能会使读取过程稍微复杂一些,但每条记录的数据位置在整个时间段内都不会改变。