1. 程式人生 > >核心定時器 用法與實法 init_timer timer

核心定時器 用法與實法 init_timer timer

核心定時器的實現,依賴時鐘滴答中斷來實現, 實時性比較好

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