对于低精度timer,init_timers->open_softirq->run_timer_softirq,每个cpu都有timer_base结构管理,如下函数可以看出,有BASE_STD和BASE_DEF两种类型,前者是标准定时器必须存在,后者表示可延时定时器,当配置了NO_HZ模式,才会有BASE_DEF. 关于timer_base如何管理各个定时器如何触发的,这里不做
所以如果内核编译选项包含 CONFIG_NO_HZ_COMMON,则每个CPU有两个timer_base结构体,下标分别是BASE_STD(Standard)和BASE_DEF(Deferrable)。如果内核编译选项没有包含CONFIG_NO_HZ_COMMON,那么每个CPU只有一个timer_base结构体,BASE_STD和BASE_DEF是同一个。 为什么支持NO_HZ模式要包含两个timer_base呢?这其实和NO_...
{base=lock_timer_base(timer)//获取tvec_base变量,我们知道base为PerCPU变量,这个函数也顺便给base加锁。if(timer_pending(timer)) { deteach_timer(timer,0) ret=1}//如果timer已经存在,则删除,此处的操作是在加锁状态先的,因此和softirq里面不会重入new_base =__get_cpu_var(tvec_base)if(base!=new_...
intmod_timer(void*ptimer,unsignedlongexpires) { structtimer_list*timer= (structtimer_list*)ptimer; structtvec_base*base; base = timer->base; if(NULL== base) return-1; expires = expires + base->current_index; if(timer->entry.next !=NULL&& timer->expires == expires) return0; if(NUL...
在使用 struct timer_list 之前,需要初始化该数据结构,确保所有的字段都被正确地设置。初始化有两种方法。 方法一:基于宏定义DEFINE_ DEFINE_TIMER(timer_name, function_name, expires_value, data); 该宏会定义一个名叫 timer_name 内核定时器,并初始化其function,expires,name和base字段。
设置定时器的回调函数:kthread_timer.function = hrtimer_cb_func; 启动定时器:hrtimer_start(&kthread_timer, ktime_set(HRTIMER_TEST_CYCLE), HRTIMER_MODE_REL); 在定时器回调函数中,增加定时到期时间:hrtimer_forward(timer, timer->base->get_time(), ktime_set(HRTIMER_TEST_CYCLE)); ...
struct timer_list{struct list_head entry;unsigned long expires;/* 定时器超时时间,单位是节拍数 */struct tvec_base*base;void(*function)(unsigned long);/* 定时处理函数 */unsigned long data;/* 要传递给function函数的参数 */int slack;}; ...
struct timer_list { struct list_head entry; unsigned long expires; /* 定时器超时时间,单位是节拍数 */ struct tvec_base *base; void (*function)(unsigned long); /* 定时处理函数 */ unsigned long data; /* 要传递给function函数的参数 */ ...
启动定时器:hrtimer_start(&kthread_timer, ktime_set(HRTIMER_TEST_CYCLE), HRTIMER_MODE_REL); 在定时器回调函数中,增加定时到期时间:hrtimer_forward(timer, timer->base->get_time(), ktime_set(HRTIMER_TEST_CYCLE)); 内核驱动模块代码模块实现: ...
struct tvec_base *base; void (*function)(unsigned long); /* 定时处理函数 */ unsigned long data; /* 要传递给function函数的参数 */ int slack; }; 1. 2. 3. 4. 5. 6. 7. 8. 要使用内核定时器首先要先定义一个 timer_list变量,表示定时器,定义好定时器以后还需要通过一系列的 API函数来初...