1. 修复定时器问题
This commit is contained in:
parent
2f9faedb8d
commit
f6bc1d4631
12
src/HTimer.c
12
src/HTimer.c
@ -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(®->schedu, 0)) {
|
while (HTIMER_ATOMIC_XCHG(®->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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user