struct timer_list {
struct list_head entry; /* 定时器链表 */
unsigned long expires; /* 启动定时长 */
struct tvec_base *base;
void (*function)(unsigned long); /* 定时执行函数 */
unsigned long data; /* 传递给func的参数 */
int slack;
};
api
void add_timer(struct timer_list *timer);
int del_timer_sync(struct timer_list *timer);//多处理器用,等所有处理执行完func再删除
extern int del_timer(struct timer_list * timer);
extern int mod_timer(struct timer_list *timer, unsigned long expires);
extern int mod_timer_pending(struct timer_list *timer, unsigned long expires);
extern int mod_timer_pinned(struct timer_list *timer, unsigned long expires);
init_timer(timer) //宏初始化一个定时器,将定时器加入内核链表
DEFINE_TIMER(_name, _function, _expires, _data) //静态申明一个定时器
add_timer向内核工作链表插入一个定时器任务,取值按参数expires算,最终是调用mod_timer函数来实现
具体实现
static void led_timer_fuc(unsigned long ps)
{
struct gpioled_dev *led = (struct gpioled_dev *)ps;
if (led->flash_flag) {
led_control[LED_FLIP](led);
mod_timer(&led->timer, jiffies + msecs_to_jiffies(led->timer_proid));/* 重新启动一次新的定时器 */
}
}
/* 初始化的时候不将定时器加入内核链表,所以不调用add_timer */
static void led_timer_init(struct gpioled_dev *led)
{
/* add_timer函数之后会触发一次定时器中断 */
init_timer(&led->timer);/* 初始化定时器 */
led->timer_proid = 500;
led->timer.function = led_timer_fuc; /* 定时器函数 */
//led->timer.expires = 0;
led->timer.data = (unsigned long)led;/* 给fuc提供的参数 */
//add_timer(&led->timer);/* 添加定时器 */
}
jiffies 内核低精度定时器,一直在加,只能设置未来的一个时间段触发定时任务,并且只执行一次,所以如果要持续定时触发的话,需要在func中对定时器重新处理,即调用mod_timer修改定时触发的时间点
jiffies 计数与内核宏HZ有关,1 * HZ计数就是1秒
msecs_to_jiffies函数将毫秒数值转化为jiffies