RK3568驱动指南|第五期-中断-第47章 工作队列传参实验

news2024/10/5 23:27:54

瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码,支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU,可用于轻量级人工智能应用。RK3568 支持安卓 11 和 linux 系统,主要面向物联网网关、NVR 存储、工控平板、工业检测、工控盒、卡拉 OK、云终端、车载中控等行业。


【公众号】迅为电子

【粉丝群】824412014(加群获取驱动文档+例程)

【视频观看】嵌入式学习之Linux驱动(第五期_中断_全新升级)_基于RK3568

【购买链接】迅为RK3568开发板瑞芯微Linux安卓鸿蒙ARM核心板人工智能AI主板


第47章 工作队列传参实验

在41章节中,我们使用tasklet来实现中断下文,并使用tasklet给中断下文传参,如果我们使用工作队列来实现中断的下半部分,那么如何用工作队列给中断下文传参呢?本章节我们来一探究竟!

47.1 工作队列传参

在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 宏用于从工作项结构的指针获取整个 struct work_data 结构的指针。这样可以通过指针偏移来访问工作项结构中的其他字段,例如参数 a 和 b。

详细的驱动代码编写见下一小节。

47.2实验程序的编写

47.2.1 驱动程序编写

本实验对应的网盘路径为:iTOP-RK3568开发板【底板V1.7版本】\03_【iTOP-RK3568开发板】指南教程\02_Linux驱动配套资料\04_Linux驱动例程\37_workqueue_data\module

编写完成的interrupt.c代码如下所示:

#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("topeet");

47.3 运行测试

47.3.1 编译驱动程序

在上一小节中的interrupt.c代码同一目录下创建 Makefile 文件,Makefile 文件内容如下所示:

export ARCH=arm64#设置平台架构
export CROSS_COMPILE=aarch64-linux-gnu-#交叉编译器前缀
obj-m += interrupt.o    #此处要和你的驱动源文件同名
KDIR :=/home/topeet/Linux/linux_sdk/kernel    #这里是你的内核目录                                                                                                                            
PWD ?= $(shell pwd)
all:
    make -C $(KDIR) M=$(PWD) modules    #make操作
clean:
    make -C $(KDIR) M=$(PWD) clean    #make clean操作

对于Makefile的内容注释已在上图添加,保存退出之后,来到存放interrupt.c和Makefile文件目录下,如下图(图47-1)所示:

然后使用命令“make”进行驱动的编译,编译完成如下图(图47-2)所示:

至此驱动模块就编译成功了,接下来进行测试。

47.3.2 运行测试

开发板启动之后,使用以下命令进行驱动模块的加载,如下图(图47-4)所示:

insmod interrupt.ko

至此驱动模块就编译成功了,接下来进行测试。

47.3.2 运行测试

开发板启动之后,使用以下命令进行驱动模块的加载,如下图(图47-4)所示:

insmod interrupt.ko

 

驱动加载之后,可以看到申请的中断号被打印了出来,然后用手触摸连接的LVDS 7寸屏幕,打印如下图(47-5)所示:

 

在上图中,可以看到打印中断处理函数中添加的打印“This is test_interrupt”和传递给工作项的参数a和b的值。

最后可以使用以下命令进行驱动的卸载,如下图(图47-6)所示:

rmmod interrupt

 

至此,工作队列传参实验就完成了。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1048976.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微信群发消息如何突破200人?

微信群发怎么设置&#xff1f; 1. 打开微信&#xff0c;点击右下角的“我”&#xff0c;然后选择“设置”。 2. 在设置页面中&#xff0c;选择“通用”选项。 3. 在通用页面中&#xff0c;选择“辅助功能”选项。 4. 在功能页面中&#xff0c;你会看到“群发助手”选项。点…

【Mysql专题】一条SQL在Mysql中是如何执行的

目录 前言前置知识课程内容一、Mysql的内部组件结构1.1 Server层1.2 引擎层&#xff08;Store层&#xff09; 二、连接器三、查询缓存&#xff08;Mysql8.0后已移除&#xff09;四、分析器4.1 词法分析器原理 五、优化器六、执行器学习总结 前言 知其然&#xff0c;当知其所以…

排序:简单选择排序算法分析

选择排序包括简单选择排序以及堆排序。 1.算法分析 每一趟在待排序元素中选取关键字最小的元素加入有序子序列。 n个元素的简单选择排序需要n-1趟处理。 2.代码实现 //交换 void swap(int &a, int &b) {int temp a;a b;b temp; }//简单选择排序 void SelectSort…

定义豪车新理念 远航汽车亮相2023中国(天津)国际汽车展览会

近年来&#xff0c;随着汽车行业竞争持续加剧&#xff0c;老品牌面临积极转型&#xff0c;新势力则经验不足、实力欠佳&#xff0c;到底是难抵市场的风云变幻。在此背景下&#xff0c;有着“老品牌 新势力”双重基因的远航汽车可谓底气十足。作为大运集团携手博世、华为、阿里斑…

nginx 多层代理 + k8s ingress 后端服务获取客户真实ip 配置

1.nginx http 七层代理 修改命令空间&#xff1a; namespace: nginx-ingress : configmap&#xff1a;nginx-configuration kubectl get cm nginx-configuration -n ingress-nginx -o yaml添加如上配置 compute-full-forwarded-for: “true” forwarded-for-header: X-Forwa…

谱瑞PS186|替代PS186方案|TypeC转HDMI4K视频转换方案设计

