From 9cd7eb249948d1b44c0324276fb2f37a5a8461d4 Mon Sep 17 00:00:00 2001 From: coffee Date: Tue, 21 Apr 2026 21:32:08 +0800 Subject: [PATCH] =?UTF-8?q?1.=20=E6=9B=B4=E6=96=B0=E5=AE=9A=E6=97=B6?= =?UTF-8?q?=E5=99=A8=E9=81=BF=E5=85=8D=E9=87=8D=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/HTimer.h | 1 + src/HTimer.c | 9 ++++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/include/HTimer.h b/include/HTimer.h index fc8c434..78b7b07 100644 --- a/include/HTimer.h +++ b/include/HTimer.h @@ -63,6 +63,7 @@ typedef struct TimeRegisterInfo { HTimerLen_t heapSize; ///< 堆当前大小 HTimerLen_t len; ///< 定时器个数 volatile uint8_t schedu; ///< 需要重新调度 (原子操作) + uint8_t run : 1; ///< 运行中 } TimeRegisterInfo; ///< 初始化毫秒定时器, 需要传递获取毫秒的函数 diff --git a/src/HTimer.c b/src/HTimer.c index 0bc8d23..0617cc8 100644 --- a/src/HTimer.c +++ b/src/HTimer.c @@ -15,7 +15,7 @@ // ==================== 原子操作支持 ==================== #if defined(__GNUC__) || defined(__clang__) - // STM32/GD32/ESP32 都支持 GCC 扩展 + // 支持 GCC 扩展 // 使用 __atomic_* 系列函数,提供明确的内存序语义 static inline int htimer_cas(volatile uint8_t *ptr, uint8_t oldv, uint8_t newv) { return __atomic_compare_exchange_n(ptr, &oldv, newv, 0, __ATOMIC_ACQ_REL, __ATOMIC_ACQUIRE); @@ -334,6 +334,11 @@ void HTimerRun(uint8_t id) } TimeRegisterInfo *reg = &sInfo.info[id]; + if (reg->run) { + return ; + } + + reg->run = 1; uint32_t now = GetCurrentMs(); // schedu 阶段:只有 HTimerRun 修改堆,单线程安全 @@ -415,6 +420,8 @@ void HTimerRun(uint8_t id) HTIMER_ATOMIC_OR(®->schedu, 1); } } + + reg->run = 0; } HTimer_t HTimerAdd(uint8_t id, uint32_t ms, HTimerCallType call, eHTimerFlags flags)