Linux内核中断之中断申请接口
发布网友
发布时间:2022-12-02 20:32
我来回答
共1个回答
热心网友
时间:2023-05-10 23:16
本文基于 RockPI 4A 单板Linux4.4内核介绍中断申请的常用接口函数。
1、文件
2、定义
说明:
1)、 irq :要申请的中断号,可通过 platform_get_irq() 获取,见“Linux内核中断之获取中断号”。
2)、 handler :中断处理函数,发生中断时,先处理中断处理函数,然后返回 IRQ_WAKE_THREAD 唤醒中断处理线程。中断处理函数尽可能简单。
中断处理函数定义: typedef irqreturn_t (*irq_handler_t)(int, void *);
中断返回值如下:
3)、 thread_fn :中断处理线程,该参数可为NULL。类似于中断处理函数的下半部分。
4)、 irqflags :中断类型标志。
定义文件: include/linux/interrupt.h ,内容如下:
5)、 devname :中断名称,可使用 cat /proc/interrupts 命令查看。
6)、 dev_id :设备ID,该值唯一。
在使用共享中断时(即设置 IRQF_SHARED ),必须传入 dev_id ,在中断处理和释放函数中都会使用该参数。
注:
1、 request_threaded_irq() 函数可替代 request_irq 加 tasklet 或 workqueue 的方式。
2、对应的中断释放函数为: void free_irq(unsigned int, void *) ,需要和中断申请函数成对出现。
1、文件
2、定义
说明:
1)、 __must_check :指调用函数一定要处理函数的返回值,否则编译器会给出警告。
2)、 request_irq() 函数本质上是中断处理线程 thread_fn 为空的 request_threaded_irq() 函数。
注 :
对应的中断释放函数为: void free_irq(unsigned int, void *) ,需要和中断申请函数成对出现。
1、文件
2、定义
说明 :
devm_request_threaded_irq() 本质上还是使用 request_threaded_irq() 函数实现中断申请。
两者区别:
1)多了一个 dev 参数;
2)在设备驱动卸载时,中断会自动释放;
3)如果想单独释放中断,可使用 void devm_free_irq(struct device *dev, unsigned int irq, void *dev_id) 函数。
1、文件
2、定义
devm_request_irq() 函数本质上是中断处理线程 thread_fn 为空的 devm_request_threaded_irq() 函数。
1、获取中断号
2、申请中断
3、中断处理函数
4、中断处理线程
5、查看中断
申请Linux系统中断处理流程linux中断申请
Step 1: 申请Linux中断服务程序. 在申请Linux中断服务程序之前,程序员必须先生成一个中断描述符(IDT),用来表示中断的级别和优先级,以及要处理的中断的处理代码的地址:struct idt_desc{ unsigned char offset_low;unsigned char selector;unsigned char zero;unsigned char type_attr;unsigned short of...
探索Linux内核--request_irq和free_irq函数如何注册注销中断
handler - 要注册的中断服务函数,即(irq_desc + irq )->action->handler。irqflags - 触发中断的参数,如边沿触发,定义在linux/interrupt.h。devname - 中断程序的名字,可通过执行"cat /proc/interrupt"查看。dev_id - 中断处理程序的参数,在注册共享中断时不能为NULL,以便卸载其他中断服务函数...
Linux内核中断之中断调用流程
在使用 request_threaded_irq() 函数申请中断时,会创建一个 irq_thread 线程,调用流程如下:irq_thread 线程平时在睡眠状态,等待 handle_irq_event_percpu() 函数唤醒,进一步执行已注册的中断处理线程函数。使用 DRM 框架中 HDMI 中断验证中断调用流程。文件: drivers\gpu\drm\bridge\synopsys\dw-hd...
Linux内核中断之获取中断号
中断号获取函数 platform_get_irq() 调用流程如下:rk3399 使用的是 GICv3 ,对应 irq_domain->name 。文件: drivers/irqchip/irq-gic-v3.c 。translate() 函数实现如下:以 RockPI 4A 单板 Debian 系统Linux 4.4内核中的获取 HDMI 中断号为例。1、查找中断号 从手册“Rockchip RK3399 TRM ...
浅析linux内核中断子系统—softirq和tasklet
与之不同。tasklet调度有其独特性,如可能会丢失调度,原因在于if条件语句中的位操作。为了确保正确执行,可以考虑动态申请并在中断顶半部调度。测试tasklet调度时,添加延时可以帮助观察调度行为。总的来说,Linux内核中断子系统通过软irq和tasklet设计,实现了高效和灵活的中断处理机制。
linux中,中断注册和中断服务程序只能写在驱动层还是能写在应用层?_百...
Linux中,分内核态和用户态。你写的所有的驱动,都是出于内核态->可以直接使用内核相关资源;应用层,都是用户态->无法直接操作底层的东西 -> 想要操作,比如获得权限,切换到内核态,然后才能操作。你这里的需求,我的理解是:对应你这句 “在中断服务程序中操作另一个外设”不知道你的目的和打算用...
linux内核中的软中断和threaded_irq(27)
软中断(Softirq)在Linux内核中是一种底半部处理机制,通常在顶半部返回时执行。软中断由softirq_action结构体表示,包含处理函数指针和参数。使用open_softirq()注册,raise_softirq()触发。软中断和tasklet运行于软中断上下文,属于原子上下文。工作队列运行于进程上下文,因此软中断和tasklet中禁止睡眠,...
Linux 中断( IRQ / softirq )基础:原理及内核实现
软中断事件的handler提前注册到softirq子系统,注册方式为open_softirq(softirq_id, handler)例如,注册网卡收发包(RX/TX)软中断处理函数:软中断占用了CPU的总开销:可以使用top查看,第三行倒数第二个指标是系统的软中断开销(si字段):Linux内核源码分析学习地址:ke.qq.com/course/403254...【文章...
为什么中断注册成功但LINUX内核没有响应
linux,首先在你的开发板启动后执行以下:cat /proc/interrupt,看哈你所要的中断号是否存在 存在的话,看哈你的request_irq里面的触发条件是否设置正确,是否写正确。不存在,看哈你是否没有初始化正确,request_irq是否没有写正确。以上只是建议。若是你用示波器打你的硬件,真的可以看见你的中断已经...
Linux内核:自己动手写一个GDB设置断点(原理篇)
处理器在接收到该信号后,停止当前任务转而执行中断服务例程。每个中断都通过一个唯一的数字标识,这些值称为中断请求线。当进程在运行过程中遇到中断时,CPU会停止当前进程的执行,转而运行内核设置的中断服务例程。这为调试进程提供了机会,如打印变量值或堆栈信息。在中断原理基础上,本文将介绍如何利用软...