1. 优化环状数组

This commit is contained in:
coffee 2025-10-27 23:50:20 +08:00
parent c2ed44d4ba
commit fc00bd72e8
3 changed files with 22 additions and 12 deletions

View File

@ -264,6 +264,7 @@ HDRPCValue_t _HDRPCGetValue(HDRPCSession *session, uint8_t type, uint8_t index);
* @return * @return
*/ */
void *_HDRPCGetData(HDRPCSession *session, uint8_t type, uint8_t index, uint8_t *len); void *_HDRPCGetData(HDRPCSession *session, uint8_t type, uint8_t index, uint8_t *len);
#define HDRPCGetCharData(session, index, len) (char *)_HDRPCGetData(session, kHDRPCBuffer, index, len)
#define HDRPCGetData(session, index, len) (uint8_t *)_HDRPCGetData(session, kHDRPCBuffer, index, len) #define HDRPCGetData(session, index, len) (uint8_t *)_HDRPCGetData(session, kHDRPCBuffer, index, len)
#define HDRPCGetUserData(session, index, len) (uint8_t *)_HDRPCGetData(session, kHDRPCUserData, index, len) #define HDRPCGetUserData(session, index, len) (uint8_t *)_HDRPCGetData(session, kHDRPCUserData, index, len)
#define HDRPCGetString(session, index, len) (uint16_t *)_HDRPCGetData(session, kHDRPCString, index, len) #define HDRPCGetString(session, index, len) (uint16_t *)_HDRPCGetData(session, kHDRPCString, index, len)

View File

