news 2026/7/31 7:19:35

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/7/31 4:37:43

EtherCAT 转 Modbus RTU 网关:实现倍福 PLC 与宇电 AI-516 温控器协同联动

一、项目背景 某精密机械制造企业的数控加工生产线面临异构设备通信难题&#xff1a;生产线核心控制采用倍福 CX5140 PLC&#xff08;支持 EtherCAT 协议&#xff09;&#xff0c;负责主轴运转、工序联动及整体流程控制&#xff0c;而现场 18 台数控加工机床的温度调控依赖宇电…

作者头像 李华
网站建设 2026/7/30 17:39:38

平台生态:生成式AI的差异化规则与适配策略

主流AI平台的生态特征不同生成式AI平台基于其训练数据、技术架构和商业策略&#xff0c;形成了各具特色的“生态偏好”。理解这些差异是制定有效GEO策略的前提。OpenAI的ChatGPT表现出对权威来源和近期内容的明显偏好。研究显示&#xff0c;ChatGPT在回答事实性问题时&#xff…

作者头像 李华
网站建设 2026/7/30 5:10:05

8.SpringTask

8.1 定时任务定时任务即系统在特定时间执行一段代码&#xff0c;它的场景应用非常广泛&#xff1a;购买游戏的月卡会员后&#xff0c;系统每天给会员发放游戏资源。管理系统定时生成报表。定时清理系统垃圾。定时任务的实现主要有以下几种方式&#xff1a;Java自带的java.util.…

作者头像 李华
网站建设 2026/7/30 18:25:56

BIOS VS UEFI

目录标题一、整体结论先给出&#xff08;给决策用&#xff09;二、启动链路&#xff1a;这是两者本质区别1️⃣ Legacy BIOS 启动链路&#xff08;你现在这台&#xff09;关键工程特征2️⃣ UEFI 启动链路&#xff08;现代标准&#xff09;关键工程特征三、磁盘与分区模型&…

作者头像 李华
网站建设 2026/7/31 4:37:48

Flink源码阅读:状态管理

前面我们介绍了 Flink 状态的分类和应用。今天从源码层面再看一下 Flink 是如何管理状态的。State 概述 关于 State 的详细介绍可以参考 Flink学习笔记&#xff1a;状态类型和应用 和 Flink学习笔记&#xff1a;状态后端这两篇文章&#xff0c;为了方面阅读&#xff0c;这里我…

作者头像 李华
网站建设 2026/7/30 6:52:15

收藏!2026大厂校招AI岗占比超9成,大模型技能已成职场硬通货

互联网大厂2026届校招早已跳出传统招聘框架&#xff0c;演变为一场硝烟弥漫的AI人才"军备竞赛"。百度AI岗位占比突破90%的数字&#xff0c;不仅是一个招聘指标&#xff0c;更像是行业发出的明确信号&#xff1a;AI能力已从"加分项"彻底升级为进入大厂的&qu…

作者头像 李华