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()) {