Linux内核中断底半部处理--工作队列
工作队列的使用过程:
工作队列相关函数介绍:
#include <workqueue.h> /*头文件包含*/
1.工作队列的创建及销毁:
定义一个工作队列结构体指针
static struct workqueue_struct *key_workqueue;
创建工作队列
struct workqueue_struct *create_workqueue(char *);
参数:工作队列的名称(字符串)
返回值:创建好的工作队列
销毁工作队列,参数为待销毁的工作队列
void destroy_workqueue(struct workqueue_struct *);
2.工作的创建、初始化
创建一个不带延时的工作(加入队列立即执行)
struct work_struct work;
工作初始化宏
INIT_WORK(&work, func);
参数1:用户已定义的work_struct变量(工作)
参数2:任务处理函数,用户实现(中断底半部)
3.添加工作到工作队列
int queue_work(struct workqueue_struct*wq,struct work_struct *work);
参数1:第1部创建的工作队列
参数2:第2部创建的工作
4.延迟工作的创建、初始化及添加:
定义一个带延时的工作
struct delayed_work dwork;
初始化带延迟的工作
INIT_DELAYED_WORK(&dwork, func);
添加带延迟的工作到工作队列
int queue_delayed_work(struct workqueue_struct *wq,
struct delayed_work *dwork, unsigned long delay);
参数delay:延迟时间(时钟滴答数)
【注】对于我们的开发板,一个时钟滴答=5ms
终止队列中的工作(即使处理程序已经在处理该任务)
int cancel_work_sync(struct work_struct *work);
int cancel_delayed_work_sync(struct delayed_work *dwork);
判断任务项目是否在进行中
int work_pending(struct work_struct work );
int delayed_work_pending(structdelayed_work work );
/*返回值为真表示正在运行,假表示停止*/