Linux驱动开发八股文:工作队列(Workqueue)

📚 Linux 驱动开发笔记:工作队列 (Workqueue)

一、 核心定义

工作队列是 Linux 内核中断下半部(Bottom Half)的一种重要机制。它允许你将耗时的、需要等待资源或可能导致休眠的任务,从中断处理函数(ISR)中推迟到稍后的进程上下文中执行。

  • 关键特性:运行于进程上下文,可以休眠
  • 执行主体:内核线程(如kworker/0:2)。

二、 为什么需要工作队列? (对比 Tasklet)

在内核中,中断下半部主要有两种选择,它们的区别在于“执行环境”:

特性Tasklet工作队列 (Workqueue)
执行上下文中断(软中断)上下文进程上下文
能否休眠绝不可以(会系统崩溃)可以(如使用msleep
访问用户空间不可以不可以(虽然在进程上下文,但没有用户页表)
优先级极高,仅次于硬中断较低,由调度器决定
代表身份借用当前进程的“皮”拥有独立的内核线程 (kworker)

三、 工作队列的运作机制

  1. 提交任务:驱动在 ISR 中通过schedule_work函数提交一个work_struct
  2. 排队等待:该任务进入系统默认的工作队列链表。
  3. 唤醒线程:内核唤醒对应的内核线程(kworker)。
  4. 执行任务kworker线程从链表中取出任务,调用你编写的处理函数。
  5. 结束/调度:处理函数完成后,kworker线程继续处理下一个任务,或者进入睡眠。

四、 核心 API 与编程步骤

1. 定义工作结构体与处理函数

处理函数的参数是结构体本身,通常通过container_of获取私有数据。

struct work_struct my_work; void my_work_func(struct work_struct *work) { // 这里可以休眠! // printk("current->comm: %s, pid: %d\n", current->comm, current->pid); }
2. 初始化 (Init)

probe函数中完成,将函数指针绑定到结构体。

// 动态初始化 INIT_WORK(&gpio_key->work, my_work_func); // 或者静态定义 // DECLARE_WORK(name, function);
3. 调度 (Schedule)

在中断上半部(ISR)中调用,触发异步执行。

static irqreturn_t gpio_key_isr(int irq, void *dev_id) { schedule_work(&gpio_key->work); // 只是挂入队列,不阻塞 return IRQ_HANDLED; }

五、 实验现象深度解析

根据实验日志:

[165328.733643] {WORK_FUNC:}the process is kworker/0:2, its pid is 1722
  1. 身份证明current->commkworker/0:2,证明了工作队列不再是“借用”别人的身份,而是由内核专属的“工人”线程在干活。
  2. PID 1722:这是一个真实的进程 ID。在 Linux 中,凡是有 PID 的都能被调度器控制,这就是它为什么可以休眠的根本原因。
  3. 时序关系:日志中TASKLET总是先于WORK_FUNC打印。这是因为 Tasklet 优先级更高,在中断返回的瞬间执行;而 Workqueue 需要等待调度器切换到kworker线程,存在毫秒级的调度延迟。

六、 注意事项与避坑指南

  1. 顺序阻塞:默认的工作队列由同一个kworker线程依序处理。如果你在一个 Work 函数里写了while(1)或休眠太久,会堵塞同一个队列里的其他工作
  2. 重入性:如果在 Work 还没执行完时又发生了中断并schedule_work,内核通常不会重复启动同一个 Work 实例,它会等待当前运行的结束后再决定是否再次触发。
  3. API 演进:4.x 以后内核引入了CMWQ (Concurrency Managed Workqueue),它能更聪明地在多核之间分配任务,避免单个耗时任务卡死整个 CPU 的工作队列。

七、 总结:何时选择工作队列?

  • 任务很重(如:读取 1MB 的 Flash 数据)。
  • 需要等待(如:等待某个信号量、互斥锁)。
  • 需要延时(如:逻辑要求按键按下后等待 100ms 再读取)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1156000.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux应用与驱动开发:mmap和内存映射

学习笔记:Linux 驱动开发之 mmap 与内存映射 1. 核心概念:什么是 mmap? mmap (Memory Map) 是一种内存映射文件的方法。在嵌入式 Linux 驱动开发中,它主要用于将外设的物理地址(如 GPIO 寄存器)映射到用户进…

Day 34:【99天精通Python】单元测试 (Unittest) - 给代码上个保险

Day 34:【99天精通Python】单元测试 (Unittest) - 给代码上个保险 前言 欢迎来到第34天! 在之前的开发中,我们通常是怎么验证代码对不对的? —— 写完代码,手动运行一下,输入几个参数,看看打印结…

Day 35:【99天精通Python】综合实战 - 爬虫与数据分析可视化(上) - 数据采集与入库

Day 35:【99天精通Python】综合实战 - 爬虫与数据分析可视化(上) - 数据采集与入库 前言 欢迎来到第35天! 经过前两周的学习,我们已经掌握了网络请求(Requests)、网页解析(BeautifulSoup)、数…

多FDCAN接口同步配置实战:双通道并行通信实现

多FDCAN接口实战:双通道并行通信如何突破带宽瓶颈你有没有遇到过这样的情况?在开发一个高实时性的车载控制模块时,CAN总线突然“卡顿”——数据延迟飙升、报文丢失频发。排查一圈后发现,并不是硬件故障,而是单条CAN通道…

强烈安利10个AI论文软件,MBA毕业论文轻松搞定!

强烈安利10个AI论文软件,MBA毕业论文轻松搞定! AI 工具如何让论文写作更高效? 在当前的学术环境中,MBA 学生和研究者们正面临越来越多的挑战。从选题到撰写,再到查重与修改,每一个环节都可能成为耗时费力的…

Figma中文界面本地化:设计师专属的语言解决方案

Figma中文界面本地化:设计师专属的语言解决方案 【免费下载链接】figmaCN 中文 Figma 插件,设计师人工翻译校验 项目地址: https://gitcode.com/gh_mirrors/fi/figmaCN 语言障碍的痛点与解决方案 对于国内设计从业者而言,Figma作为专…

Day 36:【99天精通Python】综合实战 - 爬虫与数据分析可视化(下) - 让数据“说话“

Day 36:【99天精通Python】综合实战 - 爬虫与数据分析可视化(下) - 让数据"说话" 前言 欢迎来到第36天! 在昨天(Day 35)的课程中,我们化身为"数据采集员",成功编写爬虫抓取了豆瓣 Top2…

导师推荐!8个AI论文平台测评:研究生开题报告全攻略

导师推荐!8个AI论文平台测评:研究生开题报告全攻略 学术写作工具测评:为什么需要一份精准的AI论文平台榜单 在研究生阶段,开题报告和论文撰写是科研工作的核心环节,而高效、专业的写作工具能显著提升研究效率与成果质…

Intel平台嵌入式SPI通信:新手教程

Intel平台嵌入式SPI通信:从零理解eSPI的实战指南你有没有遇到过这样的情况?在调试一块工业主板时,发现电源键按下后系统无法唤醒;或者在做低功耗设计时,明明进入了S3睡眠,传感器数据却断了传输。这些问题的…

Doris与Trino集成:统一SQL大数据查询引擎

Doris与Trino集成:统一SQL大数据查询引擎 关键词:Doris、Trino、SQL查询引擎、大数据分析、数据仓库、联邦查询、OLAP 摘要:本文深入探讨了Apache Doris与Trino两大流行SQL查询引擎的集成方案,旨在构建统一的大数据查询平台。文章首先分析了两者的架构特点和互补优势,然后…

Day 38:【99天精通Python】线程池与进程池 - 优雅地管理并发

Day 38:【99天精通Python】线程池与进程池 - 优雅地管理并发 前言 欢迎来到第38天! 在 Day 24 和 Day 25 中,我们学习了如何手动创建线程 (threading.Thread) 和进程 (multiprocessing.Process)。虽然原理都懂了,但在实际工程中&a…

“死了么”App爆火,我发现了个安卓版,代码开源!

最近看到一个特别搞笑的评论: 当代年轻人日常:用「饿了么」填饱肚子,「死了么」证明还活着 😂 随着前几天「死了么」APP 爆火,网上的段子手们就没停下来过,哈哈哈哈哈 iPhone版 「死了么」是iPhone手机上…

Figma中文插件完全配置指南:告别英文界面困扰

Figma中文插件完全配置指南:告别英文界面困扰 【免费下载链接】figmaCN 中文 Figma 插件,设计师人工翻译校验 项目地址: https://gitcode.com/gh_mirrors/fi/figmaCN 还在为Figma复杂的英文界面而头疼吗?面对专业设计工具,…

基于YOLOv8的小麦田间病害识别项目|完整源码数据集+PyQt5界面+完整训练流程+开箱即用!

基于YOLOv8的小麦田间病害识别项目|完整源码数据集PyQt5界面完整训练流程开箱即用! 源码包含:完整YOLOv8训练代码数据集(带标注)权重文件直接可允许检测的yolo检测程序直接部署教程/训练教程 基本功能演示 源码在文末哔哩哔哩视频简介处获…

基于Simulink的混合PO与INC切换MPPT策略仿真

目录 手把手教你学Simulink 一、引言:为什么需要“混合P&O与INC”? 二、系统整体架构 控制流程: 三、核心算法详解 1. P&O 算法(扰动观察法) 2. INC 算法(电导增量法) 3. 光照突…

多语言界面在screen中的实现:项目应用

用 GNU Screen 构建轻量级多语言终端界面:从原理到实战你有没有遇到过这样的场景?一位中国工程师深夜远程连接非洲基站的工控设备,刚准备执行配置命令时断网了。几小时后重新登录,发现之前的调试流程全中断了——日志没了、上下文…

学长亲荐8个一键生成论文工具,专科生毕业论文必备!

学长亲荐8个一键生成论文工具,专科生毕业论文必备! AI 工具让论文写作不再难 在当前的学术环境中,AI 工具已经成为许多学生和研究者不可或缺的助手。尤其是对于专科生而言,面对繁重的毕业论文任务,如何高效地完成内容撰…

Figma中文界面终极解决方案:5分钟完成专业设计工具全面汉化

Figma中文界面终极解决方案:5分钟完成专业设计工具全面汉化 【免费下载链接】figmaCN 中文 Figma 插件,设计师人工翻译校验 项目地址: https://gitcode.com/gh_mirrors/fi/figmaCN 还在为Figma英文操作界面而困扰?想要快速掌握这款国际…

基于Simulink的多时间常数储能配置优化仿真

手把手教你学Simulink--基础储能管理场景实例:基于Simulink的多时间常数储能配置优化仿真 手把手教你学Simulink ——基础储能管理场景实例:基于Simulink的多时间常数储能配置优化仿真 一、引言:为什么需要“多时间常数储能”? …

大模型微调技术详解:从全参数微调到RLHF的演进与应用

文章系统介绍了大模型微调技术的发展历程,从2018年全参数微调到2023年的偏好对齐技术,包括特征提取、Adapter、LoRA、提示微调、指令微调等方法。分析了各种微调技术的原理、特点和适用场景,解释了微调为何在大模型时代取代从零训练&#xff…