news 2026/5/25 14:19:05

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/5/26 5:31:42

EtherCAT转ModbusRTU网关:实现汇川PLC与BMS储能系统协同

一、项目背景某新能源企业在西北某100MW光伏储能电站项目中&#xff0c;面临异构设备通信适配难题&#xff1a;电站核心控制采用汇川H3U-XP系列PLC&#xff08;支持EtherCAT协议&#xff09;&#xff0c;负责光伏板功率调节、储能系统充放电调度及电网并网协同&#xff1b;现场…

作者头像 李华
网站建设 2026/5/26 1:29:36

DeepSeek-Coder:开源代码大模型的架构演进与技术突破

本文由「大千AI助手」原创发布&#xff0c;专注用真话讲AI&#xff0c;回归技术本质。拒绝神话或妖魔化。搜索「大千AI助手」关注我&#xff0c;一起撕掉过度包装&#xff0c;学习真实的AI技术&#xff01; 引言 在人工智能驱动软件工程&#xff08;AI4SE&#xff09;的时代浪…

作者头像 李华
网站建设 2026/5/25 13:24:18

基于单片机的防火防盗报警系统设计

摘 要 随着社会和经济的发展&#xff0c;防火工作越来越重要&#xff0c;但是目前国内的许多研发都侧重于大型场所的火灾报警。因此&#xff0c;我们就有必要研制一种结构简单、经济实用的家庭烟雾报警器以适应市场的需求。基于供家庭使用的烟雾报警器应该具备的基本要求和功能…

作者头像 李华
网站建设 2026/5/25 8:32:54

基于STM32无刷直流电机调速蓝牙APP无线监测控制系统

&#xff08;一&#xff09;系统功能设计 STM32单片机无刷直流电机调速蓝牙APP控制118 本系统由STM32F103C8T6单片机核心板、按键电路、蓝牙模块、 电调模块及电机部分组成。 通过按键可以驱动无刷直流电机停止、加速、减速&#xff1b;中间按键为加速按键&#xff0c; 上电后按…

作者头像 李华