1. 修复越位问题
This commit is contained in:
parent
e1d52c26de
commit
92bfa80e77
@ -107,7 +107,7 @@ void HFlashSetPageCache(HFlashCacheInfo *pageInfo, uint16_t size);
|
|||||||
void HFlashSetPageAddr(HFlashAddr_t addr, uint32_t size);
|
void HFlashSetPageAddr(HFlashAddr_t addr, uint32_t size);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief HFlashSetPageBackupAddr 设置页表备份地址
|
* @brief HFlashSetPageBackupAddr 设置页表备份地址, 需要先设置页表再设置备份
|
||||||
* @param addr 地址
|
* @param addr 地址
|
||||||
* @param size 大小, 必须和页表地址大小相同
|
* @param size 大小, 必须和页表地址大小相同
|
||||||
*/
|
*/
|
||||||
@ -121,7 +121,7 @@ void HFlashSetPageBackupAddr(HFlashAddr_t addr, uint32_t size);
|
|||||||
void HFlashSetProtectAddr(HFlashAddr_t addr, uint32_t size);
|
void HFlashSetProtectAddr(HFlashAddr_t addr, uint32_t size);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief HFlashSetProtectBackupAddr 设置保护备份地址
|
* @brief HFlashSetProtectBackupAddr 设置保护备份地址, 需要先设置保护地址再设置备份
|
||||||
* @param addr 地址
|
* @param addr 地址
|
||||||
* @param size 大小, 必须和保护地址大小相同
|
* @param size 大小, 必须和保护地址大小相同
|
||||||
*/
|
*/
|
||||||
|
|||||||
@ -591,7 +591,7 @@ static HFlashCacheInfo *FindCache(HFlashAddr_t addr)
|
|||||||
memset(&cache, 0, sizeof(HFlashCacheInfo));
|
memset(&cache, 0, sizeof(HFlashCacheInfo));
|
||||||
cache.info.addr = addr;
|
cache.info.addr = addr;
|
||||||
if (ScanPage(_FindCacheHelper, &cache)) {
|
if (ScanPage(_FindCacheHelper, &cache)) {
|
||||||
const uint16_t index = sInfo.pageCacheUseNum;
|
const uint16_t index = FLASH_MIN(uint16_t, sInfo.pageCacheUseNum, sInfo.pageCacheSize - 1);
|
||||||
if (sInfo.pageCacheUseNum < sInfo.pageCacheSize) {
|
if (sInfo.pageCacheUseNum < sInfo.pageCacheSize) {
|
||||||
++sInfo.pageCacheUseNum;
|
++sInfo.pageCacheUseNum;
|
||||||
}
|
}
|
||||||
@ -605,6 +605,7 @@ static HFlashCacheInfo *FindCache(HFlashAddr_t addr)
|
|||||||
return &sInfo.pageCache[index];
|
return &sInfo.pageCache[index];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LogE("addr[0x%08x] not find", addr);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -618,6 +619,7 @@ void HFlashInitCallback(HFlashReadCallback read, HFlashWriteCallback write, HFla
|
|||||||
void HFlashSetPageCache(HFlashCacheInfo *pageInfo, uint16_t size)
|
void HFlashSetPageCache(HFlashCacheInfo *pageInfo, uint16_t size)
|
||||||
{
|
{
|
||||||
sInfo.pageCache = pageInfo;
|
sInfo.pageCache = pageInfo;
|
||||||
|
sInfo.pageCacheUseNum = 0;
|
||||||
sInfo.pageCacheSize = size;
|
sInfo.pageCacheSize = size;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -729,7 +731,6 @@ void HFlashRegister(HFlashAddr_t addr, uint32_t size)
|
|||||||
|
|
||||||
sPageInfo.needBackupPage = 1;
|
sPageInfo.needBackupPage = 1;
|
||||||
StartBackupTimer();
|
StartBackupTimer();
|
||||||
// RestoreBackup(sInfo.protectAddr, sInfo.protectBackupAddr, sInfo.protectSize);
|
|
||||||
return ;
|
return ;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -761,9 +762,12 @@ void HFlashRegister(HFlashAddr_t addr, uint32_t size)
|
|||||||
return ;
|
return ;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 恢复后数据还是错误的, 需要将页表数据使用长度修正0, 避免异常数据导致程序异常
|
// 恢复后数据还是错误的, 需要将该页表数据重新初始化
|
||||||
LogE("addr[0x%08x] size[%d] crc32 not match", cache->info.addr, cache->info.size);
|
LogE("addr[0x%08x] size[%d] crc32 not match", cache->info.addr, cache->info.size);
|
||||||
|
memset(cache->info.reverse, 0, sizeof(cache->info));
|
||||||
|
cache->info.addr = addr;
|
||||||
cache->info.useSize = 0;
|
cache->info.useSize = 0;
|
||||||
|
cache->info.size = size;
|
||||||
cache->info.crc32 = GetFlashCrc32(cache->info.addr, cache->info.useSize);
|
cache->info.crc32 = GetFlashCrc32(cache->info.addr, cache->info.useSize);
|
||||||
WriteCachePage(cache);
|
WriteCachePage(cache);
|
||||||
}
|
}
|
||||||
@ -780,7 +784,7 @@ uint8_t HFlashWrite(HFlashAddr_t addr, void *data, uint32_t size)
|
|||||||
|
|
||||||
// 检查写入数据大小是否超出注册提供的大小范围
|
// 检查写入数据大小是否超出注册提供的大小范围
|
||||||
if (cache->info.size < size) {
|
if (cache->info.size < size) {
|
||||||
FATAL_ERROR("addr[0x%08x] size[%d] overflow", addr, size);
|
FATAL_ERROR("addr[0x%08x], size[%d], max size[%d] overflow", addr, size, cache->info.size);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -869,7 +873,8 @@ uint8_t HFlashStreamWrite(HFlashAddr_t addr, void *data, uint32_t size)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
WriteFlash(addr + cache->info.useSize, data, size);
|
result = WriteFlash(addr + cache->info.useSize, data, size);
|
||||||
|
cache->waitWrite = 1;
|
||||||
cache->info.useSize += size;
|
cache->info.useSize += size;
|
||||||
++cache->info.modifyCount;
|
++cache->info.modifyCount;
|
||||||
return result;
|
return result;
|
||||||
@ -964,6 +969,7 @@ void HFlashUpdateVersion(HFlashAddr_t addr, uint16_t newVersion, HFlashUpdateVer
|
|||||||
callback(addr, oldVersion, newVersion, userData);
|
callback(addr, oldVersion, newVersion, userData);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 如果回调没有进行页写入, 需要进行页写入
|
||||||
if (cache->waitWrite) {
|
if (cache->waitWrite) {
|
||||||
WriteCachePage(cache);
|
WriteCachePage(cache);
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user