具体定义如下:

struct workqueue_struct {

unsigned int        flags;      /* W: WQ_* flags */

union {

struct cpu_workqueue_struct __percpu    *pcpu;

struct cpu_workqueue_struct     *single;

unsigned long               v;

} cpu_wq;               /* I: cwq's */

struct list_head    list;       /* W: list of all workqueues */

struct mutex        flush_mutex;    /* protects wq flushing */

int         work_color; /* F: current work color */

int         flush_color;    /* F: current flush color */

atomic_t        nr_cwqs_to_flush; /* flush in progress */

struct wq_flusher   *first_flusher; /* F: first flusher */

struct list_head    flusher_queue;  /* F: flush waiters */

struct list_head    flusher_overflow; /* F: flush overflow list */

mayday_mask_t       mayday_mask;    /* cpus requesting rescue */

struct worker       *rescuer;   /* I: rescue worker */int         nr_drainers;    /* W: drain in progress */

int         saved_max_active; /* W: saved cwq max_active */

#ifdef CONFIG_LOCKDEP

struct lockdep_map  lockdep_map;

#endif

char            name[];     /* I: workqueue name */

};

注意:这个结构表示一个工作队列,一般情况下驱动开发者不需要接触太多这个结构成员,关于队列操作,内核都提供了相应的API函数

cpu_workqueue_struct

struct cpu_workqueue_struct {

struct global_cwq   *gcwq;      /* I: the associated gcwq */

struct workqueue_struct *wq;        /* I: the owning workqueue */

int         work_color; /* L: current color */

int         flush_color;    /* L: flushing color */

int         nr_in_flight[WORK_NR_COLORS];

/* L: nr of in_flight works */

int         nr_active;  /* L: nr of active works */

int         max_active; /* L: max active works */

struct list_head    delayed_works;  /* L: delayed works */

};

内核通过delayed_works成员把第一个 work_struct 连接起来,后面work_struct通过本身的entry成员把自己连接在链表上。

内核工作队列分类

内核工作队列分成共享工作队列和自定义工作队列两种

共享工作队列

系统在启动时候自动创建一个工作队列驱动开发者如果想使用这个队列,则不需要自己创建工作队列,只需要把自己的work添加到这个工作队列上即可。

使用schedule_work这个函数可以把work_struct添加到工作队列中

自定义工作队列

由于共享工作队列是大家共同使用的,如果上面的工作函数有存在睡眠的情况,阻塞了,则会影响到后面挂接上去的工作执行时间,当你的动作需要尽快执行,不想受其它工作函数的影响,则自己创建一个工作队列,然后把自己的工作添加到这个自定义工作队列上去。

使用自定义工作队列分为两步:

创建工作队列:使用creat_workqueue(name)创建一个名为name的工作队列

把工作添加到上面创建的工作队列上:使用queue_work函数把一个工作结构work_struc添加到指定的工作队列上

