私の目標は、構造体を使用して Linux カーネルで繰り返しタスクを作成することhrtimer
です。500ミリ秒ごとに繰り返したいと思います。
hrtimer
しかし、 Linux カーネルで がどのように機能するかについては、少し混乱しています (「参考文献」を参照linux/hrtimer.h
)。HRTIMER_RESTART
時間が指定されていることはわかっており、コールバックはまたはを返す必要がありますHRTIMER_NORESTART
。メソッドを使用してコールバックでタイマーをリセットする必要があると述べているオンラインのソースをいくつか見つけましたhrtimer_forward
。ただし、私が見た情報源は、時間の追加がどのように機能するかについて少し不明確です。これまでのコードは次のとおりです。
static struct hrtimer timer;
static enum hrtimer_restart timer_callback(struct hrtimer *timer)
{
printk(KERN_ERR "Callback\n");
//I know something needs to go here to reset the timer
return HRTIMER_RESTART;
}
static int init_timer(void)
{
ktime_t ktime;
unsigned long delay_in_ms = 500L;
printk(KERN_ERR "Timer being set up\n");
ktime = ktime_set(0,delay_in_ms*1E6L);
hrtimer_init(&timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
timer.function = &timer_callback;
printk(KERN_ERR "Timer starting to fire\n");
printk(KERN_ERR "in %ldms %ld\n", delay_in_ms, jiffies);
hrtimer_start(&timer, ktime, HRTIMER_MODE_REL);
return 0;
}
static void clean_load_balancing_timer(void)
{
int cancelled = hrtimer_cancel(&timer);
if (cancelled)
printk(KERN_ERR "Timer still running\n");
else
printk(KERN_ERR "Timer cancelled\n");
}
タイマーのリセットがコールバック関数でどのように機能するかを誰かが正確に説明できますか? ありがとう!