首页 > 系统相关 >【Linux中断】Linux系统中断机制简述

【Linux中断】Linux系统中断机制简述

时间:2023-06-03 17:44:36浏览次数:41  
标签:函数 中断 irq dev 简述 Linux IRQF 处理函数

Linux中断

Linux中断处理过程

1.使能中断,初始化相应的寄存器
2.注册中断服务函数,也就是向irqTable数组的指定标号处写入中断服务函数
3.中断发生以后进入IRQ中断服务函数,IRQ的中断服务函数在irqTable里面查找具体的中断处理函数,找到以后执行相应的中断处理函数

Linux中断处理API函数

request_irq(注册中断处理程序)

request_irq函数用于申请中断,但是可能会导致睡眠,因此不能在中断上下文或者其他禁止睡眠的代码段中使用request_irq函数。request_irq函数会使能中断,所以不需要我们手动去使能中断。

函数原型:

int request_irq(unsigned int irq,
                irq_handler_t handler,
                unsigned long flags,
                const char *name,
                void *dev);

参数说明:

irq:要申请中断的中断号
handler:中断处理函数,当中断发生以后就会执行此中断处理函数
flags:中断标志,可以在include/linux/interrupt.h里面查看所有的中断标志
name:中断名字,设置以后可以在/proc/interrupts文件中可以看到对应的中断名字
dev:如果flags设置为IRQF_SHARED的话,dev用来区分不同的中断,一般情况下将dev设置为设备结构体,dev会传递给中断处理函数irq_handler_t的第二个参数

第二个参数handler是一个指针,指向处理这个中断的实际中断处理程序。只要操作系统一接收到中断,该函数就被调用

typedef irqreturn_t (*irq_handler_t)(int,void *);     // handler函数的原型,接受两个参数,返回值为irqreturn_t

常用中断标志:

标志 描述
IRQF_SHARED 多个设备共享一个中断线,共享的所有中断都必须指定此标志。如果使用共享中断的话,request_irq函数的dev参数就是唯一区分他们的标志。
IRQF_ONESHOT 单次中断,中断执行一次就结束
IRQF_TRIGGER_NONE 无触发
IRQF_TRIGGER_RASING 上升沿触发
IRQF_TRIGGER_FALLING 下降沿触发
IRQF_TRIGGER_HIGH 高电平触发
IRQF_TRIGGER_LOW 低电平触发

代码实例:

// irq:请求的中断线
// my_interrupt:中断处理程序
// IRQF_SHARED:中断线可以共享
// my_device:中断名字
// my_dev:传递my_dev变量给dev形参。如果请求失败将直接返回
if(request_irq(irqn,my_interrupt,IRQF_SHARED,"my_device",my_dev))
{
    return -EIO;
}

free_irq(释放中断)

释放相应的中断,注释掉相应的中断处理程序,并释放中断线。如果中断不是共享的,那么free_irq会删除中断处理函数并且禁止中断.

函数原型:

void free_irq(unsigned int irq,void *dev);

参数说明:

irq:要释放的中断。
dev:如果flags设置为IRQF_SHARED的话,dev用来区分不同的中断。共享中断只有在释放最后中断处理函数的时候才会被禁止掉

中断处理函数

使用request_irq函数申请中断的时候需要设置中断处理函数

函数原型:

irqreturn (*irq_handler_t)(int , void *);

参数说明:

第一参数:中断处理函数相对应的中断号
第二参数:指向void的指针,也就是一个通用指针,需要与request_irq函数的dev参数保持一致,用于区分共享中断的不同设备

返回值:

enum irqreturn
{
    IRQ_NONE   = (0 << 0),
    IRQ_HANDLED = (1 << 0),
    IRQ_WAKE_THREAD = (1 << 1),
};

中断使能与禁止函数

常用中断使用和禁止函数

void enable_irq(unsigned int irq);
void disable_irq(unsigned int irq);

enable_irq和disable_irq用于使能和禁止指定的中断,irq就是要禁止的中断号。disable_irq函数要等到当前正在执行的中断处理函数执行完才返回,因此需要保证不会产生新的中断,并且确保所有已经开始执行的中断处理程序已经全部退出。在这种情况下,可以使用另外一个中断禁止函数:

void disable_irq_nosync(unsigned int irq);

