当前位置: 首页 > news >正文

Linux 驱动中 Timer / Tasklet / Workqueue 的作用与对比

Linux 驱动中 Timer / Tasklet / Workqueue 的作用与对比

🧩 1. 使用场景概览(对比表)

机制执行上下文是否可睡眠使用场景常用接口
Timer中断上下文❌ 不可睡眠延迟执行(如防抖、超时处理)add_timer()
Tasklet软中断上下文❌ 不可睡眠中断后的轻量快速处理tasklet_schedule()
Workqueue进程上下文✅ 可睡眠可阻塞、耗时操作(如 I/O)schedule_work()

🧠 2. 各机制作用详解

🔧 Timer(定时器)

  • 作用:延迟执行某个函数,常用于按键防抖、超时控制等
  • 上下文:中断上下文(不可睡眠)
  • 示例
    struct timer_list my_timer;
    timer_setup(&my_timer, my_timer_handler, 0);
    mod_timer(&my_timer, jiffies + msecs_to_jiffies(20));
    

⚡ Tasklet(软中断)

  • 作用:将中断处理函数中不能做的工作,延后到软中断上下文处理。
  • 上下文:软中断上下文(不可阻塞)。
示例:
struct tasklet_struct tasklet;
DECLARE_TASKLET(my_tasklet, tasklet_handler, data);
tasklet_schedule(&my_tasklet);

🧵 Workqueue(工作队列)

  • 作用:将任务放到内核线程中执行,可以使用阻塞操作,适合复杂或耗时的任务。
  • 上下文:进程上下文(可阻塞)。
示例:
struct work_struct work;                  // 定义工作队列结构体
void work_handler(struct work_struct *work) {printk(KERN_INFO "Work handler executed\n");
}
INIT_WORK(&my_work, work_handler);        // 初始化工作队列,绑定处理函数work_handler
schedule_work(&my_work);                  // 将工作队列加入调度队列
三种方式调用func示例:
static irqreturn_t gpio_key_isr(int irq, void *dev_id)
{struct gpio_key *gpio_key = dev_id;//printk("gpio_key_isr key %d irq happened\n", gpio_key->gpio);tasklet_schedule(&gpio_key->tasklet);mod_timer(&gpio_key->key_timer, jiffies + HZ/50);schedule_work(&gpio_key->work);// schedule_work:调度工作队列(需在非原子上下文中调用)return IRQ_HANDLED;
}
http://www.lryc.cn/news/590031.html

相关文章:

  • [特殊字符] CentOS 7 离线安装 MySQL 5.7 实验
  • 【Linux】基本指令详解(二) 输入\输出重定向、一切皆文件、认识管道、man、cp、mv、echo、cat
  • VirtualBox 中 CentOS 7 双网卡配置静态 IP
  • C++ - 仿 RabbitMQ 实现消息队列--sqlite与gtest快速上手
  • Spring Boot 项目中数据同步之binlog和MQ
  • C++修炼:IO流
  • 有哪些好用的原型设计软件?墨刀、Axure等测评对比
  • AI产品经理面试宝典第25天:AI+机器人产品设计与技术落地面试题与答法
  • 使用 bat 批量创建带有项目前缀名的文件夹结构
  • 人工智能与机器人研究|深孔内表面缺陷特征内窥测量方法研究
  • Netty介绍和基本代码演示
  • 清理C盘方法
  • PyTorch中张量(TensorFlow)操作方法和属性汇总详解和代码示例
  • Postman接口
  • 【开源.NET】一个 .NET 开源美观、灵活易用、功能强大的图表库
  • GraphQL与REST在微服务接口设计中的对比分析与实践
  • Nacos 开源 MCP Router,加速 MCP 私有化部署
  • Linux开发利器:探秘开源,构建高效——基础开发工具指南(上)【包管理器/Vim】
  • 【Fastapi】Token验证与Postman模拟测试
  • HTTP REST API、WebSocket、 gRPC 和 GraphQL 应用场景和底层实现
  • IPv6
  • JavaScript进阶篇——第六章 内置构造函数与内置方法
  • qt 中英文翻译 如何配置和使用
  • AR智能巡检:电力行业数字化转型的“加速器”
  • 二分查找法
  • 力扣面试150(31/150)
  • 坐标系和相机标定介绍,张正友标定法原理,opencv标定
  • C++:现代 C++ 编程基石,C++11核心特性解析与实践
  • NLP:LSTM和GRU分享
  • NO.6数据结构树|二叉树|满二叉树|完全二叉树|顺序存储|链式存储|先序|中序|后序|层序遍历