之前在做触摸屏实验的时候,出现定时器几乎可以同时出现,请看我在论坛发的问题
当初考虑的是定时器是由中断来实现的,在今天看过内核后发现这个是错误的
看一年内核的有关实现
asmlinkage void __init start_kernel(void)(linux-2.6.22.6\init\Main.c)
init_IRQ(); //初始化中断
...
init_timers(); //初始化定时器
open_softirq(TIMER_SOFTIRQ, run_timer_softirq, NULL);//这里看到是一个软中断
...
softirq_init(); //初始化软中断
open_softirq(TASKLET_SOFTIRQ, tasklet_action, NULL);
open_softirq(HI_SOFTIRQ, tasklet_hi_action, NULL);
软中断的类型:
enum
{
HI_SOFTIRQ=0,
TIMER_SOFTIRQ,
NET_TX_SOFTIRQ,
NET_RX_SOFTIRQ,
BLOCK_SOFTIRQ,
TASKLET_SOFTIRQ,
SCHED_SOFTIRQ,
#ifdef CONFIG_HIGH_RES_TIMERS
HRTIMER_SOFTIRQ,
#endif
};
而且从上面可以看出软中断默认比硬中断慢些,另外定时器比tasklet稍快,因为tasklet可以进行延迟执行,但是它不像work_queue那样可以休眠,即tasklet必须在原子上下文执行