From 70c8782467e63e3e34ca8a3b1af40480ce583f89 Mon Sep 17 00:00:00 2001 From: coffee Date: Fri, 29 Aug 2025 10:35:10 +0800 Subject: [PATCH] =?UTF-8?q?1.=20=E4=BC=98=E5=8C=96=E9=81=BF=E5=85=8D?= =?UTF-8?q?=E5=A4=9A=E9=87=8D=E8=B0=83=E7=94=A8=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/HDProtocolServer.h | 1 + src/HDProtocolServer.c | 26 ++++++++++++++++++++++++-- src/HTimer.c | 4 ++++ 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/include/HDProtocolServer.h b/include/HDProtocolServer.h index 33f0e2d..c7c4161 100644 --- a/include/HDProtocolServer.h +++ b/include/HDProtocolServer.h @@ -53,6 +53,7 @@ typedef struct __attribute__((__packed__)) HDProtocolServerInfo uint8_t tmpDst; ///< 临时回送目标数据口(用于该指令需要先请求某个数据后才能回复的情况) uint8_t tmpReadCount : 6; ///< 临时数据最大等待回复次数 uint8_t tmpEnable : 1; ///< 当前临时目标等待数据, 需要等待数据内部标记开启, 数据完成或者超时后自动关闭 + uint8_t run : 1; ///< 内部标记当前正常读取, 如果再次触发解析, 则不等待 uint8_t delayCount; ///< 延时等待次数(默认: 1), 每次等待时间为 HSCHEDULE_DELAY_TIMEOUT } HDProtocolServerInfo; diff --git a/src/HDProtocolServer.c b/src/HDProtocolServer.c index 45efca1..f06b02d 100644 --- a/src/HDProtocolServer.c +++ b/src/HDProtocolServer.c @@ -36,6 +36,11 @@ static struct OccupiedInfo sOccupiedInfo[OCCUPIED_MAX]; // 判断当前协议是否占用 static uint8_t IsOccupied(uint8_t currIndex, uint8_t protocol, uint8_t *occupiedIndex) { + if (currIndex >= OCCUPIED_MAX) { + LogE("index[%d] out of range[%d]", currIndex, OCCUPIED_MAX); + return 0; + } + for (int i = 0; i < OCCUPIED_MAX; ++i) { if (sOccupiedInfo[i].enbale == 0) { continue; @@ -63,6 +68,11 @@ static uint8_t IsOccupied(uint8_t currIndex, uint8_t protocol, uint8_t *occupied static void SetOccupied(uint8_t currIndex, uint8_t protocol, uint8_t enable) { + if (currIndex >= OCCUPIED_MAX) { + LogE("index[%d] out of range[%d]", currIndex, OCCUPIED_MAX); + return ; + } + uint8_t index = OCCUPIED_MAX; for (int i = 0; i < OCCUPIED_MAX; ++i) { if (sOccupiedInfo[i].enbale == 0) { @@ -111,11 +121,15 @@ static void WaitRead(HDProtocolServerInfo *info) for (int i = 0; i < info->delayCount; ++i) { for (int j = 0; j < HDPROTOCOL_DELAY_TIMEOUT; ++j) { - HDDelayMs(1); HDProtocolRun(); if (info->tmpEnable == 0) { break; } + + // 读取数据的时候触发的紧急读取不要去睡眠 + if (info->run == 0) { + HDDelayMs(1); + } } if (info->tmpEnable == 0) { @@ -278,6 +292,7 @@ void HDProtocolRead(uint8_t src, const void *data, int len) const uint8_t *srcData = (const uint8_t *)data; uint8_t occupy = 0xff; + sInfo.info[src].run = 1; for (int i = 0; i < len; ++i) { if (HRingBufferFull(sInfo.info[src].readBuff)) { // 只需要检查一次 @@ -293,6 +308,8 @@ void HDProtocolRead(uint8_t src, const void *data, int len) HRingBufferAddDataOver(sInfo.info[src].readBuff, srcData[i]); } + + sInfo.info[src].run = 0; } void HDProtocolRun() @@ -306,6 +323,11 @@ void HDProtocolRun() continue; } + if (i >= OCCUPIED_MAX) { + LogE("index[%d] is out of range[%d]", i, OCCUPIED_MAX); + break; + } + // 有之前的数据已经占用了, 并且检查是否超时 uint8_t occupiedIndex = OCCUPIED_MAX; if (IsOccupied(i, sInfo.info[i].supportProtocol, &occupiedIndex)) { @@ -324,7 +346,7 @@ void HDProtocolRun() } uint8_t waitTime = 0; - if (sOccupiedInfo[occupiedIndex].waitOccupy) { + if (occupiedIndex < OCCUPIED_MAX && sOccupiedInfo[occupiedIndex].waitOccupy) { // 还有其他协议等待抢占, 检查时间 if (HDLogGetTime() - sOccupiedInfo[occupiedIndex].occupyTime > HDPROTOCOL_OCCUPY_TIMEOUT) { waitTime = 1; diff --git a/src/HTimer.c b/src/HTimer.c index 5055f7d..f9ce9f1 100644 --- a/src/HTimer.c +++ b/src/HTimer.c @@ -136,6 +136,10 @@ void HTimerRun(uint8_t id) { return ; } + if (sTimeRegisters[id].curr == 1) { + return ; + } + // 没必要每次都扫描, 当时间更新时再检查 static uint32_t lastMs[HTIMER_REGISTER_MAX]; if (lastMs[id] == GetCurrentMs()) {