linux内核定时器
任务的延后处理,在内核空间中做到精确延时后执行函数,通过软件中断实现,所以也不可中断。
定时器结构体,在include/linux/timer.h
中定义
struct timer_list {
struct list_head entry; //定时器列表
unsigned long expires; //定时器到期时间,jiffies
void (*function)(unsigned long); //定时器处理函数
unsigned long data; //作为参数被传入定时器处理函数
struct timer_base_s *base;
};
实现流程:
__init
函数中定义并初始化- 为timer赋值,最少赋值
function
- timer中的
expires
赋值 - 在需要时向系统添加timer
__exit
函数中删除timer
相关函数:
struct timer_list my_timer;
//初始化timer
void init_timer(struct timer_list * timer);
//将func和timer绑定
static inline void setup_timer(struct timer_list * timer,
void (*function)(unsigned long),
unsigned long data);
//向系统增加和删除timer
void add_timer(struct timer_list * timer);
int del_timer(struct timer_list * timer);
//修改expires
int mod_timer(struct timer_list *timer, unsigned long expires);
例程:以3s为一次间隙,打印数据,限于板子主频为200M,所以最多定时到5ms。
#include <linux/module.h>
#include <linux/init.h>
#include <linux/timer.h>
void timerFunc(unsigned long data);
struct timer_list myTimer = {
.function = timerFunc,
.data = 10, };
void timerFunc(unsigned long data)
{
myTimer.expires = jiffies + 3*HZ;
add_timer(&myTimer);
printk("timer data = %lu\n", data);
return ;
}
static __init int myTimer_init(void)
{
printk("---------key1_init---------\n");
init_timer(&myTimer);
myTimer.expires = jiffies + 3*HZ;
add_timer(&myTimer);
return 0;
}
static __exit void myTimer_exit(void)
{
printk("---------key1_exit---------\n");
return ;
}
module_init(myTimer_init);
module_exit(myTimer_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("HuiZhe");
MODULE_DESCRIPTION("myTimer test");