1. 优化避免多重调用问题
This commit is contained in:
parent
4ec9fbff01
commit
70c8782467
@ -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;
|
||||||
|
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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()) {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user