#include <linux/timer.h> 
static struct timer_list timer1;


void my_timer_func(unsigned long data) {
printk("my_timer_func");
FND_CS0 = fnd_val[data];
}


static int __init fnd_init(void) {
...
// kernel timer
init_timer(&timer1);
timer1.expires=jiffies + HZ * 4;
timer1.function = my_timer_func;
timer1.data = 5;
add_timer(&timer1);
...
}

static void __exit fnd_exit(void) {

unregister_chrdev(FND_MAJOR, "FND");
    printk("FND module is down...\n");
    
    
}

module_init(fnd_init);
module_exit(fnd_exit);




add timer의 의미는 kernel의 timer로 사용하도록 되어 있다.
중간에 timer가 도는 도중에 rm 을 하면 문제가 될 수 있다.
unregister 하기 전에 del_timer를 반드시 해야 한다.


static void __exit fnd_exit(void) {
del_timer(&timer1);
unregister_chrdev(FND_MAJOR, "FND");
    printk("FND module is down...\n");
    
    
}


테스트 - 5초 뒤에 timer가 호출되었다!!

[root@Xhyper255 /root]$insmod fnd.o
FND module is up...
FND_MAJOR = 253
[root@Xhyper255 /root]$my_timer_func  




계속 반복하게 하려면..

void my_timer_func(unsigned long data) {
....
//
timer1.expires=jiffies + HZ * 2;
add_timer(&timer1); 




여러개의 timer가 동작하는데, 하나의 handler에서 처리하게 하려면 argument인 unsigned long 타입인 data를 잘 이용하도록 하는 것이다.

커널에서 unsigned long 타입으로 사용하는 파라미터는 어떤 값인지 들어갈 수 있다는 것을 의미한다.

 
Posted by '김용환'
,