You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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;
}

关键细节说明

  1. 单调时钟的可靠性:CLOCK_MONOTONIC获取的是系统启动后的累计时间,不会因为手动调时间、NTP同步等操作跳变,和Arduinomillis()的行为完全匹配。
  2. 冷却逻辑复刻:和你提供的Arduino代码逻辑一一对应——先判断冷却状态,到期解锁;未冷却时执行函数并锁定。
  3. 编译运行:终端执行gcc -o timed_cooldown timed_cooldown.c即可编译(部分旧系统需加-lrt链接实时库:gcc -o timed_cooldown timed_cooldown.c -lrt),运行./timed_cooldown就能看到效果。

额外提示

如果需要更高精度的时间控制,可以保留纳秒级计算,不用转换成毫秒;主循环里的sleep(1)可以替换成你的实际业务逻辑,比如事件监听、IO处理等。

内容的提问来源于stack exchange,提问作者John

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:43:02