news 2026/8/9 1:53:28

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/8/7 17:36:41

如何快速搭建个人云存储网盘:ZPan完整使用指南

ZPan是一个基于云存储的自托管网盘系统&#xff0c;它让你能够轻松搭建私人或企业级云盘&#xff0c;摆脱传统服务器带宽限制。这个开源项目采用Go语言开发&#xff0c;性能高效稳定&#xff0c;支持多种云存储服务商&#xff0c;是构建私有云存储的理想选择。 【免费下载链接】…

作者头像 李华
网站建设 2026/8/7 19:10:48

如何写出优秀的单元测试?

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快写出优秀的单元测试需要考虑以下几个方面&#xff1a;1. 测试用例设计测试用例应该覆盖被测试代码的不同场景和边界情况&#xff0c;以尽可能发现潜在的问题。在设计…

作者头像 李华
网站建设 2026/8/7 16:34:32

LLM - 从 Prompt 到上下文工程:面向 Java 的生产级 AI Agent 设计范式

文章目录引言&#xff1a;从“会写代码”到“能托付工作”Agent 能力边界与安全前提Prompt 注入威胁的现实形态多层防注入策略&#xff1a;从模型到框架工具设计&#xff1a;从“能用”到“好用又安全”工具调用策略&#xff1a;循环而非流水线上下文工程&#xff1a;从 Prompt…

作者头像 李华
网站建设 2026/8/4 2:57:56

完结 风哥Oracle RAC+DG生产实战(4):Oracle21c RAC DataGuard搭建2+2

如何高效掌握《Oracle 21c RAC DataGuard 22架构实战指南》并生成技术文章想要快速且有效地消化这篇架构实战指南&#xff0c;并将其精髓转化为一篇属于自己的技术文章&#xff0c;可以遵循以下系统化的学习与写作路径。这不仅适用于本文&#xff0c;也是学习任何复杂技术文档的…

作者头像 李华
网站建设 2026/8/7 0:24:49

AudioGen文本到音频生成技术深度解析

AudioGen文本到音频生成技术深度解析 【免费下载链接】audiocraft Audiocraft is a library for audio processing and generation with deep learning. It features the state-of-the-art EnCodec audio compressor / tokenizer, along with MusicGen, a simple and controlla…

作者头像 李华
网站建设 2026/8/7 19:22:35

泛型的相关知识

定义类、接口、方法时&#xff0c;同时声明了一个或多个类型变量&#xff08;如&#xff1a;<E>&#xff09;&#xff0c;称为泛型类、泛型接口、泛型方法&#xff0c;他们统称为泛型。public class ArrayList<E> {//... }作用&#xff1a;泛型提供了在编译阶段约束…

作者头像 李华