我总结出的内核工作队列中的4种用法

1. 使用系统的工作队列(不延迟)

  1)定义一个工作:

struct work_struct my_work;

  2)编写一个函数:

void my_work_func (struct work_struct *p_work)
{
printk("work func\n");
}

  3)将工作和函数绑定(一般在open函数里面执行)

INIT_WORK(&my_work, my_work_func);

  4)调度工作(实际上是加入到系统的工作队列中)

schedule_work(&my_work);

2. 使用系统的工作队列(延迟)

  1)定义一个延迟工作

struct delayed_work my_delayed_work;

  2)编写一个函数

void my_work_func (struct work_struct *p_work)
{
printk("work func\n");
}

  3)将延迟工作和函数绑定(一般在open函数里进行)

INIT_DELAYED_WORK(&my_delayed_work, my_work_func);

  4)调度工作(实际上是加入系统的工作队列中)

schedule_delayed_work(&my_delayed_work, );
schedule_delayed_work函数传入的第二个参数为系统的节拍数,一般系统默认为200Hz,因此2个节拍表示10ms,10ms之后再调用工作中的函数。

3. 使用自己的工作队列(不延迟)

  1)定义一个自己的工作队列指针

struct workqueue_struct *p_my_workqueue;

  2)创建一个工作队列,并接收返回值,可以用create_singlethread_workqueue或者create_workqueue,这一步一般在open函数中实现。

p_my_workqueue = create_singlethread_workqueue("my_workqueue");
//p_my_workqueue = create_workqueue("my_workqueue");

  3)定义一个工作

struct work_struct my_work;

  4)编写一个函数

void my_work_func (struct work_struct *p_work)
{
printk("work func\n");
}

  5)将工作和函数绑定(一般在open函数里面执行)

INIT_WORK(&my_work, my_work_func);

  6)将工作插入工作队列中便会调用工作中注册的函数

queue_work(p_my_workqueue, &my_work);

  7)销毁工作队列

destroy_workqueue(p_my_workqueue);

 

4. 使用自己的工作队列(延迟)

  1)定义一个自己的工作队列指针

struct workqueue_struct *p_my_workqueue;

  2)创建一个工作队列,并接收返回值,可以用create_singlethread_workqueue或者create_workqueue,这一步一般在open函数中实现。

p_my_workqueue = create_singlethread_workqueue("my_workqueue");
//p_my_workqueue = create_workqueue("my_workqueue");

  3)定义一个延迟工作

struct delayed_work my_delayed_work;

  4)编写一个函数

void my_work_func (struct work_struct *p_work)
{
printk("work func\n");
}

  5)将延迟工作和函数绑定(一般在open函数里进行)

INIT_DELAYED_WORK(&my_delayed_work, my_work_func);

  6)将工作插入工作队列中,n个节拍之后便会调用工作中注册的函数(n为queue_delayed_work函数中最后一个参数)

queue_delayed_work(p_my_workqueue, &my_delayed_work, );

  7)销毁工作队列

destroy_workqueue(p_my_workqueue);

推荐文章:https://www.ibm.com/developerworks/cn/linux/l-cn-cncrrc-mngd-wkq/

