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

相关文章

springboot控制bean的创建顺序

《springboot控制bean的创建顺序》本文主要介绍了spring-boot控制bean的创建顺序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随... 目录1、order注解(不一定有效)2、dependsOn注解(有效)3、提前将bean注册为Bea

线程池ThreadPoolExecutor应用过程

《线程池ThreadPoolExecutor应用过程》:本文主要介绍如何使用ThreadPoolExecutor创建线程池,包括其构造方法、常用方法、参数校验以及如何选择合适的拒绝策略,文章还讨论... 目录ThreadPoolExecutor构造说明及常用方法为什么强制要求使用ThreadPoolExec

Java线程池核心参数原理及使用指南

《Java线程池核心参数原理及使用指南》本文详细介绍了Java线程池的基本概念、核心类、核心参数、工作原理、常见类型以及最佳实践,通过理解每个参数的含义和工作原理,可以更好地配置线程池,提高系统性能,... 目录一、线程池概述1.1 什么是线程池1.2 线程池的优势二、线程池核心类三、ThreadPoolE

C#高效实现在Word文档中自动化创建图表的可视化方案

《C#高效实现在Word文档中自动化创建图表的可视化方案》本文将深入探讨如何利用C#,结合一款功能强大的第三方库,实现在Word文档中自动化创建图表,为你的数据呈现和报告生成提供一套实用且高效的解决方... 目录Word文档图表自动化:为什么选择C#?从零开始:C#实现Word文档图表的基本步骤深度优化:C

Python列表的创建与删除的操作指南

《Python列表的创建与删除的操作指南》列表(list)是Python中最常用、最灵活的内置数据结构之一,它支持动态扩容、混合类型、嵌套结构,几乎无处不在,但你真的会创建和删除列表吗,本文给大家介绍... 目录一、前言二、列表的创建方式1. 字面量语法(最常用)2. 使用list()构造器3. 列表推导式

Linux内核定时器使用及说明

《Linux内核定时器使用及说明》文章详细介绍了Linux内核定时器的特性、核心数据结构、时间相关转换函数以及操作API,通过示例展示了如何编写和使用定时器,包括按键消抖的应用... 目录1.linux内核定时器特征2.Linux内核定时器核心数据结构3.Linux内核时间相关转换函数4.Linux内核定时

Linux镜像文件制作方式

《Linux镜像文件制作方式》本文介绍了Linux镜像文件制作的过程,包括确定磁盘空间布局、制作空白镜像文件、分区与格式化、复制引导分区和其他分区... 目录1.确定磁盘空间布局2.制作空白镜像文件3.分区与格式化1) 分区2) 格式化4.复制引导分区5.复制其它分区1) 挂载2) 复制bootfs分区3)

JAVA线程的周期及调度机制详解

《JAVA线程的周期及调度机制详解》Java线程的生命周期包括NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING和TERMINATED,线程调度依赖操作系统,采用抢占... 目录Java线程的生命周期线程状态转换示例代码JAVA线程调度机制优先级设置示例注意事项JAVA线程

JavaWeb项目创建、部署、连接数据库保姆级教程(tomcat)

《JavaWeb项目创建、部署、连接数据库保姆级教程(tomcat)》:本文主要介绍如何在IntelliJIDEA2020.1中创建和部署一个JavaWeb项目,包括创建项目、配置Tomcat服务... 目录简介:一、创建项目二、tomcat部署1、将tomcat解压在一个自己找得到路径2、在idea中添加

Java利用Spire.Doc for Java实现在模板的基础上创建Word文档

《Java利用Spire.DocforJava实现在模板的基础上创建Word文档》在日常开发中,我们经常需要根据特定数据动态生成Word文档,本文将深入探讨如何利用强大的Java库Spire.Do... 目录1. Spire.Doc for Java 库介绍与安装特点与优势Maven 依赖配置2. 通过替换