RK3568驱动指南|第五期-中断-第48章 并发管理工作队列实验

news2025/2/22 17:39:39

瑞芯微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主板


第48章 并发管理工作队列实验

在现代的软件开发中,我们常常面临着需要同时处理多个任务的挑战。这些任务可能是并行的、独立的,或者需要以某种顺序进行处理。为了高效地管理这些并发任务,我们需要一种有效的机制来协调它们的执行。这就是并发管理工作队列发挥作用的地方。本章节我们来学习并发管理工作队列。

48.1工作队列的实现

在44章节和45章节,我们学习了共享工作队列和自定义工作队列,在使用工作队列时,我们首先定义一个work结构体,然后将work添加到workqueue(工作队列)中,最后worker thread 执行workqueue。当工作队列中有新work产生时,工作线程(worker thread)会执行工作队列中每个work。当执行完结束的时候,worker thread会睡眠,等到新的中断产生,work再继续添加到工作队列,然后工作线程执行每个工作,周而复始。

在单核线程的系统中,通常会为每个 CPU(核心)初始化一个工作线程并关联一个工作队列。这种默认设置确保每个CPU都有一个专门的线程来处理与其绑定的工作队列上的工作项。如下图(48-1)所示:

在多核线程系统中,工作队列的设计与单核线程系统有所不同。在多核线程系统中,通常会存在多个工作队列,每个工作队列与一个工作线程(Worker Thread)绑定。这样可以充分利用多个核心的并行处理能力。如下图(48-2)所示:

当有新的工作项产生时,系统需要决定将其分配给哪个工作队列。一种常见的策略是使用负载均衡算法,根据工作队列的负载情况来平衡分配工作项,以避免某个工作队列过载而导致性能下降。每个工作队列独立管理自己的工作项。当有新的工作项添加到工作队列时,工作线程会从其关联的工作队列中获取待执行的工作项,并执行相应的处理函数。在多核线程系统中,多个工作线程可以同时执行各自绑定的工作队列中的工作项。这样可以实现并行处理,提高系统的整体性能和响应速度。

了解了工作队列是如何实现的,接下来我们看看传统的工作队列有什么弊端呢?

48.2 workqueue队列弊端

假如说有三个work放到了同一个工作队列上,接下来CPU会启动工作线程去执行这三个work,如下图(48-3)所示:

在上图中,工作项w0、w1、w2被排队到同一个CPU上的绑定工作队列上。w0工作项执行的时候,先工作 5毫秒,然后睡觉10毫秒,然后再工作CPU 5毫秒,然后完成。工作项w1和w2都是工作5ms,然后睡眠10 ms,然后完成。传统工作队列的弊端如下所示:

1 在工作项w0 工作甚至是睡眠时,工作项w1 w2是排队等待的,在繁忙的系统中,工作队列可能会积累大量的待处理工作项,导致任务调度的延迟,这可能会影响系统的响应性能,并增加工作项的处理时间。

2 在工作队列中,不同的工作项可能具有不同的处理时间和资源需求。如果工作项的处理时间差异很大,一些工作线程可能会一直忙于处理长时间的工作项,而其他工作线程则处于空闲状态,导致资源利用不均衡。

3 在多线程环境下,多个工作线程同时访问和修改工作队列可能会导致竞争条件的发生。为了确保数据的一致性和正确性,需要采用适当的同步机制,如锁或原子操作,来保护共享数据,但这可能会引入额外的同步开销。

4 工作队列通常按照先进先出(FIFO)的方式处理工作项,缺乏对工作项优先级的细粒度控制。在某些场景下,可能需要根据工作项的重要性或紧急程度进行优先级调度,而工作队列本身无法提供这种级别的优先级控制。

5 当工作线程从工作队列中获取工作项并执行时,可能需要频繁地进行上下文切换,将处理器的执行上下文从一个线程切换到另一个线程。这种上下文切换开销可能会影响系统的性能和效率。

48.2 什么是并发管理工作队列

