1. 增加Flash设置数据接口

2. 优化RingBuffer添加数据和获取数据
This commit is contained in:
coffee 2026-03-26 22:21:56 +08:00
parent 599e255653
commit a2c2ec8c83
3 changed files with 142 additions and 29 deletions

View File

@ -235,6 +235,16 @@ uint8_t HFlashWrite(HFlashAddr_t addr, const void *data, uint32_t size);
*/ */
uint8_t HFlashWriteOffset(HFlashAddr_t addr, uint32_t offset, const void *data, uint32_t size); uint8_t HFlashWriteOffset(HFlashAddr_t addr, uint32_t offset, const void *data, uint32_t size);
/**
* @brief HFlashWriteOffsetValue , 使0
* @param addr
* @param offset
* @param value
* @param size
* @return 1: 0:
*/
uint8_t HFlashWriteOffsetValue(HFlashAddr_t addr, uint32_t offset, uint8_t value, uint32_t size);
/** /**
* @brief HFlashWriteRawOffset Flash数据, , 使, 使 * @brief HFlashWriteRawOffset Flash数据, , 使, 使
* @param addr * @param addr
@ -322,6 +332,17 @@ typedef void (*HFlashUpdateVersionCallback)(HFlashAddr_t addr, uint16_t oldVersi
*/ */
void HFlashUpdateVersion(HFlashAddr_t addr, uint16_t newVersion, HFlashUpdateVersionCallback callback, void *userData); void HFlashUpdateVersion(HFlashAddr_t addr, uint16_t newVersion, HFlashUpdateVersionCallback callback, void *userData);
/**
* @brief HFlashUpgradeVersion ,
* ,
* , ,
* @param addr
* @param newVersion
* @param callback
* @param userData
*/
void HFlashUpgradeVersion(HFlashAddr_t addr, uint16_t newVersion, HFlashUpdateVersionCallback callback, void *userData);
/** /**
* @brief HFlashDefaultUpdateVersion , * @brief HFlashDefaultUpdateVersion ,
* @param addr * @param addr
@ -344,6 +365,14 @@ void HFlashDeleteData(HFlashAddr_t addr);
*/ */
uint32_t HFlashGetUseSize(HFlashAddr_t addr); uint32_t HFlashGetUseSize(HFlashAddr_t addr);
/**
* @brief HFlashSetUseSize Flash数据的使用大小
* @param addr
* @param size 使
* @return 1: 0:
*/
uint8_t HFlashSetUseSize(HFlashAddr_t addr, uint32_t size);
/** /**
* @brief HFlashGetSize Flash数据的大小 * @brief HFlashGetSize Flash数据的大小
* @param addr * @param addr

View File

@ -521,16 +521,16 @@ static void SyncBackup()
sBackupTimer = HTIMER_INVALID; sBackupTimer = HTIMER_INVALID;
} }
for (uint16_t i = 0; i < HVectorGetUseLen(sNeedBackupOffset); ++i) { for (HVectorLenType remain = HVectorGetUseLen(sNeedBackupOffset); remain > 0; --remain) {
const uint32_t addr = HVectorGetData(sNeedBackupOffset, i); const uint32_t addr = HVectorGetData(sNeedBackupOffset, remain - 1);
if (SyncBackupRange(addr, HFLASH_BLOCK_SIZE) == 0) { if (SyncBackupRange(addr, HFLASH_BLOCK_SIZE) == 0) {
LogE("RestorePage faild, addr[0x%08x]", addr); LogE("RestorePage faild, addr[0x%08x]", addr);
StartSyncBackupTimer(); StartSyncBackupTimer();
return ; return ;
} }
}
HVectorClear(sNeedBackupOffset); HVectorSetUseLen(sNeedBackupOffset, remain - 1);
}
// 备份页表数据 // 备份页表数据
const uint32_t crcValue = GetBackupCrc32(AdjustPageAddr(sInfo.pageAddr), AdjustPageByte(sPageInfo.useNum)); const uint32_t crcValue = GetBackupCrc32(AdjustPageAddr(sInfo.pageAddr), AdjustPageByte(sPageInfo.useNum));
@ -1706,6 +1706,40 @@ uint8_t HFlashWriteOffset(HFlashAddr_t addr, uint32_t offset, const void *data,
return WriteOffset(addr, offset, data, size, 1); return WriteOffset(addr, offset, data, size, 1);
} }
uint8_t HFlashWriteOffsetValue(HFlashAddr_t addr, uint32_t offset, uint8_t value, uint32_t size)
{
uint8_t result = 0;
HFlashCacheInfo *cache = FindCache(addr);
if (cache == NULL) {
FATAL_ERROR("addr[0x%08x] not register", addr);
return result;
}
const uint32_t useSize = offset + size;
if (cache->info.size < useSize) {
FATAL_ERROR("addr[0x%08x] size[%d] overflow", addr, useSize);
return result;
}
if (cache->info.useSize < useSize) {
if (cache->info.useSize < offset) {
WriteFlashValue(addr + cache->info.useSize, offset - cache->info.useSize, 0);
}
cache->info.useSize = useSize;
}
result = WriteFlashValue(addr + offset, size, value);
cache->waitCrc = 1;
WriteCachePage(cache);
if (IsProtect(addr, size)) {
AddBackupOffsetAddr(addr, offset, size);
}
return result;
}
uint8_t HFlashWriteRawOffset(HFlashAddr_t addr, uint32_t offset, const void *data, uint32_t size) uint8_t HFlashWriteRawOffset(HFlashAddr_t addr, uint32_t offset, const void *data, uint32_t size)
{ {
return WriteOffset(addr, offset, data, size, 0); return WriteOffset(addr, offset, data, size, 0);
@ -1818,7 +1852,7 @@ uint8_t HFlashRawRead(HFlashAddr_t addr, void *data, uint32_t size)
return ReadFlashCall(addr, data, size); return ReadFlashCall(addr, data, size);
} }
void HFlashUpdateVersion(HFlashAddr_t addr, uint16_t newVersion, HFlashUpdateVersionCallback callback, void *userData) static void UpdateVersionInner(HFlashAddr_t addr, uint16_t newVersion, HFlashUpdateVersionCallback callback, void *userData, uint8_t onlyUpgrade)
{ {
HFlashCacheInfo *cache = FindCache(addr); HFlashCacheInfo *cache = FindCache(addr);
if (cache == NULL) { if (cache == NULL) {
@ -1830,6 +1864,10 @@ void HFlashUpdateVersion(HFlashAddr_t addr, uint16_t newVersion, HFlashUpdateVer
return ; return ;
} }
if (onlyUpgrade && (newVersion < cache->info.version)) {
return ;
}
const uint16_t oldVersion = cache->info.version; const uint16_t oldVersion = cache->info.version;
cache->info.version = newVersion; cache->info.version = newVersion;
if (callback) { if (callback) {
@ -1839,6 +1877,16 @@ void HFlashUpdateVersion(HFlashAddr_t addr, uint16_t newVersion, HFlashUpdateVer
WriteCachePage(cache); WriteCachePage(cache);
} }
void HFlashUpdateVersion(HFlashAddr_t addr, uint16_t newVersion, HFlashUpdateVersionCallback callback, void *userData)
{
UpdateVersionInner(addr, newVersion, callback, userData, 0);
}
void HFlashUpgradeVersion(HFlashAddr_t addr, uint16_t newVersion, HFlashUpdateVersionCallback callback, void *userData)
{
UpdateVersionInner(addr, newVersion, callback, userData, 1);
}
void HFlashDefaultUpdateVersion(HFlashAddr_t addr, uint16_t oldVersion, uint16_t newVersion, void *userData) void HFlashDefaultUpdateVersion(HFlashAddr_t addr, uint16_t oldVersion, uint16_t newVersion, void *userData)
{ {
(void)(oldVersion); (void)(oldVersion);
@ -1850,14 +1898,7 @@ void HFlashDefaultUpdateVersion(HFlashAddr_t addr, uint16_t oldVersion, uint16_t
void HFlashDeleteData(HFlashAddr_t addr) void HFlashDeleteData(HFlashAddr_t addr)
{ {
HFlashCacheInfo *cache = FindCache(addr); HFlashSetUseSize(addr, 0);
if (cache == NULL) {
FATAL_ERROR("addr[0x%08x] not register", addr);
return ;
}
cache->info.useSize = 0;
WriteCachePage(cache);
} }
uint32_t HFlashGetUseSize(HFlashAddr_t addr) uint32_t HFlashGetUseSize(HFlashAddr_t addr)
@ -1871,6 +1912,28 @@ uint32_t HFlashGetUseSize(HFlashAddr_t addr)
return cache->info.useSize; return cache->info.useSize;
} }
uint8_t HFlashSetUseSize(HFlashAddr_t addr, uint32_t size)
{
HFlashCacheInfo *cache = FindCache(addr);
if (cache == NULL) {
LogE("addr[0x%08x] not register", addr);
return 0;
}
if (size > cache->info.size) {
LogE("addr[0x%08x] useSize[%d] overflow size[%d]", addr, size, cache->info.size);
return 0;
}
cache->info.useSize = size;
cache->info.crc32 = GetFlashCrc32(addr, size);
WriteCachePage(cache);
if (size) {
AddBackupAddr(addr, size);
}
return 1;
}
uint32_t HFlashGetSize(HFlashAddr_t addr) uint32_t HFlashGetSize(HFlashAddr_t addr)
{ {
HFlashCacheInfo *cache = FindCache(addr); HFlashCacheInfo *cache = FindCache(addr);

View File

@ -54,6 +54,16 @@ static inline HRingBufferLenType GetRingBufferTypeSize(const HRingBufferType *ri
return 0; return 0;
} }
static inline uint8_t GetRingBufferTypeShift(const HRingBufferType *ringBuffer) {
switch(GetRingBufferType(ringBuffer)) {
case kHRingBufferFlag8: return 0;
case kHRingBufferFlag16: return 1;
case kHRingBufferFlag32: return 2;
}
return 0xFF;
}
static inline HRingBufferDataType GetRingBufferData(const HRingBufferType *ringBuffer, HRingBufferLenType pos) { static inline HRingBufferDataType GetRingBufferData(const HRingBufferType *ringBuffer, HRingBufferLenType pos) {
switch(GetRingBufferType(ringBuffer)) { switch(GetRingBufferType(ringBuffer)) {
case kHRingBufferFlag8: return ((const _HRingBuffer8 *)ringBuffer)->data[pos]; break; case kHRingBufferFlag8: return ((const _HRingBuffer8 *)ringBuffer)->data[pos]; break;
@ -199,29 +209,40 @@ HRingBufferDataType HRingBufferPopData(HRingBufferType* buffer) {
// 获取环状缓冲区数据, 返回获取的数据长度 // 获取环状缓冲区数据, 返回获取的数据长度
HRingBufferLenType HRingBufferGetByteDatas(HRingBufferType* buffer, uint8_t *data, HRingBufferLenType len) HRingBufferLenType HRingBufferGetByteDatas(HRingBufferType* buffer, uint8_t *data, HRingBufferLenType len)
{ {
if (HRingBufferGetUseLen(buffer) == 0) { const HRingBufferLenType useLen = HRingBufferGetUseLen(buffer);
if (useLen == 0) {
return 0; return 0;
} }
_HRingBufferBase *base = (_HRingBufferBase *)buffer; _HRingBufferBase *base = (_HRingBufferBase *)buffer;
const HRingBufferLenType typeSize = GetRingBufferTypeSize(buffer); const uint8_t typeShift = GetRingBufferTypeShift(buffer);
const HRingBufferLenType startPos = base->start; if (data == NULL || typeShift > 2) {
const HRingBufferLenType endPos = base->end;
int copyLen = (endPos - startPos) * typeSize;
if (startPos >= endPos) {
copyLen = (base->len - startPos) * typeSize;
}
if (copyLen > len) {
copyLen = len / typeSize * typeSize;
}
if (copyLen == 0) {
return 0; return 0;
} }
memcpy(data, GetRingByteData(buffer, startPos), copyLen); HRingBufferLenType copyElems = len >> typeShift;
AdjustReadPos(buffer, copyLen / typeSize); if (copyElems > useLen) {
copyElems = useLen;
}
if (copyElems == 0) {
return 0;
}
const HRingBufferLenType startPos = base->start;
HRingBufferLenType firstCopyElems = base->len - startPos;
if (firstCopyElems > copyElems) {
firstCopyElems = copyElems;
}
const HRingBufferLenType copyLen = copyElems << typeShift;
const HRingBufferLenType firstCopyLen = firstCopyElems << typeShift;
memcpy(data, GetRingByteData(buffer, startPos), firstCopyLen);
if (firstCopyLen < copyLen) {
memcpy(data + firstCopyLen, GetRingByteData(buffer, 0), copyLen - firstCopyLen);
}
AdjustReadPos(buffer, copyElems);
return copyLen; return copyLen;
} }