@ -14,7 +14,7 @@
#endif #endif
static void InitRingBuffer(HRingBufferType *ringBuffer) { static inline void InitRingBuffer(HRingBufferType *ringBuffer) {
if (ringBuffer == NULL) { if (ringBuffer == NULL) {
LogD("RingBuffer is NULL"); LogD("RingBuffer is NULL");
return ; return ;
@ -34,7 +34,7 @@ static void InitRingBuffer(HRingBufferType *ringBuffer) {
base->end = _HRING_BUFFER_INIT_SIZE_INIT(len); base->end = _HRING_BUFFER_INIT_SIZE_INIT(len);
} }
static uint8_t GetRingBufferType(const HRingBufferType *ringBuffer) { static inline uint8_t GetRingBufferType(const HRingBufferType *ringBuffer) {
if (ringBuffer == NULL) { if (ringBuffer == NULL) {
return 0; return 0;
} }
@ -44,7 +44,7 @@ static uint8_t GetRingBufferType(const HRingBufferType *ringBuffer) {
return base->flag & kHRingBufferFlagAllMask; return base->flag & kHRingBufferFlagAllMask;
} }
static HRingBufferLenType GetRingBufferTypeSize(const HRingBufferType *ringBuffer) { static inline HRingBufferLenType GetRingBufferTypeSize(const HRingBufferType *ringBuffer) {
switch(GetRingBufferType(ringBuffer)) { switch(GetRingBufferType(ringBuffer)) {
case kHRingBufferFlag8: return sizeof(uint8_t); break; case kHRingBufferFlag8: return sizeof(uint8_t); break;
case kHRingBufferFlag16: return sizeof(uint16_t); break; case kHRingBufferFlag16: return sizeof(uint16_t); break;
@ -54,7 +54,7 @@ static HRingBufferLenType GetRingBufferTypeSize(const HRingBufferType *ringBuffe
return 0; return 0;
} }
static 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;
case kHRingBufferFlag16: return ((const _HRingBuffer16 *)ringBuffer)->data[pos]; break; case kHRingBufferFlag16: return ((const _HRingBuffer16 *)ringBuffer)->data[pos]; break;
@ -64,7 +64,7 @@ static HRingBufferDataType GetRingBufferData(const HRingBufferType *ringBuffer,
return HRING_BUFFER_ERROR; return HRING_BUFFER_ERROR;
} }
static const uint8_t *GetRingByteData(const HRingBufferType *ringBuffer, HRingBufferLenType pos) { static inline const uint8_t *GetRingByteData(const HRingBufferType *ringBuffer, HRingBufferLenType pos) {
const void *result = NULL; const void *result = NULL;
switch(GetRingBufferType(ringBuffer)) { switch(GetRingBufferType(ringBuffer)) {
case kHRingBufferFlag8: result = &((const _HRingBuffer8 *)ringBuffer)->data[pos]; break; case kHRingBufferFlag8: result = &((const _HRingBuffer8 *)ringBuffer)->data[pos]; break;
@ -75,7 +75,7 @@ static const uint8_t *GetRingByteData(const HRingBufferType *ringBuffer, HRingBu
return (const uint8_t *)result; return (const uint8_t *)result;
} }
static void SetRingBufferData(HRingBufferType *ringBuffer, HRingBufferLenType pos, HRingBufferDataType data) { static inline void SetRingBufferData(HRingBufferType *ringBuffer, HRingBufferLenType pos, HRingBufferDataType data) {
switch(GetRingBufferType(ringBuffer)) { switch(GetRingBufferType(ringBuffer)) {
case kHRingBufferFlag8: ((_HRingBuffer8 *)ringBuffer)->data[pos] = (uint8_t)data; break; case kHRingBufferFlag8: ((_HRingBuffer8 *)ringBuffer)->data[pos] = (uint8_t)data; break;
case kHRingBufferFlag16: ((_HRingBuffer16 *)ringBuffer)->data[pos] = (uint16_t)data; break; case kHRingBufferFlag16: ((_HRingBuffer16 *)ringBuffer)->data[pos] = (uint16_t)data; break;
@ -83,7 +83,7 @@ static void SetRingBufferData(HRingBufferType *ringBuffer, HRingBufferLenType po
} }
} }
static uint8_t IsRingBufferFull(const HRingBufferType *ringBuffer) { static inline uint8_t IsRingBufferFull(const HRingBufferType *ringBuffer) {
if (ringBuffer == NULL) { if (ringBuffer == NULL) {
return 1; return 1;
} }
@ -93,7 +93,7 @@ static uint8_t IsRingBufferFull(const HRingBufferType *ringBuffer) {
return (base->flag & kHRingBufferFull) == kHRingBufferFull; return (base->flag & kHRingBufferFull) == kHRingBufferFull;
} }
static void SetRingBufferFull(HRingBufferType *ringBuffer, uint8_t full) { static inline void SetRingBufferFull(HRingBufferType *ringBuffer, uint8_t full) {
InitRingBuffer((HRingBufferType *)ringBuffer); InitRingBuffer((HRingBufferType *)ringBuffer);
_HRingBufferBase *base = (_HRingBufferBase *)ringBuffer; _HRingBufferBase *base = (_HRingBufferBase *)ringBuffer;
if (full) { if (full) {
@ -106,7 +106,8 @@ static void SetRingBufferFull(HRingBufferType *ringBuffer, uint8_t full) {
static void AdjustReadPos(HRingBufferType *ringBuffer, HRingBufferLenType pos) { static void AdjustReadPos(HRingBufferType *ringBuffer, HRingBufferLenType pos) {
const uint8_t isFull = IsRingBufferFull(ringBuffer); const uint8_t isFull = IsRingBufferFull(ringBuffer);
_HRingBufferBase *base = (_HRingBufferBase *)ringBuffer; _HRingBufferBase *base = (_HRingBufferBase *)ringBuffer;
base->start = (base->start + pos) % base->len; base->start += pos;
base->start -= (base->start >= base->len) * base->len;
if (isFull) { if (isFull) {
SetRingBufferFull(ringBuffer, 0); SetRingBufferFull(ringBuffer, 0);
} }
@ -144,7 +145,9 @@ uint8_t HRingBufferAddData(HRingBufferType* buffer, HRingBufferDataType data) {
} }
SetRingBufferData(buffer, base->end, data); SetRingBufferData(buffer, base->end, data);
base->end = (base->end + 1) % base->len; ++base->end;
base->end -= (base->end >= base->len) * base->len;
if (base->end == base->start) { if (base->end == base->start) {
SetRingBufferFull(buffer, 1); SetRingBufferFull(buffer, 1);
} }
@ -156,7 +159,8 @@ uint8_t HRingBufferAddData(HRingBufferType* buffer, HRingBufferDataType data) {
uint8_t HRingBufferAddDataOver(HRingBufferType* buffer, HRingBufferDataType data) { uint8_t HRingBufferAddDataOver(HRingBufferType* buffer, HRingBufferDataType data) {
if (IsRingBufferFull(buffer)) { if (IsRingBufferFull(buffer)) {
_HRingBufferBase *base = (_HRingBufferBase *)buffer; _HRingBufferBase *base = (_HRingBufferBase *)buffer;
base->start = (base->start + 1) % base->len; ++base->start;
base->start -= (base->start >= base->len) * base->len;
SetRingBufferFull(buffer, 0); SetRingBufferFull(buffer, 0);
} }
@ -186,7 +190,8 @@ HRingBufferDataType HRingBufferPopData(HRingBufferType* buffer) {
_HRingBufferBase *base = (_HRingBufferBase *)buffer; _HRingBufferBase *base = (_HRingBufferBase *)buffer;
HRingBufferDataType data = GetRingBufferData(buffer, base->start); HRingBufferDataType data = GetRingBufferData(buffer, base->start);
base->start = (base->start + 1) % base->len; ++base->start;
base->start -= (base->start >= base->len) * base->len;
if (IsRingBufferFull(buffer)) { if (IsRingBufferFull(buffer)) {
SetRingBufferFull(buffer, 0); SetRingBufferFull(buffer, 0);
} }

View File

@ -186,6 +186,10 @@ HTimer_t HTimerAdd(uint8_t id, uint32_t ms, HTimerCallType call, eHTimerFlags fl
} }
void HTimerRemove(HTimer_t index) { void HTimerRemove(HTimer_t index) {
if (index == HTIMER_INVALID) {
return ;
}
const uint8_t id = GET_ID(index); const uint8_t id = GET_ID(index);
index = GET_INDEX(index); index = GET_INDEX(index);
if (id >= HTIMER_REGISTER_MAX) { if (id >= HTIMER_REGISTER_MAX) {