首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

request_threaded_irq()在驱动程序中使用为什么不request_irq()?两者有什么不同?

在Linux驱动程序中,request_threaded_irq()和request_irq()都是用于分配中断请求(IRQ)资源的函数,但它们之间有一些重要的区别。

request_threaded_irq()是Linux内核中的一种函数,用于在多线程环境中请求IRQ线。它通过线程间同步的方式,使得多个线程可以同时访问同一个IRQ线,从而提高了线程调度的效率。request_threaded_irq()函数需要一个参数,即要申请的IRQ线的编号,以及两个返回值:一个指向申请到的IRQ线的指针,另一个指向线程信息的指针。

request_irq()则是Linux内核中的一种函数,用于在单线程环境中请求IRQ线。它通过内核中的irq_desc结构体数组来映射每个IRQ线,并通过调用request_irq()函数的次数来分配IRQ线。request_irq()函数只有一个参数,即要申请的IRQ线的编号。它返回0表示申请成功,否则返回-1表示申请失败。

总的来说,request_threaded_irq()和request_irq()都是用于分配IRQ线的函数,但request_threaded_irq()是用于多线程环境,而request_irq()是用于单线程环境。在多线程环境中,使用request_threaded_irq()可以提高线程调度的效率,而在单线程环境中,使用request_irq()可以更简单地分配IRQ线。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

韦东山:剥丝抽茧分析linux中断系统的重要数据结构

它们的处理函数由自己驱动程序提供,这是最熟悉这个设备的“人”:它知道如何判断设备是否发生了中断,如何处理中断。...当调用request_irqrequest_threaded_irq注册中断处理函数时,内核就会构造一个irqaction结构体。...irq_domain会把本地的hwirq映射为全局的irq,什么意思?...比如GPIO控制器里第1号中断,UART模块里也有第1号中断,这两个“第1号中断”是不一样的,它们属于不同的“域”──irq_domain。...但是我们驱动中会使用request_irq(irq, handler)这样的函数来注册中断,irq是什么?它是软件中断号,它应该从“gpio1的第5号中断”转换得来。 谁把hwirq转换为irq?

1.1K20

《Linux Device Drivers》第十章 中断处理——note