开发板Linux内核,芯灵思SinlinxA33开发板Linux内核workqueue(附实测代码)相关推荐

  1. a33 linux 硬解码_全志A33 linux led驱动编程(附实测参考代码)

    开发平台 开发平台 * 芯灵思SinlinxA33开发板 嵌入式linux 开发板交流 QQ:641395230 #实验原理 在芯灵思开发板上,没有led灯模块,只能通过引脚电平观察: 这里我选择LS ...

  2. 全志a64linux内核编译,芯灵思Sinlinx A64 Linuxqt编译安装

    开发平台 芯灵思Sinlinx A64 内存: 1GB 存储: 4GB 开发板交流 641395230 前提条件搭建好CentOS环境 光盘目录 :芯灵思SIN-A64光盘资料\Linux & ...

  3. linux内核移植开发板,mini2440学习之(一)-------移植linux内核

    请 登录 后使用快捷导航 没有帐号?注册 阅 4622|回 2 最后登录2013-8-22 在线时间22 小时 威望2878分 芯积分608分(兑换) E金币好友 发表于2009-9-22 15:02 ...

  4. linux内核剪裁 4412,itop4412开发板-Linux内核的编译

    本篇文章基于itop4412开发板 5.3.2.1源码目录 Linux 内核源码在光盘"06_源码_uboot 和 kernel"目录下,如下图所示. 5.3.2.2 编译器 内核 ...

  5. 迅为RK3588开发板Linux安卓12瑞芯微ARM核心板人工智能工业AI主板

    一.处理器介绍 RK3588 是一款低功耗.高性能的处理器,适用于基于 arm 的 PC 和 Edge 计算设备.个人移动互联网设备等数字多媒体应用,采用 8nm 结构,将四核 Cortex-A76 ...

  6. 讯为开发板移植linux,迅为I.MX6ULL开发板移植Linux5.4内核教程

    4412上移植最新5.4内核的流程非常的简单,因为4412被Linux官方支持,那么我们来看一下怎么把官方5.4内核移植到我们的I.MX6ULL终结者开发板上. 平台:i.MX6ULL开发板 前言 本 ...

  7. 龙芯智龙开发板:驱动步进电机实战入门

    本文面向初学者,请多各位高手包涵.我在此特别致谢勤为本先生为我提供的帮助. 步进电机 步进电机就是一种受脉冲控制的电机,步进电机接收到一系列某种调制顺序的脉冲,做出相应的反应,转到相应的角度或者相应的 ...

  8. linux can总线接收数据串口打包上传_使用Zedboard开发板学习Linux的移植及驱动开发...

    本文是昨天发的文章<龙芯杯CPU设计竞赛与ZYNQ设计流程介绍>接续部分.重点介绍传统方式的Linux移植和Xilinx的Petalinux的快速移植开发两种. 部分硬件设计中需要CPU完 ...

  9. 迅为LS2k1000龙芯国产双核开发板烧写系统到 U 盘

    龙芯的系统可以存放在 Nand Flash,SD 卡,U 盘,固态或者是网络加载,迅为的龙芯开发板核心板默认没有焊接 Nand Flash,是将文件系统存储在底板的固态硬盘上,这一章节我们将系统烧写到 ...

  10. 迅为瑞芯微iTOP-3399开发板资料更新

    iTOP-3399开发板使用手册更新啦,最新版本为2.3版本.与开发板使用手册配套的<嵌入式Linux开发指南(iTOP-3399)>手册也更新啦,最新版本为1.4版本. 后续资料会不断更 ...

最新文章

  1. 象 DEV-Club 那样的彩色校验码
  2. Java培训的学费标准是多少
  3. R语言ggplot2可视化设置轴坐标上的数值全部为整数实战:display only integer values on axis
  4. Jmeter----连接mysql数据库及常见问题处理
  5. 用javascript实现一个stack overflow的例子
  6. python自然语言处理库_Python自然语言处理工具库(含中文处理)
  7. 《大数据》2021年第2期目次摘要
  8. fragment类中的点击事件空指针异常
  9. 微设计(www.weidesigner.com)介绍系列文章(三)
  10. java.lang.IllegalArgumentException: addChild: Child name '/SSHE' is not unique
  11. jQuery源码解读一
  12. 简单方法去除WPS广告
  13. 深蓝英文字幕助手(一款看原声影片和英文字幕学英语的小软件)发布
  14. Opengl glm配置出错
  15. Windows程序设计-剪贴板
  16. 为Linux内核函数插入二进制指令并且校准偏移的手艺
  17. Uber正式提交IPO文件:将在纽交所上市 高盛摩根士丹利等担任承销商
  18. JBook api 相关使用说明
  19. Java——【案例】Java坦克大战游戏[版本1]能控制移动的GUI界面坦克大战游戏
  20. 数据处理与特征工程:One-Hot Encoder独热编码、Label Encoder标签编码、Binary Encoder二进制编码

热门文章

  1. BZOJ1877 [SDOI2009]晨跑 【费用流】
  2. (转)Android调试运行时错误之Process XXX terminated by signal (11)
  3. opengl 遇到的基础问题
  4. java 操作linux_java程序里调用linux命令
  5. 搜狗浏览器智慧版_搜狗浏览器2019官方版下载,搜狗浏览器2019官方版 v3.2.1
  6. 拓端tecdat|R语言如何在生存分析与Cox回归中计算IDI,NRI指标
  7. class文件如何在linux下打开_Linux下文件的三个时间属性
  8. ubuntu上下左右变成BD
  9. Caffe傻瓜系列(10):draw_net.py绘制caffe net结构
  10. 使用Python从头开始实现基线机器学习算法