news 2026/6/23 19:46:07

53.自定义工作队列传参

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
53.自定义工作队列传参

这里用到了container_of,可以利用某个成员的地址,顺藤摸瓜拿到拿到整个结构体的地址

驱动

#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); MODULE_LICENSE("GPL"); MODULE_AUTHOR("quan");

Makefile

obj-m += workqueue_data.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

编译及在开发板上测试

实现了一个由 GPIO 101 上升沿触发的中断程序。每当中断触发,它都会在系统后台异步打印出a is 1b is 2

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/23 15:42:53

安全VR:靠谱的VR安全体验馆厂商品牌榜,技术实力与落地案例

安全VR&#xff1a;靠谱的VR安全体验馆厂商品牌榜&#xff0c;技术实力与落地案例开篇总起在安全培训领域&#xff0c;数字化转型需求迫切&#xff0c;传统培训方式效果欠佳。安全VR体验馆凭借高度还原场景、沉浸式体验等优势&#xff0c;成为提升安全培训效果的有效手段。但市…

作者头像 李华
网站建设 2026/6/23 10:34:02

灵遁者:我对于探索的热爱,从来没有减少过

我对于探索的热爱&#xff0c;从来没有减少过。探索生命&#xff0c;这是自人类诞生以来&#xff0c;一直在拼命解读的课题。所以关于生命&#xff0c;我们思考得再多&#xff0c;也远远不够。 灵遁者&#xff0c;赞3这是一个需要创新的时代&#xff0c;但更是一个需要“消化”…

作者头像 李华
网站建设 2026/6/23 17:39:52

右值引用和移动语义

作用&#xff1a;C11中引用了右值引用和移动语义&#xff0c;可以避免无谓的复制&#xff0c;提高了程序性能。 1. 什么是左值、右值 可以从2个角度判断&#xff1a; 左值可以取地址、位于等号左边&#xff1b; 而右值没法取地址&#xff0c;位于等号右边。 int a 6; a可…

作者头像 李华
网站建设 2026/6/23 15:54:16

基于PLC的智能路灯控制系统的设计

第二章 传感器原理及应用 基于路灯照明的特点&#xff0c;我们需要通过采集周围光照强度及地面压力信号&#xff0c;来完成所需的智能路灯控制的功能&#xff0c;因此本章分别对光学传感器及压力传感器进行了详细的介绍。 2.1 光学传感器 2.1.1 光电效应简介 首先&#xff0c;我…

作者头像 李华
网站建设 2026/6/23 17:34:52

ZooKeeper:enableACL和requireClientSASLAuth

目录标题 &#x1f9e0; 一、ZooKeeper 的两个安全维度&#x1f3af; 二、访问控制&#xff08;ACL&#xff09;1&#xff09;什么是 ACL&#xff1f;2&#xff09;ACL 相关的 Scheme&#xff08;核心&#xff09;3&#xff09;是否开启 ACL &#x1f510; 三、客户端认证&…

作者头像 李华