void tasklet_disable(struct tasklet_struct *t);禁用指定的tasklet。该tasklet仍然可以用tasklet_schedule调度,但其执行被推迟,直到该tasklet被重新启用。如果tasklet当前正在运行,该函数会进入忙等待直到tasklet退出为止;因此在调用tasklet_disable之后,我们可以确信该tasklet不会在系统任何地方运行。 void tasklet_disable_n...
tasklet_schedule将一个tasklet注册到系统中 tasklet_schedule在什么时候调用呢? 在ISR中调用 irqreturn_t xxx_handler(int irq, void *dev_id) { ... /* 调度 tasklet */ tasklet_schedule(&testtasklet); ... } tasklet_schedule做了什么工作? tasklet_schedule->__tasklet_schedule->__tasklet_schedule_com...
tasklet_schedule:将tasklet加入到调度链表里面,tasklet就能得到执行,每调用这个函数一次,tasklet只能执行一次,要再次执行需要重新调用这个函数。 tasklet_hi_schedule:比tasklet_schedule优先级更高,可以得到更快处理。 tasklet_hi_schedule_first:和tasklet_hi_schedule差不多,只是更安全。 tasklet_disable:禁止tasklet,即使...
tasklet由tasklet_schedule()和tasklet_hi_schedule()函数进行调度,它们接受一个指向tasklet_ struct结构的指针作为参数。两个函数非常类似(区别在于一个使用TASKLET_SOFTIRQ而另一 个用HI_SOFTIRQ)。在接下来的内容中我们将仔细研究怎么编写和使用tasklets。现在,让我们先来考察一下tasklet_schedule()的细节: ...
void tasklet_hi_schedule(struct tasklet_struct *t); 调度指定的tasklet以高优先级执行。当软件中断处理例程运行时,它会在处理其他软件中断任务(包括”通常“的tasklet)之前处理高优先级的tasklet。理想状态下,只有具备低延迟需求的任务(比如填充音频缓冲区)才能使用这个函数,这样可避免由其他软件中断处理例程引入 的额...
软中断、tasklet和工作队列并非Linux内核中一直存在的机制,而是由更早版本号的内核中的“下半部”(bottom half)演变而来。
调度函数tasklet_schedule和tasklet_hi_schedule仅有的区别在于分别使用TASKLET_SOFTIRQ和HI_SOFTIRQ,定义在文件<linux/interrupt.h>中,首先检查tasklet的状态是否为TASKLET_STATE_SCHED,如果是已被调度,返回;否则,将TASKLET_STATE_SCHED位置1,然后进入__tasklet_schedule和__tasklet_hi_schedule中,分析__tasklet_schedule如...
voidtasklet_hi_schedule(structtasklet_struct*t); /*和tasklet_schedule类似,只是在更高优先级执行。当软中断处理运行时, 它处理高优先级 tasklet 在 其他软中断之前,只有具有低响应周期要求的驱动才应使用这个函数, 可避免其他软件中断处理引入的附加周期*/ ...
tasklet_hi_schedule_first:和tasklet_hi_schedule差不多,只是更安全。 tasklet_disable:禁止tasklet,即使tasklet_schedule已经把tasklet调度链表里,也得不到执行,必须要用tasklet_enable使能才可以。如果当前tasklet正在运行,tasklet_disable会等待执行完,然后禁止,返回。
staticinlinevoidtasklet_schedule(struct tasklet_struct*t)//调度 tasklet 执行,如果tasklet在运行中被调度, 它在完成后会再次运行; 这保证了在其他事件被处理当中发生的事件受到应有的注意. 这个做法也允许一个 tasklet 重新调度它自己tasklet_hi_schedule(struct tasklet_struct*t)//和tasklet_schedule类似,只是在更...