该注冊表类似于I/Oport的注冊表 模块使用中断前要先请求一个中断通道,然后使用后释放该通道 int request_irq(unsigned int irq,...,因此它的行为会受到一些限制 不能向用户空间发送或者接收数据 不能做作不论什么可能发生休眠的操作 不能调用schdule函数 将有关中断接收到信息反馈给设备,并依据正在服务的中断的不同含义对数据进行对应的读或写...当底半部处理例程运行时,全部的中断都是打开的 典型的情况是顶半部保存设备的数据到一个设备特定的缓冲区并调度它的底半部 tasklet tasklet能够被多次调度执行,但tasklet的调度并不会累积 假设驱动程序多个...可是两处不同 请求中断时,必须指定flags參数中的SA_SHIRQ位 dev_id參数必须是唯一的,不论什么指向模块地址空间的指针都能够使用,但dev_id不能设置成NULL 请求一个共享中断时,...那么request_irq就会成功 中断信号线空暇 不论什么已经注冊了该中断信号线的处理例程也标识了IRQ是共享的 使用共享处理例程的驱动程序须要小心一件事情:不能使用enable_irq和disable_irq

61020
  • Linux的中断下半部机制的对比

    Linux以下几种下半部机制: 软中断 tasklet workqueue threaded irq  中断服务程序一般都是中断请求关闭的条件下执行的,以避免嵌套而使中断控制复杂化。...TASKLET_STATE_RUN只有多处理器系统上才使用,单处理器系统什么时候都清楚一个小任务是不是正在运行(它要么就是当前正在执行的代码,要么不是)。Count域是小任务的引用计数器。...linux中断线程化(threaded irq)和工作队列(work queue)的异同 两者差异: 1、调度优先级不同: threaded irq handler所在的进程(内核线程),调度类别是SCHED_FIFO...所以多个不同设备中断的work都会由同一个kworker线程来处理,多CPU系统中并发效率不如threaded irq。 两者相同: 都是可抢占,可调度,可睡眠的内核线程,是内核态的线程上下文。...相应的头文件kernel/irq/manage.h ☁️使用哪一个中断函数 通过下面的这个函数替代掉了我们一直用的request_irq函数, //err = request_irq(gpio_keys

    34210

    Linux Irq domain

    本节学习下什么是irq domain, 以及irq domain的作用。...可以参考内核文档IRQ-domain.txt 为什么引入IRQ-Domain 当早期的系统只存在一个interrupt-controller的时候,而且中断数目也不多的时候,一个很简单的做法就是一个中断号对应到...而Hwirq-num就是dts中配置的irq号 而第一列就是对应的softirq-num,也就是request_irq时传入的irq 中断控制器级联的情况图 hwirq到softirq的映射 当开机之后...这里两种映射方式一种是线性映射,一种是树形映射 irq和irq_desc的关系 分配一个softirq的时候,其实最终也会分配一个irq_desc结构的 这里两种管理方式,一种是通过线性固定开机固定分配好了的...irq_desc + irq : NULL; } 申请中断 通过request_irq函数来设置中断的回调函数,最终会设置到Irqaction中去 int request_threaded_irq(unsigned

    1.3K20

    内核中断子系统介绍

    什么是中断 计算机科学中,中断(英语:Interrupt)是指处理器接收到来自硬件或软件的信号,提示发生了某个事件,应该被注意,这种情况就称为中断。...中断号:用于硬件和软件识别并区分中断事件,需要注意同一个中断事件中断处理的不同阶段未必是同一个中断号。 中断源:中断事件需要 cpu 处理的硬件。...中断源驱动获取到 irq,还需要将 irq 与中断处理函数建立映射: request_irq/request_threaded_irq:驱动将中断处理函数注册到 irq。...希望帮助大家得出诸如“arm 内核中断嵌套吗”“arm cpu eoi 是做什么”这类问题的答案。...不同的中断 gic 上对应着不同的 INTID;gic 把中断类型分为 LPI、PPI、SPI、SGI,约束 INTID 取值对应的中断类型。

    1.2K21

    linux驱动最新面试题(面试题整理,含答案)

    字符设备和块设备的区别仅仅在于内核内部管理数据的方式,也就是内核及驱动程序之间的软件接口,而这些不同对用户来讲是透明的。在内核中,和字符驱动程序相比,块驱动程序具有完全不同的接口。...具体应用上要不要先注册驱动再注册设备?先后顺序没?...自旋锁和信号量互斥使用时需要注意哪些?中断服务程序里面的互斥是使用自旋锁还是信号量?还是两者都能用?为什么(答案见1分析)?...中断的申请request_irq的正确位置:应该是第一次打开 、硬件被告知终端之前。 5....IRQ和FIQ什么区别,CPU里面是是怎么做的? FIQ和IRQ的区别及CPU实现_逐波与逆流-CSDN博客_fiq和irq的区别 10. Linux软中断和工作队列的作用是什么

    3.3K21

    深入浅出剖析C语言函数指针与回调函数

    一、C语言回调函数 什么是回调函数? 百度的权威解释如下: 回调函数就是一个通过函数指针调用的函数。...定义是如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数,确实,有所不同,但道理是一样的,我们接下来再来看一个例子。...那么,回调函数究竟有什么作用呢?...–lvendor -o main -L : 指定库的路径(编译时); 指定就使用默认路径(/usr/lib/lib) -lvendor : 指定需要动态链接的库是谁; 代码运行时需要加载动态库: ....关于这个函数的如何使用,网上文章很多讲得非常的详细,这里仅仅只是写函数指针和回调函数的应用,详细可以参考这篇文章,了解进程和线程。

    2K40

    9.按键之使用异步通知(详解)

    之前学的应用层都是: 1)查询方式:一直读 2)中断方式.同样一直读,直到中断进程唤醒 3)poll机制:一直poll函数中睡眠,一定时间读一次 以上3种,我们都是让应用程序主动去读,本节我们学习异步通知...驱动程序调用kill_fasync函数 3先来写驱动程序,我们之前的中断程序上修改  3.1定义 异步信号结构体 变量: static struct fasync_struct * button_async...fasync_helper(fd, file, on, & button_async); //初始化button_async结构体,就能使用kill_fasync()了 } 成员.fasync函数又是什么情况下使用...3.3buttons_irq中断服务函数里发送信号: kill_fasync(&button_async, SIGIO, POLL_IN); //当中断时,就发送SIGIO信号给应用层,应用层就会触发与...fd,F_SETFL, oflags| FASYNC ); 添加FASYNC状态标志,会调用驱动中成员.fasync函数,执行fasync_helper()来初始化异步信号结构体 这4个步骤执行后,一旦驱动层

    1.1K90

    Linux 中断处理浅析

    而调用request_irq注册中断处理函数时也可以设置该中断处理函数开中断的情况下进行, 这种情况比较少见, 因为这要求中断处理代码必须是可重入的....可以看出, 软中断与中断的模型很类似, 每个CPU一组中断号, 中断其对应的优先级, 每个CPU处理属于自己的中断. 最大的不同是开中断与关中断....然而嵌套发生的中断处理过程也可能会触发软中断,所以第一层中断处理过程第四阶段需要是一个循环的过程,需要循环处理嵌套发生的所有软中断。为什么要这样做呢?...而第二部分开中断情况下的进行的处理过程一般是由tasklet机制来完成的. tasklet是由软中断引出的, 内核定义了两个软中断掩码HI_SOFTIRQ和TASKLET_SOFTIRQ(两者优先级不同...内核默认启动了一个工作队列, 对应一组工作线程events/n(n代表处理器编号, 这样的线程n个). 驱动程序可以直接向这个工作队列添加任务. 某些驱动程序还可能会创建并使用属于自己的工作队列.

    7.4K80

    Linux系统GIC驱动程序分析

    假设要使用UART模块,它发出的中断连接到GIC的32号中断,分配的irq_desc序号为16 GIC domain中会记录(32, 16) 那么注册中断时就是:request_irq(16, ......domain中记录(0,100) (1,101)(2,102) (3,103) 对于KEY,注册中断时就是:request_irq(102, ...)...调用irq_desc[virq].handle_irq函数:这也应该由GIC驱动提供 处理中断时,要屏蔽中断、清除中断等:这些函数保存在irq_chip里,由GIC驱动提供 从硬件上看,GIC的功能是什么...可以使能、屏蔽中断 发生中断时,可以从GIC里判断是哪个中断 在内核里,使用gic_chip_data结构体表示GIC,gic_chip_data里什么?...GIC 设备树中指定GIC,内核驱动程序根据设备树来选择、初始化GIC。

    4.2K21

    吐血整理 | 肝翻 Linux 中断所有知识点

    主要作用为:接受硬件中断信号,并经过一定处理后,分发给对应的CPU进行处理。 当前GIC 四个版本,GIC v1~v4, 本文主要介绍GIC v3控制器。...中断的注册 设备驱动中,获取到了 irq 中断号后,通常就会采用 request_irq/request_threaded_irq 来注册中断,其中 request_irq 用于注册普通处理的中断。...request_irq/request_threaded_irq 接口注册的中断处理函数,此外如果中断线程化处理的话,还会调用 __irq_wake_thread 唤醒内核线程。...当驱动程序进程上下文中有异步执行的工作任务时,可以用 work 来描述工作任务。...unbound:绑定处理器的工作队列,创建的时候需要指定 WQ_UNBOUND 标志,内核线程可以处理器间迁移。

    3.7K61

    实时Linux内核的实现

    实时分为硬实时和软实时,硬实时要求绝对保证响应时间超过期限,如果超过期限,会造成灾难性的后果,例如汽车发生碰撞事故时必须快速展开安全气囊;软实时只需尽力使响应时间超过期限,如果偶尔超过期限,不会造成灾难性的后果...有些旧的设备驱动程序调用旧的函数request_irq()注册中断处理函数。函数request_irq()的代码如下。...6.软中断线程化 非实时内核中,一部分软中断中断处理程序的后半部分执行,有时间限制:最多执行10轮,并且总时间超过2毫秒。...11.修改使用禁止内核抢占或硬中断保护的临界区 对于使用禁止硬中断保护的临界区,因为实时内核中使用内核线程执行大多数中断处理函数,所以大多数临界区不需要禁止硬中断。...(1)启动的时候创建所有线程,不要在运行的过程中动态创建线程。 (2)启动的时候预留需要的内存,不要在运行的过程中使用函数malloc()或mmap()动态分配内存。

    6.5K40

    【日更计划102】数字IC基础题【SV部分】

    面向对象编程中,工厂是用于创建原型或类的不同对象的方法或函数。不同的类工厂中注册后,工厂方法可以通过调用相应的构造函数来创建任何已注册类类型的对象。创建对象直接调用构造函数的模式称为工厂模式。...使用基于工厂的对象创建而不是直接调用构造函数,允许在对象创建中使用多态性。这个概念是UVM (Univers)中实现的。 [235] 回调函数(callback)的意义是什么?...验证平台中,回调函数很多优点: 注入从驱动程序发送的事务错误 当一个模拟阶段准备结束时,调用一个函数来关闭所有序列/驱动程序中所有挂起的事务。 一个特定的事件上调用一个覆盖率采样函数。...本期题目 236] 什么是DPI调用? [237] “DPI import” 和“DPI export”什么区别? [238] 什么是系统函数?...举例说明他们的作用 [239] 定向测试和受约束的随机测试什么区别?两者什么优缺点? [240] 什么是自检测试(self-checking tests)?

    52210

    09_GPIO子系统与Pinctrl子系统的交互

    gpio_virt 0 GPIO_ACTIVE_LOW>; pinctrl-names = "default"; pinctrl-0 = ; }; 但是很多芯片,并不要求设备树中把把引脚复用为...要用作GPIO,需要先通过Pinctrl把引脚复用为GPIO功能。...我们要做什么 如果不想在使用GPIO引脚时,设备树中设置Pinctrl信息, 如果想让GPIO和Pinctrl之间建立联系, 我们需要做这些事情: 3.1 表明GPIO和Pinctrl间的联系 GPIO...设备树中使用gpio-ranges来描述它们之间的联系: 3.2 解析这些联系 GPIO驱动程序中,解析跟Pinctrl之间的联系:处理gpio-ranges: 3.3 编程 3.3 编程 GPIO...驱动程序中,提供gpio_chip->request Pinctrl驱动程序中,提供pmxops->gpio_request_enable或pmxops->request

    88110

    第五课. 内核中断系统中的设备树

    对于不同中断控制器里面的硬件中断号,它们的转化公式是不同的 硬件上有多个intc(中断控制器),对于同一个hwirq数值,会对应不同的virq所以讲hwirq时,应该强调“是哪一个intc的hwirq...也要保存的硬件中断号和虚拟中断号之间的对应关系,irq_domain也有liner_revmap[]对每一个[hwirq] = 预先设置号的virq 我们写驱动程序直接 request_irq(virq...几个U32的数据来描述中断 =第05节_示例_使用设备树描述按键中断= 在上节视频里我们体验了怎么设备树中描述中断,这一节我们来写一个按键驱动程序来看看怎么使用设备树来描述按键驱动程序所使用的引脚和所使用的中断...驱动程序从platform_device的"中断资源"取出中断号, 就可以request_irq了。 实验 a....驱动程序从platform_device的"中断资源"取出中断号, 就可以request_irq

    1.2K31

    【深度】韦东山:GPIO和Pinctrl子系统的使用

    BSP工程师要做什么?看下图: ? 等BSP工程师GPIO子系统、Pinctrl子系统中把自家芯片的支持加进去后,我们就可以非常方便地使用这些引脚了:点灯简直太简单了。...比如默认状态下,UART设备是工作的,那么所用的引脚就要复用为UART功能。 休眠状态下,为了省电,可以把这些引脚复用为GPIO功能;或者直接把它们配置输出高电平。...以前我们通过寄存器来操作GPIO引脚,即使LED驱动程序,对于不同的板子它的代码也完全不同。 当BSP工程师实现了GPIO子系统后,我们就可以: a. 设备树里指定GPIO引脚 b....自己的设备节点中使用属性"[-]gpios",示例如下: ? 上图中,可以使用gpios属性,也可以使用name-gpios属性。...2.3 驱动代码中调用GPIO子系统 设备树中指定了GPIO引脚,驱动代码中如何使用? 也就是GPIO子系统的接口函数是什么

    10.4K74

    中断与异常简介与分析

    一、用户态、内核态 开篇,我们先来了解下什么是用户态、内核态。 一般现代CPU都有几种不同的指令执行级别。...举例: intel x86 CPU四种不同的执行级别0-3,linux只使用了其中的0级和3级分别来表示内核态和用户态。 image.png 二、如何区分用户态和内核态?...孟宁老师讲解内核知识点已经把这个知识点最精华的部分提取出来了,那么到底内核中有什么样的接口是跟老师说的相关的呢?...,进而就会进行系统调用,产生相应的系统调用号,然后内核会根据系统调用号找到相应的驱动程序,此时系统就处在内核态中,驱动程序中,首先进行驱动程序初始化,然后注册,产生驱动程序最重要主设备号和次设备号。...异常有很多种,8086处理器可以找到多达20种不同的异常,内核必须为每种异常提供一个专门的异常处理程序。

    1.2K30

    让天堂的归天堂,让尘土的归尘土——谈Linux的总线、设备、驱动模型

    答案是真的没有什么关系!ABC网卡,不会因为你是TI的ARM,你是龙芯,还是你是Blackfin什么不同。任你外面什么板子排山倒海,狗急跳墙,ABC自己都是岿然不动。...一次我一个德国外企,问到工程师们“高内聚和低耦合是什么关系”,一个工程师非常积极地回答,“高内聚和低耦合是一对矛盾”。...柳岸花明 现在板级互连信息已经和驱动分离开来了,让它们彼此出现在不同的软件模块。但是,最终它们仍然一定的联系,因为,驱动最终还是要取出基地址、中断号等板级信息的。怎么取,这是个大问题。...因为,驱动还是得知道板子上有没有ABC,哪个板子,怎么个有法。它还是和板子直接耦合。 ?...可不可以另外一种方法,我们维护一个共同的类似数据库的东西,板子上有什么网卡,基地址中断号是什么,都统一一个地方维护。然后,驱动问一个统一的地方,通过一个统一的API来获取即好? ?

    98431
    领券