通过上一小节的学习,我们认识到传统的工作队列无论是单核系统还是多核系统上都是有缺陷的。比如无法充分利用多核处理器的计算能力以及对于不同优先级的工作项无法提供公平的调度。为了解决这些问题,Con Kolivas提出了CMWQ调度算法。

CMWQ 全称是concurrency Managed Workqueue,意为并发管理工作队列。并发管理工作队列是一种并发编程模式,用于有效地管理和调度待执行的任务或工作项。它通常用于多线程或多进程环境中,以实现并发执行和提高系统的性能。CMWQ 工作实现如下图(48-4)所示:

当我们需要在一个系统中同时处理多个任务或工作时,使用并发管理工作队列是一种有效的方式。

想象一下,你是一个餐厅的服务员,有很多顾客同时来到餐厅用餐。为了提高效率,你需要将顾客的点菜请求放到一个队列中,这就是工作队列。然后,你和其他服务员可以从队列中获取顾客的点菜请求,每个服务员独立地为顾客提供服务。通过这种方式,你们可以并发地处理多个顾客的点菜请求,而不需要等待上一个顾客点完菜再去处理下一个顾客的请求。每个服务员可以独立地从队列中获取任务,并根据需要执行相应的服务。这种独立获取任务的过程就是从工作队列中取出任务并执行的过程。

通过并发管理工作队列,你们能够更高效地处理顾客的点菜请求,提高服务的速度和质量。同时,这种方式也能够更好地利用你们的工作能力,因为每个服务员都可以独立处理任务,而不会相互干扰或等待。

总的来说,通过并发管理工作队列,我们可以同时处理多个任务或工作,提高系统的并发性和性能。每个任务独立地从队列中获取并执行,这种解耦使得整个系统更加高效、灵活,并且能够更好地应对多任务的需求。

48.3 并发管理工作队列接口函数

alloc_workqueue是Linux内核中的一个函数,用于创建和分配一个工作队列。工作队列是一种用于管理和调度工作项的机制,可用于实现并发处理和异步任务处理。alloc_workqueue函数的原型如下:

struct workqueue_struct *alloc_workqueue(const char *fmt, unsigned int flags, int max_active);

参数说明:

fmt:指定工作队列的名称格式。

flags:指定工作队列的标志,可以控制工作队列的行为和属性,如WQ_UNBOUND表示无绑定的工作队列,WQ_HIGHPRI表示高优先级的工作队列等。

max_active:指定工作队列中同时活跃的最大工作项数量。

函数返回一个指向工作队列结构体(struct workqueue_struct)的指针,或者返回NULL表示创建失败。

在下一小节中将使用上述API进行相应的实验。

48.4 实验程序的编写

48.4.1 驱动程序编写

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

本实验在35自定义工作队列实验的基础上进行修改,使用alloc_workqueue函数创建和分配一个工作队列。编写完成的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 workqueue_struct *test_workqueue;
struct work_struct test_workqueue_work;

// 工作项处理函数
void test_work(struct work_struct *work)
{
  msleep(1000);
  printk("This is test_work\n");
}

