Вопрос по c, driver, linux – Как использовать таймеры в драйверах устройств ядра Linux?

6

Я хочу реализовать счетчик в драйверах устройств Linux, который увеличивается после каждого фиксированного интервала времени. Я хочу сделать это с помощью таймеров. Пример кода будет очень полезен.

@Pat ОП спрашивает, как создать таймер в пространстве ядра. В то время какsetitimer устанавливает таймер в пространстве пользователя. betabandido
Как часто вы хотите увеличить это? Зачем тебе это вообще нужно? (здесь уже есть несколько счетчиков, например,jiffles) osgx
Я хочу увеличить, скажем, через 10 мс. Можете ли вы дать больше информации о том, как использовать насмешки user1395806
чек человек 2 сетитимер Pat

Ваш Ответ

2   ответа
10

IBM Developerworks: таймеры и списки

Вот небольшой пример того, как использовать таймеры ядра 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;
}
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);

Так что вам просто нужно определить функцию таймера, а затем инициализировать и запустить таймер.

У вас есть несколько источников для дальнейшего изучения этой темы:

Understanding the Linux Kernel. This book is a sort of bible for the kernel. It is somehow outdated in some areas, but still a really good source of information. Linux Device Drivers. This is a very useful book when developing device drivers. There is an online version too here. The chapter dealing with time, timers, etc. is chapter 7. This book may be also a bit outdated since it is from 2005 too. Linux Kernel Development. I have not checked this book, but the good point is that it is much newer (from 2010), so you may find some updated information compared to the previous two books.

Похожие вопросы