在linux中断编程中,需要中断程序分成中断顶部和中断底部两部分,顶部负责做中断标志,然后耗时的事情在中断底部执行。顶部不能被其他进程中断,而底部可以被其他进程中断,也可以被硬中断事件中断。底部分代码实现可以通过内核共享工作队列实现。
1)核心结构
Workqueue.h include\Linux
struct work_struct {
atomic_long_t data;
struct list_head entry;
work_func_t func; /* 工作函数指针 */
#ifdef CONFIG_LOCKDEP
struct lockdep_map lockdep_map;
#endif
};
工作函数原型:
typedef void (*work_func_t)(struct work_struct *work);
unc指针所指向的函数:一般是就需要延后执行代码。一般使用编写中断底部代码。
内核使用这个结构来描述一个工作,一个工作简单理解就是对应于一个函数,可以通过内核调度函数来调用work_struct中func指针所指向的函数。
work_func_t函数中的参数就是指向struct work_struct 结构本身。
利用这个特征可以实现在工作函数中访问自定的结构中的其他成员,如:自定义一个数据结构,内部嵌入一个 struct work_struct。
struct myvar{
struct work_struct work;
int x;
int y;
}
struct myvar var;
关键宏:
INIT_WORK(_work, _func) :初始化一个work结构
_work: struct work_struct work结构指针
_func:用来填充work_struct work结构的fun指针(work