news 2026/7/7 20:42:21

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/7/7 18:53:04

构建一个LangChain RAG应用

构建一个LangChain RAG应用01. 外挂知识库的聊天机器人架构在 RAG 应用中&#xff0c;会通过外部的检索器/知识库检索人类的提问&#xff0c;然后将检索到的信息填充到提示模板中&#xff0c;一起传递给大语言模型&#xff0c;让其生成特定的内容&#xff0c;无论 RAG 应用有多…

作者头像 李华
网站建设 2026/7/7 10:13:34

buuctf系列解题思路祥讲--[极客大挑战 2019]HardSQL1——sql报错注入

1、解题思路 开局是一个登录框&#xff0c;并且题目已经明示了是一个困难sql&#xff0c;那我们就在用户框输入’测试发现报错&#xff0c;猜测可能是报错注入 然后后面加上#显示字符&#xff0c;那就说明存在sql注入且闭合方式为单引号 然后我们在这个单引号和#之间输入空格…

作者头像 李华
网站建设 2026/7/7 10:27:20

AI重塑云原生应用开发实战

AI重塑云原生应用开发&#xff1a;从零基础到项目高手的实战加速器 引言&#xff1a;当AI遇见云原生——新一代开发的范式革命 云原生开发的“第三阶段”已经到来。第一阶段是容器化&#xff08;Docker&#xff09;&#xff0c;第二阶段是编排化&#xff08;Kubernetes&#…

作者头像 李华