// 中断处理函数
irqreturn_t test_interrupt(int irq, void *args)
{
  printk("This is test_interrupt\n");
  queue_work(test_workqueue, &test_workqueue_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 = alloc_workqueue("test_workqueue", WQ_UNBOUND, 0);
  INIT_WORK(&test_workqueue_work, test_work); // 初始化工作项

  return 0;
}

static void interrupt_irq_exit(void)
{
  free_irq(irq, NULL);                    // 释放中断
  cancel_work_sync(&test_workqueue_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");

48.5 运行测试

48.5.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文件目录下,如下图(图48-5)所示:

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

 编译完生成interrupt.ko目标文件,如下图(图48-7)所示:

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

48.5.2 运行测试

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

insmod interrupt.ko

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

我们按一下屏幕,立即输入“ps -aux | grep test_workqueue”,可以看到工作线程,如下图(48-10)所示,u代表无绑定的工作队列。

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

rmmod interrupt

至此,并发管理工作队列实验就完成了。


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

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

相关文章

iPhone15系类LDR6020P 超简外围手机转接器/拓展坞方案

目前市面上的手机大部分已经取消3.5音频耳机接口&#xff0c;仅仅保留了Type-c口。但是追求音质和零延迟的用户仍然会选择3.5mm有线耳机&#xff0c;因为在玩手机游戏的时候&#xff0c;音画不同步真的很影响游戏体验&#xff0c;所以Type-C转3.5mm接口线应运而生。 #iPhone15…

mysql批量插入数据,跳过唯一索引报错

数据准备 DROP TABLE IF EXISTS user1; CREATE TABLE user1 ( id INT NOT NULL AUTO_INCREMENT, name VARCHAR(45) NULL, age INT(3) NOT NULL, PRIMARY KEY (id), UNIQUE INDEX u_name (name));insert into user1(name, age) values (zhangshan, 18), (lisi, 19);1. INSERT I…

【Python】WebUI自动化—Selenium的下载和安装、基本用法、项目实战(16)

文章目录 一.介绍二.下载安装selenium三.安装浏览器驱动四.QuickStart—自动访问百度五.Selenium基本用法1.定位节点1.1.单个元素定位1.2.多个元素定位 2.控制浏览器2.1.设置浏览器窗口大小、位置2.2.浏览器前进、刷新、后退、关闭 3.WebDriver常用方法4.Selenium事件处理4.1.鼠…

史上最全,Jmeter+Ant+Jenkins接口自动化集成(图文步骤)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、安装 jdk、Jme…

水电站生态流量监测解决方案(dtu数据采集和分析)

1. 引言 水电站是重要的清洁能源发电设施&#xff0c;但其建设和运营也对当地生态环境带来一定的影响。为了科学合理地评估水电站的生态流量&#xff0c;监测和记录河流中的流量数据变得至关重要。通过采集和分析这些数据&#xff0c;可以做出合理的决策和调整&#xff0c;以最…

华为云新开源低代码引擎 TinyEngine核心亮点

核心亮点 • 可以定制开发低码平台。 TinyEngine 采用灵活的系统架构,其出色的整体架构提供了高度的自定义自由度,使用户能够像搭建积木一样选择不同的模块来构建自己的专属设计器。此外,插件化的架构使得用户可以方便地扩展与业务相关的功能。在 TinyEngine 中,插件根据…

外贸SEO应该怎样做?

这几年做外贸SEO的越来越多&#xff0c;背后原因很复杂&#xff0c;不去探讨了。今天就自己SEO服务客户情况所见&#xff0c;聊一点外贸网站SEO该怎么做的感想。 我所遇到的英文外贸网站&#xff0c;大部分是卖产品的&#xff0c;产品各种各样&#xff0c;从单一软件或产品小网…

基于边缘网关的智慧工地监测方案

边缘物联网技术为千行百业赋能&#xff0c;依托边缘计算的低延时、高效率、广适用优势&#xff0c;也为工程建设产业带来新的增长动力。 例如在智慧工地应用中&#xff0c;围绕建设施工过程中的人员、设备、环境等要素&#xff0c;利用边缘计算网关构建全面的数据采集、分析、联…

【UE5 Cesium】15-Cesium for Unreal 加载本地影像和地形

目录 一、加载全球无高度地形 二、加载区域DEM 三、加载离线地图影像 一、加载全球无高度地形 1. 先去如下网址下载全球无高度地形&#xff1a;Using a global terrain layer without height detail - #9 by RidhwanAziz - Cesium for Unreal - Cesium Community 下载后如下…

核桃派walnutpi添加红外遥控器键盘映射(其他的linux板子同理)ir-keytable

01studio终于又发布新品了&#xff0c;全志h616 linux开发板核桃派&#xff0c;正好我也打算学习linux&#xff0c;做为我的启蒙公司&#xff0c;必须支持果断入了一个。 这个板子自带红外接收头&#xff0c;比较少见&#xff0c;一般都需要自己加&#xff0c;看官网文档&…

Git指导:提交干净的commit信息

为什么我们应该关心编写干净的提交消息&#xff1f; 提交是程序员技术的有形构建块。它们充当代码的锦上添花&#xff0c;如果编写正确&#xff0c;它们会带来巨大的价值。编写良好的提交消息变得不可或缺&#xff0c;因为它们提供了上下文——否则一开始就不需要提交消息。 良…

windows 远程连接 ubuntu桌面xrdp

更新 sudo apt update安装组件 sudo apt-get install xorg sudo apt-get install xserver-xorg-core sudo apt-get install xorgxrdp sudo apt install xfce4 xfce4-goodies xorg dbus-x11 x11-xserver-utilsxrdp sudo apt install xrdp sudo systemctl status xrdp sudo …

证件照快速抠图更换背景 - Python OpenCV图像分割

需要更换证件照的背景&#xff0c;大多软件App直接收费或者需要支付后才可去水除印&#xff0c;本文公开不收费&#xff0c;欢迎使用&#xff0c;代码可在IDE如PyCharm或者Linux上直接运行&#xff0c;程序会自动安装依赖库OpenCV&#xff0c;如果觉得不错随手点个赞哦 &#x…

美客多平台运营策略揭秘,卖家如何实现安全稳定的测评!

要在美客多平台上取得成功&#xff0c;卖家需要具备一定的运营策略。本文将为大家分享一些关键的运营策略&#xff0c;帮助卖家在美客多平台上实现可持续发展。 一&#xff1a;优化商品页面&#xff0c;提升转化率 在美客多平台上&#xff0c;商品页面是吸引用户注意力的关键。…

c++中的map和set

文章目录 1. 关联式容器2. 键值对3. 树形结构的关联式容器3.1 set3.1.1 set的介绍3.1.2 set的使用 3.2 map3.2.1 map的介绍3.2.2 map的使用 3.3 multiset3.3.1 multiset的介绍3.3.2 multiset的使用 3.4 multimap3.4.1 multimap的介绍3.4.2 multimap的使用 1. 关联式容器 在初阶…

pycharm配置远程服务器

1.首先在服务器的一个位置创建一个文件夹 作为我们的工作文件夹&#xff0c;这里就命名为hhr。 2.配置我们的解释器 &#xff08;实验室服务器python环境都配好了&#xff0c;我们只需要找到就可以了&#xff09;&#xff0c;这里可以连上Xhell之后输入python打开python解释器…

网工内推 | IT高级运维工程师,周末双休,包吃包住,14-20k

01 深圳朗特智能控制股份有限公司 招聘岗位&#xff1a;IT高级运维工程师 职责描述&#xff1a; 1、对集团网络基础架构的建设、运维、安全制定相关标准和准则&#xff1b; 2、负责集团数据中心、核心设备、信息安全的管理和运维&#xff1b; 3、执行网络、服务器、核心交换机…

【已解决】Operation timed out 问题

概述 今天遇到了这样一个有点奇葩的问题&#xff0c;再阿里云服务器上部署了Mysql服务&#xff0c;再使用NaviCat的过程中链接不上&#xff0c;connect to address IP地址: Operation timed out&#xff0c;最后是服务器防火墙的问题。 查看Mysql服务/端口 1.查看Mysql是否启…

解决loadDep:omelette: sill install loadAllDepsIntoIdealTree

报错信息如下&#xff1a; 解决方案&#xff1a; 1、设置为淘宝的镜像源 npm config set registry https://registry.npm.taobao.org 2、 命令检验是否成功 npm config get registry 3、继续运行npm install即可 npm install 运行效果&#xff1a;

C/C++ 中的函数返回局部变量以及局部变量的地址?

C/C中&#xff0c;函数内部的一切变量(函数内部局部变量&#xff0c;形参)都是在其被调用时才被分配内存单元。形参和函数内部的局部变量的生命期和作用域都是在函数内部(static变量的生命期除外)。子函数运行结束时&#xff0c;所有局部变量的内存单元会被系统释放。在C中&…