# multi-timer **Repository Path**: plant-some-trees/multi-timer ## Basic Information - **Project Name**: multi-timer - **Description**: 一款软件定时器扩展模块,可无限扩展你所需的定时器任务。 - **Primary Language**: C - **License**: MIT - **Default Branch**: development - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-07-02 - **Last Updated**: 2025-07-03 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 多功能计时器 ## 简介 多功能计时器是一种软件定时器扩展模块,它允许按需扩展计时任务,取代传统的标志检查方法。这一设计提供了管理程序时间序列更加优雅和便捷的方式。 ## 使用指南 1. 配置系统时间基接口与安装计时器驱动: 首先,实现平台特定的时间获取函数,并通过multiTimerInstall函数安装计时器驱动。 ```c uint64_t PlatformTicksGetFunc(void) { /* 平台特有的实现 */ } multiTimerInstall(PlatformTicksGetFunc); ``` 2. 创建计时器实例: 实例化一个计时器对象 ```c MultiTimer timer1; ``` 3. 设置计时期间、超时回调及用户数据并启动计时器: 通过调用multiTimerStart函数设定计时参数,包括计时期限、超时后的回调函数以及传递给回调的用户数据。 ```c int multiTimerStart(MultiTimer* timer, uint64_t timing, MultiTimerCallback_t callback, void* userData); ``` 4. 在主循环中加入计时器处理: 在应用程序的主循环中,确保调用multiTimerYield来处理计时事件。 ```c int main(int argc, char *argv[]) { ... while (1) { ... multiTimerYield(); } } ``` ## 限制条件 1. 计时精度依赖于时钟频率:建议采用较高精度的时钟,如1毫秒、5毫秒或10毫秒的ticks,以确保计时精确性。 2. 避免回调函数执行耗时操作:这可能阻塞其他计时器的正常触发,影响整体调度。 3. 注意栈空间的使用:回调函数运行在multiTimerYield内部,应避免消耗大量栈空间以防溢出。 ## 示例代码 test_linux.c文件为Linux平台示例,演示如何利用多功能计时器创建并管理多个具有不同间隔和行为的计时器。 ```c #include "MultiTimer.h" #include #include #include // Platform-specific function to get current ticks (milliseconds) uint64_t getPlatformTicks() { struct timeval now; gettimeofday(&now, NULL); return now.tv_sec * 1000LL + now.tv_usec / 1000; } // Callback functions for the timers void timerCallback1(MultiTimer* timer, void* userData) { printf("Timer 1 fired at %lu ms\n", getPlatformTicks()); multiTimerStart(timer, 500, timerCallback1, NULL); // Restart timer } void timerCallback2(MultiTimer* timer, void* userData) { printf("Timer 2 fired at %lu ms\n", getPlatformTicks()); multiTimerStart(timer, 1000, timerCallback2, NULL); // Restart timer } void timerCallback3(MultiTimer* timer, void* userData) { printf("Timer 3 (one-shot) fired at %lu ms\n", getPlatformTicks()); } void timerCallback4(MultiTimer* timer, void* userData) { printf("Timer 4 is stopping Timer 1 at %lu ms\n", getPlatformTicks()); multiTimerStop((MultiTimer*)userData); } int main() { multiTimerInstall(getPlatformTicks); MultiTimer timer1, timer2, timer3, timer4; multiTimerStart(&timer1, 500, timerCallback1, NULL); // 500 ms repeating multiTimerStart(&timer2, 1000, timerCallback2, NULL); // 1000 ms repeating multiTimerStart(&timer3, 2000, timerCallback3, NULL); // 2000 ms one-shot multiTimerStart(&timer4, 3000, timerCallback4, &timer1); // 3000 ms, stops timer1 // 主循环模拟时间流逝并处理计时事件 while (1) { multiTimerYield(); usleep(1000); // 休眠 1 毫秒 } return 0; } ```