优化数据擦除算法,避免不必要的重复擦除。比如连续地址写入数据时,可避免多次重复擦除。

未编译未测试
This commit is contained in:
Stone 2015-10-14 17:12:14 +00:00
parent 2f515a2525
commit 8643bdd288
2 changed files with 14 additions and 5 deletions

View File

@ -133,23 +133,32 @@ bool BlockStorage::Erase(uint address, uint len)
// 该地址所在的块 // 该地址所在的块
uint addr = address - ((uint)address % Block); uint addr = address - ((uint)address % Block);
uint end = address + len; uint end = address + len;
// 需要检查是否擦除的范围,从第一段开始
uint addr2 = address;
uint len2 = addr + Block - address;
// 如果还不够一段,则直接长度
if(len2 > len) len2 = len;
while(addr < end) while(addr < end)
{ {
EraseBlock(addr); if(!IsErased(addr2, len2)) EraseBlock(addr);
addr += Block; addr += Block;
// 下一段肯定紧跟着人家开始
addr2 = addr;
len2 = end - addr;
if(len2 > Block) len2 = Block;
} }
return true; return true;
} }
/* 指定块是否被擦除 */ /* 指定块是否被擦除 */
bool BlockStorage::IsBlockErased(uint address, uint len) bool BlockStorage::IsErased(uint address, uint len)
{ {
if(address < Start || address + len > Start + Size) return false; if(address < Start || address + len > Start + Size) return false;
#if STORAGE_DEBUG #if STORAGE_DEBUG
debug_printf("BlockStorage::IsBlockErased(0x%08x, %d )\r\n", address, len); //debug_printf("BlockStorage::IsErased(0x%08x, %d)\r\n", address, len);
#endif #endif
ushort* p = (ushort*)address; ushort* p = (ushort*)address;

View File

@ -38,7 +38,7 @@ protected:
// 擦除块 // 擦除块
virtual bool EraseBlock(uint address) = 0; virtual bool EraseBlock(uint address) = 0;
// 指定块是否被擦除 // 指定块是否被擦除
virtual bool IsBlockErased(uint address, uint len); virtual bool IsErased(uint address, uint len);
}; };
#endif #endif