核心定時器 用法與實法 init_timer timer
阿新 • • 發佈:2019-01-02
核心定時器的實現,依賴時鐘滴答中斷來實現, 實時性比較好
open_softirq(TIMER_SOFTIRQ, run_timer_softirq);// 時鐘中斷
init_timer(); //初始 timer_list 的結構的一些變數
add_timer() //將timer 加入核心timer列表中,等待處理
以下為例子原始碼,僅供參考
#include <linux/module.h> #include <linux/timer.h> #include <linux/kernel.h> #include <linux/slab.h> #include <linux/jiffies.h> #define TIMER_T 2 char test[] = {"this is first timer\n"}; struct timer_list *timer[TIMER_T]={NULL}; static void timer_func(unsigned long data) { char *str = (char *)data; printk(KERN_EMERG "%s\n", str); } static int __init timer_k_init(void) { int i = 0; for(i=0; i<TIMER_T; i++) { timer[i] = (struct timer_list *)kmalloc(sizeof(struct timer_list), GFP_KERNEL); if(timer[i] == NULL) { printk(KERN_EMERG "malloc is failed\n"); return ENOMEM; } } for(i=0; i < TIMER_T; i++) { init_timer(timer[i]); timer[i]->expires = jiffies + HZ * (i + 3); timer[i]->data = (unsigned long)test; timer[i]->function = timer_func; add_timer(timer[i]); } return 0; } static void __exit timer_k_exit(void) { int i = 0; for(i=0; i<TIMER_T; i++) { del_timer(timer[i]); } } module_init(timer_k_init); module_exit(timer_k_exit);
Makefile:
CUR=$(shell pwd)
KERNEL_DIR=/lib/modules/$(shell uname -r)/build
obj-m=timer_k.o
all:
make -C $(KERNEL_DIR) M=$(CUR) modules
clean:
rm *.ko
rm *.o