如何在Linux C中实现类似Arduino的指定时长事件忽略功能?
在Linux C中实现“忽略事件X秒”的功能
我来帮你把Arduino里的这个冷却逻辑复刻到Linux C环境里,核心思路完全一致——用单调递增的时间戳跟踪冷却周期,下面是具体实现步骤和代码:
核心对应关系
Arduino里的millis()在Linux C中,我们用**单调时钟(CLOCK_MONOTONIC)**来替代,它的优点是不受系统时间调整影响,和millis()一样只会持续递增,非常适合做时间间隔判断。
完整代码示例
#include <stdio.h> #include <time.h> #include <stdbool.h> #include <unistd.h> // 用于模拟主循环的延迟操作 // 冷却时间:600000毫秒 = 10分钟(你可以改成60000毫秒实现1分钟冷却) const uint32_t hold_time = 600000; uint32_t curr_time; uint32_t last_event = 0; bool on_hold = false; // 你需要执行的目标函数 void run_the_function() { printf("执行目标函数!当前时间戳:%u毫秒\n", curr_time); } int main() { struct timespec ts; while (1) { // 获取当前单调时钟时间,转换为毫秒级时间戳 clock_gettime(CLOCK_MONOTONIC, &ts); curr_time = ts.tv_sec * 1000 + ts.tv_nsec / 1000000; // 检查冷却是否到期,到期则解除锁定 if (on_hold && (curr_time - last_event >= hold_time)) { on_hold = false; printf("冷却结束,允许再次执行函数\n"); } // 未处于冷却状态时,执行函数并启动冷却 if (!on_hold) { run_the_function(); on_hold = true; last_event = curr_time; // 记录本次执行的时间戳 } // 模拟主循环的其他业务逻辑(比如处理其他事件),这里用sleep简化 sleep(1); } return 0; }
关键细节说明
- 单调时钟的可靠性:
CLOCK_MONOTONIC获取的是系统启动后的累计时间,不会因为手动调时间、NTP同步等操作跳变,和Arduinomillis()的行为完全匹配。 - 冷却逻辑复刻:和你提供的Arduino代码逻辑一一对应——先判断冷却状态,到期解锁;未冷却时执行函数并锁定。
- 编译运行:终端执行
gcc -o timed_cooldown timed_cooldown.c即可编译(部分旧系统需加-lrt链接实时库:gcc -o timed_cooldown timed_cooldown.c -lrt),运行./timed_cooldown就能看到效果。
额外提示
如果需要更高精度的时间控制,可以保留纳秒级计算,不用转换成毫秒;主循环里的sleep(1)可以替换成你的实际业务逻辑,比如事件监听、IO处理等。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

