linux中断下文工作队列之工作队列传参(中断七)

2023-10-31 21:52

本文主要是介绍linux中断下文工作队列之工作队列传参(中断七),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、工作队列传参

  在 Linux 内核的工作队列中,可以通过使用工作项的方式向工作队列传递参数。工作项是一个抽象的结构,可以用于封装需要执行的工作及其相关的参数。
  首先我们定义工作项结构,如下所示,在结构体 struct work_data 中定义了需要传递给工作项处理函数的参数 a 和 b,然后定义一个类型为 struct work_data 的变量test_workqueue_work。

struct work_data {
struct work_struct test_work;
int a;
int b;
};
struct work_data test_workqueue_work;

  接下来在模块初始化函数 interrupt_irq_init 中创建了一个工作队列test_workqueue和一个工作项 test_workqueue_work。

test_workqueue = create_workqueue("test_workqueue"); // 创建工作队列INIT_WORK(&test_workqueue_work.test_work, test_work); // 初始化工作项

  然后在模块初始化函数中,为工作项的参数 a 和 b 赋值。

test_workqueue_work.a = 1;
test_workqueue_work.b = 2;

  当中断触发时,在中断处理函数 test_interrupt 中,通过调用queue_work 函数将工作项test_workqueue_work.test_work 提交到工作队列 test_workqueue 中。

queue_work(test_workqueue, &test_workqueue_work.test_work);

  然后工作项处理函数 test_work 定义了一个指针 pdata,将工作项转换为struct work_data结构,并通过该结构访问参数 a 和 b。如下所示:

void test_work(struct work_struct *work)
{
struct work_data *pdata;
pdata = container_of(work, struct work_data, test_work);
printk("a is %d\n", pdata->a);
printk("b is %d\n", pdata->b);
}

  这样,当工作队列被调度执行时,工作项处理函数 test_work 将能够访问到传递给工作项的参数 a 和 b,并在内核日志中打印他们的值
  注意,工作项处理函数中的 container_of 宏用于从工作项结构的指针获取整个structwork_data 结构的指针。这样可以通过指针偏移来访问工作项结构中的其他字段,例如参数a和 b。

二、代码示例

#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 work_data
{struct work_struct test_work;int a;int b;
};struct work_data test_workqueue_work;struct workqueue_struct *test_workqueue;// 工作项处理函数
void test_work(struct work_struct *work)
{struct work_data *pdata;pdata = container_of(work, struct work_data, test_work);printk("a is %d", pdata->a);printk("b is %d", pdata->b);
}// 中断处理函数
irqreturn_t test_interrupt(int irq, void *args)
{printk("This is test_interrupt\n");// 提交工作项到工作队列queue_work(test_workqueue, &test_workqueue_work.test_work);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_WORK(&test_workqueue_work.test_work, test_work);test_workqueue_work.a = 1;test_workqueue_work.b = 2;return 0;
}static void interrupt_irq_exit(void)
{free_irq(irq, NULL);                              // 释放中断cancel_work_sync(&test_workqueue_work.test_work); // 取消工作项flush_workqueue(test_workqueue);                  // 刷新工作队列destroy_workqueue(test_workqueue);                // 销毁工作队列printk("bye bye\n");
}module_init(interrupt_irq_init);
module_exit(interrupt_irq_exit);

这篇关于linux中断下文工作队列之工作队列传参(中断七)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

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

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

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

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

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

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

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

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

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

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

Spring @Scheduled注解及工作原理

《Spring@Scheduled注解及工作原理》Spring的@Scheduled注解用于标记定时任务,无需额外库,需配置@EnableScheduling,设置fixedRate、fixedDe... 目录1.@Scheduled注解定义2.配置 @Scheduled2.1 开启定时任务支持2.2 创建

基于Linux的ffmpeg python的关键帧抽取

《基于Linux的ffmpegpython的关键帧抽取》本文主要介绍了基于Linux的ffmpegpython的关键帧抽取,实现以按帧或时间间隔抽取关键帧,文中通过示例代码介绍的非常详细,对大家的学... 目录1.FFmpeg的环境配置1) 创建一个虚拟环境envjavascript2) ffmpeg-py

SpringBoot整合Flowable实现工作流的详细流程

《SpringBoot整合Flowable实现工作流的详细流程》Flowable是一个使用Java编写的轻量级业务流程引擎,Flowable流程引擎可用于部署BPMN2.0流程定义,创建这些流程定义的... 目录1、流程引擎介绍2、创建项目3、画流程图4、开发接口4.1 Java 类梳理4.2 查看流程图4

Linux脚本(shell)的使用方式

《Linux脚本(shell)的使用方式》:本文主要介绍Linux脚本(shell)的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录概述语法详解数学运算表达式Shell变量变量分类环境变量Shell内部变量自定义变量:定义、赋值自定义变量:引用、修改、删

LiteFlow轻量级工作流引擎使用示例详解

《LiteFlow轻量级工作流引擎使用示例详解》:本文主要介绍LiteFlow是一个灵活、简洁且轻量的工作流引擎,适合用于中小型项目和微服务架构中的流程编排,本文给大家介绍LiteFlow轻量级工... 目录1. LiteFlow 主要特点2. 工作流定义方式3. LiteFlow 流程示例4. LiteF