linux内核工作队列使用总结的更多相关文章

  1. Linux 内核工作队列之work_struct 学习总结

    前言 编写Linux驱动的时候对于work_struct的使用还是很普遍的,很早之前就在阅读驱动源码的时候就看到了它的踪影,根据其命名大概知道了它的具体作用,但是仍然不知所以,同时,伴随出现的还有de ...

  2. Linux内核实现透视---工作队列

    作为Linux中断低半部的另一种实现机制的基础,工作队列的出现更多的是为了解决软中断和Tasklet对于用户进程的时间片的不良影响问题的.工作队列本身是可以使用内核线程来替代的,但是使用线程来实现复杂 ...

  3. Linux内核中的软中断、tasklet和工作队列具体解释

    [TOC] 本文基于Linux2.6.32内核版本号. 引言 软中断.tasklet和工作队列并非Linux内核中一直存在的机制,而是由更早版本号的内核中的"下半部"(bottom ...

  4. [Linux内核]软中断、tasklet、工作队列

    转自:http://www.cnblogs.com/li-hao/archive/2012/01/12/2321084.html 软中断.tasklet和工作队列并不是Linux内核中一直存在的机制, ...

  5. 《深入理解Linux内核》软中断/tasklet/工作队列

    软中断.tasklet和工作队列并不是Linux内核中一直存在的机制,而是由更早版本的内核中的“下半部”(bottom half)演变而来.下半部的机制实际上包括五种,但2.6版本的内核中,下半部和任 ...

  6. Linux内核学习之工作队列

    Author       : Toney Email         : vip_13031075266@163.com Date          : 2020.12.02 Copyright : ...

  7. linux 内核 tasklets 原理以及工作队列

    如果某种应用并不需要在多个CPU上并行执行,那么软中断其实是没有必要的.因此诞生了弥补以上两个要求的tasklet.它具有以下特性: a)一种特定类型的tasklet只能运行在一个CPU上,不能并行, ...

  8. 20169212《Linux内核原理与分析》第六周作业

    视频学习 一.用户态.内核态和中断 内核态:处于高的执行级别下,代码可以执行特权指令,访问任意的物理地址,这时的CPU就对应内核态 用户态:处于低的执行级别下,代码只能在级别允许的特定范围内活动.在日 ...

  9. Linux内核中断学习

    1.内核中断概述 (1)在OS环境下编写中断处理函数与之前在裸机中编写中断处理函数的方式是不一样的,在Linux内核中提供了一套用来管理硬件中断资源的软件体系架构. (2)在操作系统中,中断号与gpi ...

随机推荐

  1. loj#2353. 「NOI2007」 货币兑换 斜率优化

    题意略 题解:可以列出dp方程\(dp[i]=max(dp[j]*{\frac{a[i]*c[j]+b[i]}{a[j]*c[j]+b[j]}}\),化简可以得到\(\frac{dp[i]}{b[i] ...

  2. MyBatis动态sql之${}和#{}区别

    前言 ​ 接触mybatis也是在今年步入社会之后,想想也半年多了,缺没时间去系统的学习,只知道大概,也是惭愧. ​ 不知道有多少刚毕业的同学和我一样,到现在还没仔仔细细去了解你每天都会见到使用到的框 ...

  3. yum源仓库搭建

    系统:centos7 一.安装nginx yum install -y nginx yum  install -y createrepo   安装建yum源仓库的工具,可以用来建立yum仓库yum  ...

  4. Matlab-10:Ritz-Galerkin方法求解二阶常微分方程

    一.代数多项式法: tic; clear clc % N=input('please key in the value of ''N'''); N=10; M=100; h=1/M; X=0:h:1; ...

  5. 【IDEA】【1】准备工作

    1,官方网址(https://www.jetbrains.com/idea/) 2,网盘地址(为ideaIU-2018.2.5) 链接:https://pan.baidu.com/s/1oLgY_Pb ...

  6. Leetcode 124 *

    /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode ...

  7. ECharts柱状图添加点击事件

    参考: https://zhuanlan.zhihu.com/p/33050579 https://blog.csdn.net/sophia_xiaoma/article/details/780559 ...

  8. Github 指令上手 --- 分支

    指令环境 Git Shell 1.创建一个新分支 git branch branchName 2.切换到新创建的分支 git checkout branchName 1.2合起来使用指令(创建并切换) ...

  9. [luogu P3382] 三分法

    [luogu P3382] 三分法 题目描述 如题,给出一个N次函数,保证在范围[l,r]内存在一点x,使得[l,x]上单调增,[x,r]上单调减.试求出x的值. 输入输出格式 输入格式: 第一行一次 ...

  10. 2.Liunx 系统设置

    1.基本命令:clear 2.环境变量: alias .export 大纲 系统管理命令 1.用户管理:adduser .passwd. userdel 2.用户组管理:groupadd.groupd ...