news 2026/5/25 19:34:47

52.延迟工作队列

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
52.延迟工作队列

延迟工作队列可以对原有的共享工作队列和自定义工作队列,加上定时器进一步封装,再进入中断程序的下半部分进行延迟进入。

直接延迟:「先占队列,再等延迟」→ 霸占公共资源;
delayed_work:「先等延迟,再占队列执行」→ 仅占用执行逻辑的必要时间,不浪费公共资源。

这是比在直接在中断下半段延迟的好处

驱动函数

#include <linux/module.h> #include <linux/init.h> #include <linux/interrupt.h> #include <linux/gpio.h> #include <linux/delay.h> #include <linux/workqueue.h> int irq; struct workqueue_struct *test_workqueue; struct delayed_work test_workqueue_work; // 工作项处理函数 void test_work(struct work_struct *work) { msleep(1000); printk("This is test_work\n"); } // 中断处理函数 irqreturn_t test_interrupt(int irq, void *args) { printk("This is test_interrupt\n"); // 提交延迟工作项到自定义工作队列 queue_delayed_work(test_workqueue, &test_workqueue_work, 3 * HZ); return IRQ_RETVAL(IRQ_HANDLED); } static int interrupt_irq_init(void) { int ret; irq = gpio_to_irq(101); // 将GPIO映射为中断号 printk("irq is %d\n", irq); // 请求中断 ret = request_irq(irq, test_interrupt, IRQF_TRIGGER_RISING, "test", NULL); if (ret < 0) { printk("request_irq is error\n"); return -1; } // 创建工作队列 test_workqueue = create_workqueue("test_workqueue"); // 初始化延迟工作项 INIT_DELAYED_WORK(&test_workqueue_work, test_work); return 0; } static void interrupt_irq_exit(void) { free_irq(irq, NULL); // 释放中断 cancel_delayed_work_sync(&test_workqueue_work); // 取消延迟工作项 flush_workqueue(test_workqueue); // 刷新工作队列 destroy_workqueue(test_workqueue); // 销毁工作队列 printk("bye bye\n"); } module_init(interrupt_irq_init); module_exit(interrupt_irq_exit); MODULE_LICENSE("GPL"); MODULE_AUTHOR("quan");

Makfile

obj-m += delay_workqueue.o KDIR:=/home/linux/samba-mount/linux-kernel/linux-6.17.5 PWD?=$(shell pwd) all: make -C $(KDIR) M=$(PWD) modules echo $(PWD) clean: rm -rf *.ko *.o *.mod *.mod.o *.mod.c *.symvers *.order install: cp *.ko ../../linux-kernel/linux-6.17.5/kmodules

编译及开发板验证测试

由此可以看到延迟了4秒钟,包括进入下半段和下半段延迟。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/25 8:16:37

LangChain RAG-MultiVector实现多向量检索文档

01. 多表征/向量索引多个维度记录信息 等同于为文档块生成 多个向量&#xff0c;支持的方法如下&#xff1a;把文档切割成更小的块&#xff1a;通过检索更小的块&#xff0c;但是查找其父类文档&#xff08;ParentDocumentRetriever&#xff09;。摘要&#xff1a;使用 LLM 为每…

作者头像 李华
网站建设 2026/5/26 6:04:33

鸿蒙PC UI控件库 - SecondaryButton 次要按钮详解

视频演示地址&#xff1a; &#x1f4cb; 目录 概述特性快速开始API 参考使用示例主题配置最佳实践常见问题总结 概述 SecondaryButton 是控件库中的次要按钮组件&#xff0c;适用于次要操作场景。与 PrimaryButton 的主要区别在于&#xff1a; PrimaryButton&#xff1a;实…

作者头像 李华
网站建设 2026/5/25 20:02:27

不花一分钱!2025年免费降低AI率的5个有效方法与工具指南

在论文、报告、内容创作越来越严格的时代&#xff0c;查AI率、检测AI率、降AI率 已经成为学生、写作者、博主的日常需求。很多同学因为 AI率过高被导师指出“AI痕迹太重”&#xff0c;甚至退回重写。本文今天一次性告诉你&#xff1a; 检测AI率应该注意什么 免费查AI率的网站有…

作者头像 李华
网站建设 2026/5/26 6:05:24

Vue脚手架快速搭建指南

一&#xff0c;Vue 技术文章大纲 1&#xff0c;Vue 框架概述 Vue.js 简介&#xff1a;轻量级、渐进式前端框架核心特点&#xff1a;响应式数据绑定、组件化开发、虚拟 DOM适用场景&#xff1a;单页应用&#xff08;SPA&#xff09;、复杂交互界面 2&#xff0c;Vue 核心概念…

作者头像 李华