From 92bfa80e7774c7d5a9f4ece4904ca2c5bd0a8cb7 Mon Sep 17 00:00:00 2001 From: coffee Date: Tue, 2 Dec 2025 11:04:31 +0800 Subject: [PATCH] =?UTF-8?q?1.=20=E4=BF=AE=E5=A4=8D=E8=B6=8A=E4=BD=8D?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/HFlashServer.h | 4 ++-- src/HFlashServer.c | 16 +++++++++++----- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/include/HFlashServer.h b/include/HFlashServer.h index d13fb0a..53c95f9 100644 --- a/include/HFlashServer.h +++ b/include/HFlashServer.h @@ -107,7 +107,7 @@ void HFlashSetPageCache(HFlashCacheInfo *pageInfo, uint16_t size); void HFlashSetPageAddr(HFlashAddr_t addr, uint32_t size); /** - * @brief HFlashSetPageBackupAddr 设置页表备份地址 + * @brief HFlashSetPageBackupAddr 设置页表备份地址, 需要先设置页表再设置备份 * @param addr 地址 * @param size 大小, 必须和页表地址大小相同 */ @@ -121,7 +121,7 @@ void HFlashSetPageBackupAddr(HFlashAddr_t addr, uint32_t size); void HFlashSetProtectAddr(HFlashAddr_t addr, uint32_t size); /** - * @brief HFlashSetProtectBackupAddr 设置保护备份地址 + * @brief HFlashSetProtectBackupAddr 设置保护备份地址, 需要先设置保护地址再设置备份 * @param addr 地址 * @param size 大小, 必须和保护地址大小相同 */ diff --git a/src/HFlashServer.c b/src/HFlashServer.c index 86efc0d..07ec161 100644 --- a/src/HFlashServer.c +++ b/src/HFlashServer.c @@ -591,7 +591,7 @@ static HFlashCacheInfo *FindCache(HFlashAddr_t addr) memset(&cache, 0, sizeof(HFlashCacheInfo)); cache.info.addr = addr; 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) { ++sInfo.pageCacheUseNum; } @@ -605,6 +605,7 @@ static HFlashCacheInfo *FindCache(HFlashAddr_t addr) return &sInfo.pageCache[index]; } + LogE("addr[0x%08x] not find", addr); return NULL; } @@ -618,6 +619,7 @@ void HFlashInitCallback(HFlashReadCallback read, HFlashWriteCallback write, HFla void HFlashSetPageCache(HFlashCacheInfo *pageInfo, uint16_t size) { sInfo.pageCache = pageInfo; + sInfo.pageCacheUseNum = 0; sInfo.pageCacheSize = size; } @@ -729,7 +731,6 @@ void HFlashRegister(HFlashAddr_t addr, uint32_t size) sPageInfo.needBackupPage = 1; StartBackupTimer(); - // RestoreBackup(sInfo.protectAddr, sInfo.protectBackupAddr, sInfo.protectSize); return ; } @@ -761,9 +762,12 @@ void HFlashRegister(HFlashAddr_t addr, uint32_t size) return ; } - // 恢复后数据还是错误的, 需要将页表数据使用长度修正0, 避免异常数据导致程序异常 + // 恢复后数据还是错误的, 需要将该页表数据重新初始化 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.size = size; cache->info.crc32 = GetFlashCrc32(cache->info.addr, cache->info.useSize); WriteCachePage(cache); } @@ -780,7 +784,7 @@ uint8_t HFlashWrite(HFlashAddr_t addr, void *data, uint32_t 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; } @@ -869,7 +873,8 @@ uint8_t HFlashStreamWrite(HFlashAddr_t addr, void *data, uint32_t size) 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.modifyCount; return result; @@ -964,6 +969,7 @@ void HFlashUpdateVersion(HFlashAddr_t addr, uint16_t newVersion, HFlashUpdateVer callback(addr, oldVersion, newVersion, userData); } + // 如果回调没有进行页写入, 需要进行页写入 if (cache->waitWrite) { WriteCachePage(cache); }