disable_irq_nosync函数调用以后立即返回,不会等待当前中断处理程序执行完毕。上面三个函数都是使能或者禁止某一个中断,如果需要关闭全局中断需要使用一下函数:

local_irq_enbale();                 // 使能当前处理器中断系统
local_irq_disbale();                // 禁止当前处理器中断系统
local_irq_save(flags);                                  //   用于禁止中断,并且将中断状态保存到flags中
local_irq_restore(flags);                             //    用于恢复中断,将中断恢复到flags状态。

标签:函数,中断,irq,dev,简述,Linux,IRQF,处理函数
From: https://www.cnblogs.com/Wangzx000/p/17209226.html

相关文章

  • 深剖 Linux 信号量
    目录传统艺能......
  • linux 正则表达式
    目录一、正则表达式二、元字符三、次数符号四、位置锚定五、实验              一、正则表达式通配符功能是用来处理文件名,而正则表达式是处理文本内容中字符。分类:1. 基本正则表达式2.扩展正则表达式二......
  • linux sort、uniq、tr、grep、eval、cut、sqlit、paste
    目录一、grep查找文件内容二、sort排序三、uniq统计压缩重复四、tr替换压缩 五、cut截断六.sqlit拆分七.paste合并八.eval        一、grep(匹配文件内容)    grep[选项]…查找条件目标文件-m 匹配次数-v  除什么以外......
  • Splunk Enterprise 9.0.5 (macOS, Linux, Windows) 发布 - 机器数据管理和分析
    SplunkEnterprise9.0.5(macOS,Linux,Windows)-机器数据管理和分析请访问原文链接:https://sysin.org/blog/splunk-9/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org混合世界的数据平台快速、大规模地从可见性转向行动,以实现安全性、可观察性等目标。2TB从......
  • linux 内存管理 ------ malloc 的内存分配
     低于128K的内存分配采用具有内存池缓存机制的brk方式,可以减少缺页中断、系统调用的次数。高于128K时采用匿名内存映射区的mmap方式,避免产生太大的内存碎片 如果分配后的虚拟内存没有被访问的话,虚拟内存是不会映射到物理内存的,这样就不会占用物理内存了。只有在访问已分配......
  • 《Linux基础与服务管理(基于CentOS 7.6)》pdf电子书免费下载
    本书以目前广泛使用的CentOS 7.6平台为例,由浅入深、系统地介绍了Linux基础及对Linux各种服务的管理。*书共11章,主要内容*括Linux简介、基础*作命令、账户与权限管理、文件系统与磁盘管理、网络管理与系统监控、软件*管理、进程与基础服务、常用服务器配置、常用集群配置、常用系......
  • Linux页表与ARM硬件页表
    早期Linux内核是基于x86体系结构设计的,x86页表中有3个标志位是ARM32硬件页表没有的。PTE_DIRTY:cpu在写操作时会设置该标志位,表示对应页面被写过,为脏页。PTE_YOUNG:CPU访问该页时会设置该标志位。在页面换出时,如果该标志位位置了,说明该页刚被访问过,页面是young的,不适合把该页换出,同......
  • windows系统编译的Qt程序转到国产化麒麟linux中编译
    团队自研股票软件,关威信共总号:QStockView,下载1.1 windows系统编译的Qt程序转到国产化麒麟linux中编译(1)把Vs工程项目文件导入到Linux中首先把vs的工程拷贝到linux里面(可以用虚拟机的共享文件夹功能),把工程里面的目录Debug、GeneratedFiles、Release、Win32、x64和文件…user、......
  • k8s集群外的linux加入prometheus监控
    client配置:准备一台linux,不在k8s集群中,安装node_exporterwgethttps://github.com/prometheus/node_exporter/releases/download/v1.6.0/node_exporter-1.6.0.linux-amd64.tar.gztar-xvfnode_exporter-1.6.0.linux-amd64.tar.gzmvnode_exporter-1.6.0.linux-amd64/usr/lo......
  • linux 性能自我学习 ———— 软中断 [五]
    前言linux性能的自我学习。正文什么是软中断呢?举一个网络的例子。linux将中断处理过程分为两个阶段:上半部用来快速处理中断,他在中断禁止模式下运行,注意是处理跟硬件紧密相关或时间敏感的工作。下半部用来延迟处理上半部未完成的工作,通常以内核线程的方式运行。比如网卡......