linux 中断之工作队列workqueue (自己创建的工作队列,减小默认线程负担)

本文主要是介绍linux 中断之工作队列workqueue (自己创建的工作队列,减小默认线程负担),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

默认工作队列和自己创建工作队列对比介绍

1、上一节我们用的是schedule_work(&btn_work);  和 schedule_delayed_work(&btn_dwork, 5*HZ);调度任务

这两个调度函数都是把任务交个内核默认线程(event)管理执行,一旦向内核默认线程提交的任务太多,将导致内核默认线程负担太重,影响实时性

2、这一节我们使用的是queue_work(btn_wq, &btn_work); queue_delayed_work(btn_wq, &btn_dwork, 3*HZ);调度任务

这两个函数将会将我们的工作任务添加到自己的新创建的线程中,减小默认线程的负担

1、创建自己的工作队列

//分配工作队列的指针
static struct workqueue_struct *btn_wq;//创建自己的工作队列和自己的内核线程btn_wq = create_workqueue("mybuttons");

2、登记调度

    //将自己的工作和自己的工作队列进行管理,然后再登记queue_work(btn_wq, &btn_work);//将自己延时的工作和自己的工作队列进行关联,然后再登记queue_delayed_work(btn_wq, &btn_dwork, 3*HZ);

参考代码

#include <linux/init.h>
#include <linux/module.h>
#include <linux/irq.h>
#include <linux/interrupt.h>//定义按键硬件相关的数据结构
struct button_resource {int irq;    //中断号char *name; //中断名称
};//初始化按键信息
static struct button_resource btn_info[] = {[0] = {.irq = IRQ_EINT(0),.name = "KEY_UP"},[1] = {.irq = IRQ_EINT(1),.name = "KEY_DOWN"}
};//分配工作和延时工作
static struct work_struct btn_work;
static struct delayed_work btn_dwork;//分配工作队列的指针
static struct workqueue_struct *btn_wq;//工作处理函数
static void btn_work_func(struct work_struct *work)
{printk("%s: %#x\n", __func__, work);
}//延时工作处理函数
static void btn_dwork_func(struct work_struct *work)
{printk("%s: %#x\n", __func__, work);
}//中断处理函数就是顶半部
static irqreturn_t button_isr(int irq, void *dev_id)
{//登记工作,内核会在适当的时候执行工作对应的处理函数//schedule_work(&btn_work);//登记延时工作,并且指定延时的时间间隔为3S//schedule_delayed_work(&btn_dwork, 3*HZ);//将自己的工作和自己的工作队列进行管理,然后再登记queue_work(btn_wq, &btn_work);//将自己延时的工作和自己的工作队列进行关联,然后再登记queue_delayed_work(btn_wq, &btn_dwork, 3*HZ);printk("%s\n", __func__);return IRQ_HANDLED; //处理完毕
}static int btn_init(void)
{int i;printk("register irq!\n");for (i = 0; i < ARRAY_SIZE(btn_info); i++)request_irq(btn_info[i].irq, button_isr, IRQF_TRIGGER_RISING|IRQF_TRIGGER_FALLING,btn_info[i].name, &btn_info[i]);//初始化工作和延时的工作INIT_WORK(&btn_work, btn_work_func); //指定工作处理函数INIT_DELAYED_WORK(&btn_dwork, btn_dwork_func); //指定延时工作处理函数printk("%s: %#x, %#x\n", __func__, &btn_work, &btn_dwork);//创建自己的工作队列和自己的内核线程btn_wq = create_workqueue("mybuttons");return 0;
}static void btn_exit(void)
{int i;printk("unregister irq!\n");//注意注册中断传递的参数和释放中断传递的参数一定要一致!for(i = 0; i < ARRAY_SIZE(btn_info); i++)free_irq(btn_info[i].irq, &btn_info[i]);//销毁自己的工作队列和内核线程destroy_workqueue(btn_wq);
}
module_init(btn_init);
module_exit(btn_exit);
MODULE_LICENSE("GPL");

 

这篇关于linux 中断之工作队列workqueue (自己创建的工作队列,减小默认线程负担)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/439051

相关文章

Linux中压缩、网络传输与系统监控工具的使用完整指南

《Linux中压缩、网络传输与系统监控工具的使用完整指南》在Linux系统管理中,压缩与传输工具是数据备份和远程协作的桥梁,而系统监控工具则是保障服务器稳定运行的眼睛,下面小编就来和大家详细介绍一下它... 目录引言一、压缩与解压:数据存储与传输的优化核心1. zip/unzip:通用压缩格式的便捷操作2.

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

Linux中SSH服务配置的全面指南

《Linux中SSH服务配置的全面指南》作为网络安全工程师,SSH(SecureShell)服务的安全配置是我们日常工作中不可忽视的重要环节,本文将从基础配置到高级安全加固,全面解析SSH服务的各项参... 目录概述基础配置详解端口与监听设置主机密钥配置认证机制强化禁用密码认证禁止root直接登录实现双因素

在Linux终端中统计非二进制文件行数的实现方法

《在Linux终端中统计非二进制文件行数的实现方法》在Linux系统中,有时需要统计非二进制文件(如CSV、TXT文件)的行数,而不希望手动打开文件进行查看,例如,在处理大型日志文件、数据文件时,了解... 目录在linux终端中统计非二进制文件的行数技术背景实现步骤1. 使用wc命令2. 使用grep命令

python如何创建等差数列

《python如何创建等差数列》:本文主要介绍python如何创建等差数列的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python创建等差数列例题运行代码回车输出结果总结python创建等差数列import numpy as np x=int(in

Linux如何快速检查服务器的硬件配置和性能指标

《Linux如何快速检查服务器的硬件配置和性能指标》在运维和开发工作中,我们经常需要快速检查Linux服务器的硬件配置和性能指标,本文将以CentOS为例,介绍如何通过命令行快速获取这些关键信息,... 目录引言一、查询CPU核心数编程(几C?)1. 使用 nproc(最简单)2. 使用 lscpu(详细信

SpringBoot集成LiteFlow工作流引擎的完整指南

《SpringBoot集成LiteFlow工作流引擎的完整指南》LiteFlow作为一款国产轻量级规则引擎/流程引擎,以其零学习成本、高可扩展性和极致性能成为微服务架构下的理想选择,本文将详细讲解Sp... 目录一、LiteFlow核心优势二、SpringBoot集成实战三、高级特性应用1. 异步并行执行2

怎么用idea创建一个SpringBoot项目

《怎么用idea创建一个SpringBoot项目》本文介绍了在IDEA中创建SpringBoot项目的步骤,包括环境准备(JDK1.8+、Maven3.2.5+)、使用SpringInitializr... 目录如何在idea中创建一个SpringBoot项目环境准备1.1打开IDEA,点击New新建一个项

如何使用Maven创建web目录结构

《如何使用Maven创建web目录结构》:本文主要介绍如何使用Maven创建web目录结构的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录创建web工程第一步第二步第三步第四步第五步第六步第七步总结创建web工程第一步js通过Maven骨架创pytho

linux重启命令有哪些? 7个实用的Linux系统重启命令汇总

《linux重启命令有哪些?7个实用的Linux系统重启命令汇总》Linux系统提供了多种重启命令,常用的包括shutdown-r、reboot、init6等,不同命令适用于不同场景,本文将详细... 在管理和维护 linux 服务器时,完成系统更新、故障排查或日常维护后,重启系统往往是必不可少的步骤。本文