谱瑞PS186/PS188/PS176,是一系列Type-C/DP转HDMI 4K60的视频转换芯片&#xff0c;其中PS186是DP 2lane转HDMI 4K60&#xff0c;若是设计Type-C转HDMI方案还需加一颗C转DP协议转换芯片&#xff0c;这样成本更高。而集睿致远CS5366单颗芯片即可实现Type-C转HDMI 4K60HZ设计方案. …

python使用mitmproxy和mitmdump抓包以及对手机

mitmproxy是一个中间人角色&#xff0c;供python抓包使用。 本机环境&#xff1a;win10 64位&#xff0c;python3.10.4。首先安装mitmproxy&#xff0c;参考我的文章 记录一下python2和python3在同一台电脑上共存使用并安装各自的库以及各自在pycharm中使用的方法-CSDN博客 一…

【轮趣-科大讯飞】M260C 环形六麦测试 2 - ROS1功能测试与唤醒、语音识别程序解析

所有内容请看&#xff1a; 博客学习目录_Howe_xixi的博客-CSDN博客https://blog.csdn.net/weixin_44362628/article/details/126020573?spm1001.2014.3001.5502原文在飞书&#xff0c;请联系我获取阅读链接&#xff0c;我太懒了

Acwing 835. Trie字符串统计

Acwing 835. Trie字符串统计 题目描述代码展示 题目描述 代码展示 //这个代码的注释好难写&#xff0c;以自己理解为主 #include<iostream>using namespace std; const int N 100010; int idx; // 各个节点的编号&#xff0c;根节点编号为0 int son[N][26];//Trie 树本…

视频增强修复工具Topaz Video AI mac中文版安装教程

Topaz Video AI mac是一款使用人工智能技术对视频进行增强和修复的软件。它可以自动降噪、去除锐化、减少压缩失真、提高清晰度等等。Topaz Video AI可以处理各种类型的视频&#xff0c;包括低分辨率视频、老旧影片、手机录制的视频等等。 使用Topaz Video AI非常简单&#xff…

油封的两种主要类型?

油封也称为轴封&#xff0c;是各类机械中不可或缺的部件。它们主要用于密封机械设备中固定部件和移动部件之间的开口。大多数应用中较常用的油封是橡胶壳油封或金属壳油封。 橡胶壳油封广泛用于存在金属壳油封因热膨胀而失效的风险的应用中。橡胶外壳油封不会生锈&#xff0c;…

Linux学习第22天:Linux中断驱动开发(一): 突如其来

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 中断作为驱动开发中很重要的一个概念&#xff0c;在实际的项目实践中经常用到。本节的主要内容包括中断简介、硬件原理分析、驱动程序开发及运行测试。其中驱动程…

【面试经典150 | 滑动窗口】最小覆盖子串

文章目录 写在前面Tag题目来源题目解读解题思路方法一&#xff1a;滑动窗口 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些对于本题涉及到的数据结构等…

26525-2022 精制氯化钴 学习记录

声明 本文是学习GB-T 26525-2022 精制氯化钴. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本文件规定了精制氯化钴的要求、试验方法、检验规则及标志、标签、包装、运输、贮存。 本文件适用于精制氯化钴。 注&#xff1a;该产品主要用于…

ATA-P系列功率放大器——应用场景介绍

ATA-P系列功率放大器是一款理想的可放大交直流信号的功率放大器。最大输出功率可达1300Wp&#xff0c;可以驱动压电陶瓷片、叠堆型压电陶瓷、开环封装压电陶瓷以及纳米定位工作台等压电制动产品。电压增益数控可调&#xff0c;一键保存常用设置&#xff0c;提供了方便简洁的操作…

今天刷到一条有用的抖音---网站文档copy的解禁

有的时候在网上查找一些资料&#xff0c;发现些有用的东西的时候&#xff0c;兴高采烈的复制一下&#xff0c;然后网站弹出一个菜单让你付钱~~如下图&#xff1a; 此时&#xff0c;可以在该网页上&#xff0c;按F12&#xff0c;召唤出调试窗口&#xff0c;在事件监听器中&#…

亚马逊筋膜枪UL1647测试报告申请

筋膜枪&#xff0c;又称深层肌筋膜冲击仪&#xff0c;是一种通过高频冲击放松身体的软组织的软组织康复工具。[1]筋膜枪可理解为DMS&#xff08;电动深层肌肉刺激器&#xff09;的民用版本。使用时振动频率会发生变化&#xff0c;其基本功能与DMS相似。[2]筋膜枪的使用必须注意…

【AI视野·今日NLP 自然语言处理论文速览 第四十三期】Thu, 28 Sep 2023

AI视野今日CS.NLP 自然语言处理论文速览 Thu, 28 Sep 2023 Totally 38 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers Cross-Modal Multi-Tasking for Speech-to-Text Translation via Hard Parameter Sharing Authors Brian Yan,…

安卓手机使用油猴脚本教程

下载支持油猴脚本的浏览器 请现在应用商店下载 x浏览器 &#xff0c;如果自己手机应用商店没有的话&#xff0c;可以在官网下载安装包&#xff0c;然后手动安装。 x浏览器官网 应用图标&#xff1a; 导入油猴脚本 第一步&#xff1a; 第二步&#xff1a; 第三步&#xff1…

Cannot download sources

问题 Swagger的相关包&#xff0c;没法看到注释&#xff1b;源码也下载不了&#xff0c;会报下面的错误。 解决办法是&#xff0c;通过maven&#xff0c;重新下载jar包。 报错 Cannot download sources Sources not found for: io.swagger.core.v3:swagger-annotations:2.2.…