当前位置: 首页 > 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.xdnf.cn/news/1133893.html

相关文章:

  • socket和websocket的区别
  • LeafletJS 进阶:GeoJSON 与动态数据可视化
  • rocky8 --Elasticsearch+Logstash+Filebeat+Kibana部署【7.1.1版本】
  • 【开源.NET】一个 .NET 开源美观、灵活易用、功能强大的图表库
  • MAC 苹果版Adobe Photoshop 2019下载及保姆级安装教程!!
  • 信而泰×DeepSeek:AI推理引擎驱动网络智能诊断迈向 “自愈”时代
  • SupMotion 云迁移数据工具实现原理(上)
  • unity VR linerenderer的线会被UI盖住
  • 鸿蒙系统账号与签名内容整理
  • 网络安全初级(Python实现sql自动化布尔盲注)
  • 基于大数据电信诈骗行为分析与可视化预测系统的设计与实现【海量数据、多种机器学习对比、数据优化、过采样】
  • PDF 转 Word 支持加密的PDF文件转换 批量转换 编辑排版自由
  • 混合参数等效模型
  • 暑假---作业2
  • LLM指纹底层技术——注意力机制变体
  • Mybatis07-逆向工程
  • 【代码】基于CUDA优化的RANSAC实时激光雷达点云地面分割
  • 参数检验?非参数检验?
  • java工具类Hutool
  • 工业网络协议桥接设计指南:从LIN到CAN/RS-232的毫秒级互通方案
  • 推客系统开发:从零构建高并发社交平台的技术实践
  • 基于springboot+vue的酒店管理系统设计与实现
  • 事务~~~
  • 横向移动(下)
  • 关于redis各种类型在不同场景下的使用
  • 消息中间件(Kafka VS RocketMQ)
  • UDP和TCP的主要区别是什么?
  • 单片机(STM32-中断)
  • 构建足球实时比分APP:REST API与WebSocket接入方案详解
  • 比特币技术简史 第二章:密码学基础 - 哈希函数、公钥密码学与数字签名