8

一定の時間間隔ごとにインクリメントするカウンターを Linux デバイスドライバーに実装したいと考えています。私はタイマーの助けを借りてこれをやりたいです。サンプル コード スニペットは非常に役立ちます。

4

3 に答える 3

12

次の記事「IBMDeveloperworks:タイマーとリスト」をご覧ください。

Linuxカーネルタイマーの使用方法の小さな例があります(便宜上ここに含まれています。コメントは私自身からのものであり、printkメッセージは削除されています)

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/timer.h>

MODULE_LICENSE("GPL");

static struct timer_list my_timer;

void my_timer_callback( unsigned long data )
{
     /* do your timer stuff here */
}

int init_module(void)
{
  /* setup your timer to call my_timer_callback */
  setup_timer(&my_timer, my_timer_callback, 0);
  /* setup timer interval to 200 msecs */
  mod_timer(&my_timer, jiffies + msecs_to_jiffies(200));
  return 0;
}

void cleanup_module(void)
{
  /* remove kernel timer when unloading module */
  del_timer(&my_timer);
  return;
}
于 2012-06-19T09:37:40.437 に答える
4

jiffiesコメントで提案されているように、正確に何をしたいかに応じて、時間を直接測定するために使用できます。カーネルタイマーを使用することもできます。質問の情報を考慮すると、カーネルタイマーの方が適しているようです。

カーネルタイマーAPIは非常に直感的です。

#include <linux/timer.h>
struct timer_list {
        /* ... */
        unsigned long expires;
        void (*function)(unsigned long);
        unsigned long data;
};

void init_timer(struct timer_list *timer);
struct timer_list TIMER_INITIALIZER(_function, _expires, _data);

void add_timer(struct timer_list * timer);
int del_timer(struct timer_list * timer);

したがって、タイマー関数を定義してから、タイマーを初期化して開始する必要があります。

このトピックについてさらに学ぶためのいくつかの情報源があります。

  • Linuxカーネルを理解する。この本はカーネルのための一種の聖書です。一部の地域では時代遅れですが、それでも非常に優れた情報源です。
  • Linuxデバイスドライバー。これは、デバイスドライバを開発するときに非常に役立つ本です。ここにもオンライン版があります。時間やタイマーなどを扱っている章は第7章です。この本も2005年のものなので少し古くなっているかもしれません。
  • Linuxカーネル開発。私はこの本をチェックしていませんが、良い点はそれがはるかに新しいことです(2010年から)ので、前の2冊の本と比較していくつかの更新された情報を見つけるかもしれません。
于 2012-06-19T09:37:52.190 に答える