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