12 - Timer

timer.c

timer.c
/* Używa timera do odczekania przez pewien czas. Dokładność timera mocno
   zależy od parametrów konfiguracji jądra podczas budowania, ale generalnie
   nie należy zakładać dokładności większej niż 1/HZ. */
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/timer.h>
 
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Marcin Bis");
MODULE_DESCRIPTION("Zwykly timer");
 
static struct timer_list my_timer;
 
void my_timer_callback(unsigned long data)
{
  printk(KERN_INFO "my_timer_callback (%ld).\n", jiffies);
}
 
static int __init mod_timer_init(void)
{
  int ret;
 
  printk(KERN_INFO "Timer module\n");
 
  setup_timer(&my_timer, my_timer_callback, 0);
 
  printk(KERN_INFO "Timer to fire in 200ms (%ld)\n", jiffies);
  ret = mod_timer(&my_timer, jiffies + msecs_to_jiffies(200));
  if (ret) printk(KERN_WARNING "Error in mod_timer\n");
 
  return 0;
}
module_init(mod_timer_init);
 
static void __exit mod_timer_exit(void)
{
  int ret;
 
  ret = del_timer(&my_timer);
  if (ret) printk(KERN_WARNING "The timer is still in use...\n");
 
  printk(KERN_INFO "Timer module unloaded.\n");
  return;
}
module_exit(mod_timer_exit);

hrtimer.c

hrtimer.c
/* Dokładność liczników czasu rzeczywistego zależy tylko od sprzętu. */
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/hrtimer.h>
#include <linux/ktime.h>
 
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Marcin Bis");
MODULE_DESCRIPTION("High resolution timer");
 
#define DELAY		200L
#define MS_TO_NS(x)	(x * 1000000L)
 
static struct hrtimer hr_timer;
 
enum hrtimer_restart my_hrtimer_callback(struct hrtimer *timer)
{
  printk(KERN_INFO "my_hrtimer_callback (%ld).\n", jiffies );
  return HRTIMER_NORESTART;
}
 
static int __init mod_hrtimer_init(void)
{
  unsigned long delay_in_ms = DELAY;
  ktime_t ktime;
 
  printk(KERN_INFO "HR Timer loaded\n");
 
  ktime = ktime_set(0, MS_TO_NS(delay_in_ms));
  hrtimer_init(&hr_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
  hr_timer.function = &my_hrtimer_callback;
 
  printk("Timer to fire in %ldms (%ld)\n", delay_in_ms, jiffies);
  hrtimer_start( &hr_timer, ktime, HRTIMER_MODE_REL );
 
  return 0;
}
module_init(mod_hrtimer_init);
 
static void __exit mod_hrtimer_exit(void)
{
  if (hrtimer_cancel(&hr_timer))
    printk("The timer was still in use...\n");
  printk("HR Timer unloaded\n");
}
module_exit(mod_hrtimer_exit);

Makefile

Makefile
obj-m += timer.o
obj-m += hrtimer.o
 
all:
	make -C /lib/modules/$(shell uname -r)/build \
		SUBDIRS=$(shell pwd) modules
 
clean:
	make -C /lib/modules/$(shell uname -r)/build \
		SUBDIRS=$(shell pwd) clean
ostatnio zmienione: 2011/06/16 16:05