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