1. 修复越位问题

This commit is contained in:
coffee 2025-12-02 11:04:31 +08:00
parent e1d52c26de
commit 92bfa80e77
2 changed files with 13 additions and 7 deletions

View File

@ -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 ,
*/ */

View File

@ -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);
} }