1. 优化避免多重调用问题

This commit is contained in:
coffee 2025-08-29 10:35:10 +08:00
parent 4ec9fbff01
commit 70c8782467
3 changed files with 29 additions and 2 deletions

View File

@ -53,6 +53,7 @@ typedef struct __attribute__((__packed__)) HDProtocolServerInfo
uint8_t tmpDst; ///< 临时回送目标数据口(用于该指令需要先请求某个数据后才能回复的情况) uint8_t tmpDst; ///< 临时回送目标数据口(用于该指令需要先请求某个数据后才能回复的情况)
uint8_t tmpReadCount : 6; ///< 临时数据最大等待回复次数 uint8_t tmpReadCount : 6; ///< 临时数据最大等待回复次数
uint8_t tmpEnable : 1; ///< 当前临时目标等待数据, 需要等待数据内部标记开启, 数据完成或者超时后自动关闭 uint8_t tmpEnable : 1; ///< 当前临时目标等待数据, 需要等待数据内部标记开启, 数据完成或者超时后自动关闭
uint8_t run : 1; ///< 内部标记当前正常读取, 如果再次触发解析, 则不等待
uint8_t delayCount; ///< 延时等待次数(默认: 1), 每次等待时间为 HSCHEDULE_DELAY_TIMEOUT uint8_t delayCount; ///< 延时等待次数(默认: 1), 每次等待时间为 HSCHEDULE_DELAY_TIMEOUT
} HDProtocolServerInfo; } HDProtocolServerInfo;

View File

@ -36,6 +36,11 @@ static struct OccupiedInfo sOccupiedInfo[OCCUPIED_MAX];
// 判断当前协议是否占用 // 判断当前协议是否占用
static uint8_t IsOccupied(uint8_t currIndex, uint8_t protocol, uint8_t *occupiedIndex) 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) { for (int i = 0; i < OCCUPIED_MAX; ++i) {
if (sOccupiedInfo[i].enbale == 0) { if (sOccupiedInfo[i].enbale == 0) {
continue; 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) 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; uint8_t index = OCCUPIED_MAX;
for (int i = 0; i < OCCUPIED_MAX; ++i) { for (int i = 0; i < OCCUPIED_MAX; ++i) {
if (sOccupiedInfo[i].enbale == 0) { if (sOccupiedInfo[i].enbale == 0) {
@ -111,11 +121,15 @@ static void WaitRead(HDProtocolServerInfo *info)
for (int i = 0; i < info->delayCount; ++i) { for (int i = 0; i < info->delayCount; ++i) {
for (int j = 0; j < HDPROTOCOL_DELAY_TIMEOUT; ++j) { for (int j = 0; j < HDPROTOCOL_DELAY_TIMEOUT; ++j) {
HDDelayMs(1);
HDProtocolRun(); HDProtocolRun();
if (info->tmpEnable == 0) { if (info->tmpEnable == 0) {
break; break;
} }
// 读取数据的时候触发的紧急读取不要去睡眠
if (info->run == 0) {
HDDelayMs(1);
}
} }
if (info->tmpEnable == 0) { 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; const uint8_t *srcData = (const uint8_t *)data;
uint8_t occupy = 0xff; uint8_t occupy = 0xff;
sInfo.info[src].run = 1;
for (int i = 0; i < len; ++i) { for (int i = 0; i < len; ++i) {
if (HRingBufferFull(sInfo.info[src].readBuff)) { 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]); HRingBufferAddDataOver(sInfo.info[src].readBuff, srcData[i]);
} }
sInfo.info[src].run = 0;
} }
void HDProtocolRun() void HDProtocolRun()
@ -306,6 +323,11 @@ void HDProtocolRun()
continue; continue;
} }
if (i >= OCCUPIED_MAX) {
LogE("index[%d] is out of range[%d]", i, OCCUPIED_MAX);
break;
}
// 有之前的数据已经占用了, 并且检查是否超时 // 有之前的数据已经占用了, 并且检查是否超时
uint8_t occupiedIndex = OCCUPIED_MAX; uint8_t occupiedIndex = OCCUPIED_MAX;
if (IsOccupied(i, sInfo.info[i].supportProtocol, &occupiedIndex)) { if (IsOccupied(i, sInfo.info[i].supportProtocol, &occupiedIndex)) {
@ -324,7 +346,7 @@ void HDProtocolRun()
} }
uint8_t waitTime = 0; uint8_t waitTime = 0;
if (sOccupiedInfo[occupiedIndex].waitOccupy) { if (occupiedIndex < OCCUPIED_MAX && sOccupiedInfo[occupiedIndex].waitOccupy) {
// 还有其他协议等待抢占, 检查时间 // 还有其他协议等待抢占, 检查时间
if (HDLogGetTime() - sOccupiedInfo[occupiedIndex].occupyTime > HDPROTOCOL_OCCUPY_TIMEOUT) { if (HDLogGetTime() - sOccupiedInfo[occupiedIndex].occupyTime > HDPROTOCOL_OCCUPY_TIMEOUT) {
waitTime = 1; waitTime = 1;

View File

@ -136,6 +136,10 @@ void HTimerRun(uint8_t id) {
return ; return ;
} }
if (sTimeRegisters[id].curr == 1) {
return ;
}
// 没必要每次都扫描, 当时间更新时再检查 // 没必要每次都扫描, 当时间更新时再检查
static uint32_t lastMs[HTIMER_REGISTER_MAX]; static uint32_t lastMs[HTIMER_REGISTER_MAX];
if (lastMs[id] == GetCurrentMs()) { if (lastMs[id] == GetCurrentMs()) {