当前位置: 首页 > news >正文

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);

相关文章:

  • css文字竖向排列
  • 部署K8S
  • Vue 3.0 学习 新特性
  • Python-platform模块
  • 1-1 暴力破解-枚举
  • 代码之困:那些让你苦笑不得的bug
  • html和css中图片加载与渲染的规则是什么?
  • 系列四十五、Spring的事务传播行为案例演示(五)#MANDATORY
  • 驱动第十天
  • libpcap获取数据包
  • 前度开发面试题
  • 【网络协议】聊聊http协议
  • linux中断下文工作队列之延迟工作(中断六)
  • 第三届字节跳动奖学金官宣开奖,13位优秀科研学子每人获10万奖学金
  • 「永不失联」产品创新与升级系列发布,预约直播“即将发车”
  • 0基础学习移动端适配
  • echarts的各种常用效果展示
  • ECMAScript入门(七)--Module语法
  • HTTP传输编码增加了传输量,只为解决这一个问题 | 实用 HTTP
  • javascript从右向左截取指定位数字符的3种方法
  • JavaScript对象详解
  • Linux链接文件
  • Netty 框架总结「ChannelHandler 及 EventLoop」
  • python学习笔记 - ThreadLocal
  • Redis字符串类型内部编码剖析
  • springMvc学习笔记(2)
  • Swift 中的尾递归和蹦床
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 配置 PM2 实现代码自动发布
  • 通信类
  • 微信公众号开发小记——5.python微信红包
  • 学习ES6 变量的解构赋值
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • 国内开源镜像站点
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • # 安徽锐锋科技IDMS系统简介
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • ###STL(标准模板库)
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • (1)(1.13) SiK无线电高级配置(五)
  • (二十三)Flask之高频面试点
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (免费分享)基于springboot,vue疗养中心管理系统
  • (排序详解之 堆排序)
  • (十六)串口UART
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (一)u-boot-nand.bin的下载
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库
  • (转)使用VMware vSphere标准交换机设置网络连接
  • .htaccess配置常用技巧
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .net开发引用程序集提示没有强名称的解决办法
  • .w文件怎么转成html文件,使用pandoc进行Word与Markdown文件转化