1. 修复定时器问题

This commit is contained in:
coffee 2026-04-19 23:50:35 +08:00
parent 2f9faedb8d
commit f6bc1d4631

View File

@ -239,7 +239,8 @@ static HTimer_t AddTimerData(uint8_t id, uint32_t duration, HTimerCallType call,
t->call = call; t->call = call;
t->flags = flags; t->flags = flags;
t->heapIndex = HEAP_INVALID_INDEX; t->heapIndex = HEAP_INVALID_INDEX;
HTIMER_RELEASE_FENCE(); // 确保上述写入在状态变更前完成 // 确保上述写入在状态变更前完成
HTIMER_RELEASE_FENCE();
// 第二步kTimerAdding -> kTimerActive标记初始化完成 // 第二步kTimerAdding -> kTimerActive标记初始化完成
HTIMER_STORE(&t->state, kTimerActive); HTIMER_STORE(&t->state, kTimerActive);
@ -307,7 +308,7 @@ uint8_t HTimerRegisterTimerInfo(uint8_t id, HTimerInfo *info, uint16_t infoLen)
return 0; return 0;
} }
if (infoLen > 255) { if (infoLen > HTIMER_LEN_MAX) {
LogD("infoLen too large, max 255"); LogD("infoLen too large, max 255");
return 0; return 0;
} }
@ -338,8 +339,10 @@ void HTimerRun(uint8_t id)
// schedu 阶段:只有 HTimerRun 修改堆,单线程安全 // schedu 阶段:只有 HTimerRun 修改堆,单线程安全
// 使用 acquire-release 语义确保看到其他线程的写入 // 使用 acquire-release 语义确保看到其他线程的写入
while (HTIMER_ATOMIC_XCHG(&reg->schedu, 0)) { while (HTIMER_ATOMIC_XCHG(&reg->schedu, 0)) {
HTIMER_ACQUIRE_FENCE(); // 确保看到 AddTimerData 中的写入 // 确保看到 AddTimerData 中的写入
// 1. 清理堆中已删除的定时器 HTIMER_ACQUIRE_FENCE();
// 1. 清理堆中已删除的定时器
for (HTimerLen_t i = reg->heapSize; i > 0;) { for (HTimerLen_t i = reg->heapSize; i > 0;) {
i--; i--;
HTimerLen_t tIdx = HEAP_AT(reg, i); HTimerLen_t tIdx = HEAP_AT(reg, i);
@ -350,6 +353,7 @@ void HTimerRun(uint8_t id)
t->state = kTimerUnused; t->state = kTimerUnused;
HTIMER_BARRIER(); HTIMER_BARRIER();
if (i < reg->heapSize) { if (i < reg->heapSize) {
heapUp(reg, i);
heapDown(reg, i); heapDown(reg, i);
} }
} }