Linux 驱动开发基础---中断下半部处理---tasklet
作者:
也许
,
2022-05-15 19:47:55
,
所有人可见
,
阅读 213
内核函数
定义tasklet:
中断下半部使用结构体tasklet_struct来表示
struct tasklet_struct
{
struct tasklet_struct *next;
unsigned long state;
atomic_t count;
void (*func)(unsigned long);
unsigned long data;
};
初始化tasklet:
extern void tasklet_init(struct tasklet_struct *t, void (*func)(unsigned long), unsigned long data);
使能/禁止tasklet
static inline void tasklet_enable(struct tasklet_struct *t);
static inline void tasklet_disable(struct tasklet_struct *t);
调度tasklet:发出软中断
static inline void tasklet_schedule(struct tasklet_struct *t);
kill tasklet
extern void tasklet_kill(struct tasklet_struct *t);
tasklet使用方法
先定义tasklet,需要使用时调用tasklet_schedule,驱动卸载前调用tasklet_kill。
tasklet_schedule只是把tasklet放入内核队列,它的func函数会在软件中断的执行过程中被调用。
调用过程:
asklet属于TASKLET_SOFTIRQ软件中断,入口函数为tasklet_action
当发生硬件中断时,内核处理完硬件中断后,会处理软件中断。对于TASKLET_SOFTIRQ软件中断,会调用tasklet_actio
n函数。
总结
执行过程还是挺简单的:从队列中找到tasklet,进行状态判断后执行func函数,从队列中删除tasklet
tasklet_schedule调度tasklet时,其中的函数并不会立刻执行,而只是把tasklet放入队列;
调用一次tasklet_schedule,只会导致tasklnet的函数被执行一次;
如果tasklet的函数尚未执行,多次调用tasklet_schedule也是无效的,只会放入队列一次。
编程
将中断服务程序中打印key值操作放到中断下半部中
probe 函数中初始化tasklet
中断服务程序中调度tasklet(触发软中断)
任务处理函数中打印key值
虽然看不懂,但我大受震惊
我只是个知识的搬运工
您才是大佬
大佬谦虚了