/** * 日期: 2025-03-08 * 作者: coffee * 描述: 毫秒级定时器, 添加即可使用, 定时器最大数量为 HTIMER_MAX */ #ifndef __H_TIMER_H__ #define __H_TIMER_H__ #include // 定时器注册最大数量 #ifndef HTIMER_REGISTER_MAX #define HTIMER_REGISTER_MAX (5) #endif // 无效值 #ifndef HTIMER_INVALID #define HTIMER_INVALID -1 #endif // 检查添加定时任务超出限制后进入死循环, 方便调试 #ifdef HTIMER_CHECK_LOOP #define HTIMER_CHECK_INVALID_LOOP #endif typedef enum { kHTimerOnce = 0, ///< 仅执行一次 kHTimerLoop, ///< 循环执行 } eHTimerFlags; typedef void (*HTimerCallType)(); typedef int16_t HTimer_t; ///< 注册的定时器信息, 定义为数组, 数量由外部控制 typedef struct HTimerInfo { uint32_t flags : 1; ///< 定时器标志, eTimerFlags volatile uint32_t enable: 2; ///< 定时器使能 uint32_t curr : 1; ///< 当前回调者 uint32_t duration : 28; ///< 定时触发时长, 毫秒为计数单元 uint32_t lastTime; ///< 上次触发时间 HTimerCallType call; ///< 定时触发函数 } HTimerInfo; ///< 初始化毫秒定时器, 需要传递获取毫秒的函数 void HTimerInitMs(uint32_t (*func)(void)); ///< 获取毫秒 uint32_t HTimerGetMs(); /** * @brief 注册定时器信息 * @param id 定时器ID * @param info 定时器信息, 由外部提供定时器数组 * @param infoLen 定时器信息长度 * @return HTIMER_INVALID 注册失败, 返回定时器ID */ HTimer_t HTimerRegisterTimerInfo(uint8_t id, HTimerInfo *info, uint16_t infoLen); ///< 移除定时器信息 void HTimerRemoveRegister(uint8_t id); ///< 运行定时器可执行任务, 需要在主循环中调用 void HTimerRun(uint8_t id); ///< 添加一个定时任务, 添加失败返回 HTIMER_INVALID, ms不超过24比特 HTimer_t HTimerAdd(uint8_t id, uint32_t ms, HTimerCallType call, eHTimerFlags flags); ///< 移除一个定时任务 void HTimerRemove(uint8_t id, HTimer_t index); ///< 在定时器回调任务中获取当前定时器ID uint8_t HTimerGetCurrentId(); ///< 在定时器回调任务中获取当前定时器调用者索引, 不存在返回 HTIMER_INVALID HTimer_t HTimerGetCurrentCaller(uint8_t id); #endif //__H_TIMER_H__