Linux设备驱动之中断处理(2)

Disabling all interrupts

#include <asm/system.h> void local_irq_save(unsigned long flags); /* save flags then disable local all */ void local_irq_disable(void); /* disable local all directly */ void local_irq_restore(unsigned long flags); void local_irq_enable(void);

底半部机制

tasklet

void my_tasklet_func(unsigned long); /*定义一个处理函数*/ /* 定义一个tasklet结构my_tasklet,并与my_tasklet_func(data)处理函数相关联 */ DECLARE_TASKLET(my_tasklet, my_tasklet_func, data); /* 在需要调度tasklet的时候引用一个tasklet_schedule()函数就能使系统在适当的时候进行调度运行 一般在top half即中断响应函数中调用 */ tasklet_schedule(&my_tasklet);

工作队列(workqueues)
与tasklet类似:

void my_wq_func(unsigned long); /*定义一个处理函数*/ struct work_struct my_wq; /*定义一个工作队列*/ /* 初始化工作队列并将其与处理函数绑定 */ INIT_WORK(&my_wq, (void (*)(void *)) my_wq_func, NULL); schedule_work(&my_wq);/*调度工作队列执行*/

Tip: tasklet在中断上下文中执行,不可阻塞或睡眠;而workqueues由内核线程去执行,属进程上下文,可阻塞和睡眠。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/14648.html