【问题标题】:Timer in FreeBSD kernel module?FreeBSD内核模块中的计时器?
【发布时间】:2015-03-27 02:05:18
【问题描述】:

我想让我的内核模块在 FreeBSD 内核中定期做一些事情(一定的时间间隔,比如 10 秒)。有这样做的例子吗?

我搜索了一下,发现有callout/timeout(old)之类的函数,但是它们看起来很复杂,我找不到它们的好例子。对于callout'', it seems thatcallout_reset'' 类似于我想要的函数(参数包括处理程序和时间间隔)。但它似乎只执行一次。所以我很困惑。

示例是最好的,即使对于函数“超时”也是如此。

【问题讨论】:

    标签: timer kernel freebsd kernel-module callout


    【解决方案1】:

    您需要使用标注(9)。至于例子......嗯,对于真实世界的代码,你可以看看这个:http://svnweb.freebsd.org/base/head/sys/dev/iscsi/iscsi.c?revision=275925&view=markup;搜索 is_callout。基本上,你需要'struct timeout',一个会被定期调用的函数,然后你需要让计时器滴答作响:

    struct callout callout;
    
    static void
    callout_handler(void *whatever)
    {
            // do your stuff, and make sure to get called again after 'seconds'.
            callout_schedule(&callout, seconds * hz);
    }
    
    static void
    start_ticking(void)
    {
            callout_init(&callout, 1);
            callout_reset(&callout, seconds * hz, callout_handler, whatever);
    }
    

    【讨论】:

    • seconds * hz 在这里是什么意思?我看到了几个例子,但在源代码中似乎没有定义hz。当我使用像10000 这样的值时,我相信这可能不到一秒,因为它是ticks。但是我的处理程序似乎在很长一段时间后被触发了。
    • 我的意思是,如何将这个 ticks 转换为 seconds
    • "seconds" 是秒,秒 * hz 是滴答声。不要定义 hz,使用 中的 extern 定义。
    猜你喜欢
    • 2014-08-05
    • 1970-01-01
    • 1970-01-01
    • 2015-04-15
    • 2014-07-06
    • 2016-02-18
    • 2019-03-30
    • 2014-03-01
    • 2015-06-03
    相关资源
    最近更新 更多