158 Linux中断基础概念
文章目录
- 一、回顾
- 二、设备树中GIC中断控制器节点
- 三、外设中断控制器节点
- 三、其他设备使用中断节点
- 1、中断类型
- 四、常用函数
- 1、request_irq()函数
- (1)irq_handler_t
- irqreturn_t
- (2)flags
- 2、free_irq()函数
- 3、enable_irq()函数
- 4、disable_irq()函数
- 5、disable_irq_nosync()函数
- 6、local_irq_disable()宏
- 7、local_irq_enable()宏
一、回顾
裸机开发中:
通用中断控制器(GIC)
中断类型、硬件中断号、分发器和cpu接口单元中断向量表
一级查表、二级查表中断处理流程
进入irq模式、保护现场、获取硬件中断编号、执行中断处理函数、还原现场
二、设备树中GIC中断控制器节点
arch/arm/boot/dts/imx6ull.dtsi
初始化中断控制器、设置其他中断控制器节点的描述格式
intc: interrupt-controller@a01000 {compatible = "arm,cortex-a7-gic";// 描述下一级中断信息节点所需要的单元个数#interrupt-cells = <3>;// 表示该设备是一个中断控制器,外设可以连接在该中断控制器上interrupt-controller;// GIC的分发器和cpu接口单元寄存器地址reg = <0xa01000 0x1000>,<0xa02000 0x100>;};
因为中断控制器是linux系统中必不可少的,因此配置gic的代码在内核中并不是以驱动模块的形式存在的。因此搜索compatilble属性值匹配到的不是一个驱动模块文件。
三、外设中断控制器节点
arch/arm/boot/dts/imx6ull.dtsi
某个外设和中断密切相关
管理某一种具体中断
gpio5: gpio@20ac000 {compatible = "fsl,imx6ul-gpio", "fsl,imx35-gpio";reg = <0x20ac000 0x4000>;// 负责管理的中断类型,上面父节点的#interrupt-cells = <3>从,此属性的每个单元用3个值来描述interrupts = <GIC_SPI 74 IRQ_TYPE_LEVEL_HIGH>,<GIC_SPI 75 IRQ_TYPE_LEVEL_HIGH>;clocks = <&clks IMX6UL_CLK_GPIO5>;// 和上面一样,有此属性表示此节点是一个中断控制器,负责管理某一种的中断gpio-controller;#gpio-cells = <2>;interrupt-controller;// 其它外设节点想要使用这个中断控制器上的中断时的描述格式。使用范例见下。#interrupt-cells = <2>;gpio-ranges = <&iomuxc 0 7 10>, <&iomuxc 10 5 2>;};
- interrupts属性:
GIC_SPI:中断类型:0 表示 SPI 中断,1 表示 PPI 中断
74:中断号,对于 SPI 中断来说中断号的范围为 0 ~ 987,对于 PPI 中断来说中断号的范围为 0~15
IRQ_TYPE_LEVEL_HIGH:中断类型,高电平触发
三、其他设备使用中断节点
使用某一种具体中断(控制器)
button_interrupt {compatible = "button_interrupt";pinctrl-names = "default";pinctrl-0 = <&pinctrl_button>;button_gpio = <&gpio5 1 GPIO_ACTIVE_LOW>;status = "okay";// 表明归属的上一级中断,使用上面描述的gpio5中断控制器interrupt-parent = <&gpio5>;// gpio5上有32个外部中断,button节点只用到其中一个,1表示gpio5-1;上升沿触发中断interrupts = <1 IRQ_TYPE_EDGE_RISING>;
};
1、中断类型
include/linux/irq.h
标志, bit[3:0]表示中断触发类型,为 1 的时候表示上升沿触发,为 2 的时候表示下降沿触发,为 4 的时候表示高电平触发,为 8 的时候表示低电平触发。 bit[15:8]为 PPI 中断的 CPU 掩码。
// 常用的五个触发类型
enum {IRQ_TYPE_NONE = 0x00000000,IRQ_TYPE_EDGE_RISING = 0x00000001,IRQ_TYPE_EDGE_FALLING = 0x00000002,IRQ_TYPE_EDGE_BOTH = (IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING),IRQ_TYPE_LEVEL_HIGH = 0x00000004,IRQ_TYPE_LEVEL_LOW = 0x00000008,...}
四、常用函数
1、request_irq()函数
申请中断,若申请成功会自动激活(使能)中断,不再需要我们手动去使能中断。
此函数可能会导致睡眠。
include/linux/interrupt.h
static inline int __must_check
request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags,const char *name, void *dev)
参数:
irq:要申请的中断号
handler:函数指针,指向中断处理函数,详见下(1)
flags:中断标志,可以在文件 include/linux/interrupt.h 里面查看所有的中断标志,详见下(2)
name:中断名字,设置以后可以在/proc/interrupts 文件中看到对应的中断名字。
dev:传递给中断处理函数的第二个参数,一般指向 device结构体变量,区分不同设备共用同一中断。如果将 flags 设置为 IRQF_SHARED的话, dev 用来区分不同的中断,一般情况下将dev 设置为设备结构体, dev 会传递给中断处理函数 irq_handler_t 的第二个参数。返回值:
成功:0
失败:负数
(1)irq_handler_t
中断处理函数的数据类型
typedef irqreturn_t (*irq_handler_t)(int, void *);
参数1:中断处理函数对应的中断号
参数2:通用指针,需要与request_irq函数的dev参数保持一致
返回值详见下
irqreturn_t
enum irqreturn {// 不是本驱动程序的中断,不处理IRQ_NONE = (0 << 0),// 正常处理IRQ_HANDLED = (1 << 0),// 不使用中断处理函数来处理,使用中断下半部处理IRQ_WAKE_THREAD = (1 << 1),
};typedef enum irqreturn irqreturn_t;
(2)flags
include/linux/interrupt.h
描述中断的特征
标志, bit[3:0]表示中断触发类型,为 1 的时候表示上升沿触发,为 2 的时候表示下降沿触发,为 4 的时候表示高电平触发,为 8 的时候表示低电平触发。 bit[15:8]为 PPI 中断的 CPU 掩码。
// 共享中断,可以有多个外设共同使用这个中断
#define IRQF_SHARED 0x00000080
// 此中断只出发一次
#define IRQF_ONESHOT 0x00002000
#define IRQF_TRIGGER_NONE 0x00000000
// 下面四个描述的就是中断的触发方式
#define IRQF_TRIGGER_RISING 0x00000001
#define IRQF_TRIGGER_FALLING 0x00000002
#define IRQF_TRIGGER_HIGH 0x00000004
#define IRQF_TRIGGER_LOW 0x00000008
2、free_irq()函数
释放中断
include/linux/interrupt.h
const void *free_irq(unsigned int irq, void *dev_id)
- 参数:
irq:要释放的中断号
dev:传递给中断处理函数的第二个参数。如果中断设置为共享(IRQF_SHARED)的话,此参数用来区分具体的中断。共享中断只有在释放最后中断处理函数的时候才会被禁止掉。
3、enable_irq()函数
使能中断
kernel/irq/manage.c
void enable_irq(unsigned int irq)
- 参数:
irq:要使能的中断号
4、disable_irq()函数
禁止中断,但是要等待中断执行完毕再禁止
kernel/irq/manage.c
void disable_irq(unsigned int irq)
- 参数:
irq:要禁止的中断号
5、disable_irq_nosync()函数
立即禁止中断,不等待中断执行完
kernel/irq/manage.c
void disable_irq_nosync(unsigned int irq)
- 参数:
irq:要禁止的中断号
6、local_irq_disable()宏
include/linux/irqflags.h
禁止处理器中断,就是禁止全部中断
#define local_irq_disable() do { raw_local_irq_disable(); } while (0)
7、local_irq_enable()宏
include/linux/irqflags.h
打开处理器中断,就是使能所有中断
#define local_irq_enable() do { raw_local_irq_enable(); } while (0)
158 Linux中断基础概念相关推荐
- Linux内核基础——Linux中断的概念
一.什么是中断? 中断是指计算机运行过程中,出现某些意外情况需要主机干预时,中断源向CPU发送一个中断请求,CPU能进行中断响应去停止正在运行的程序并且保护现场数据,然后转入中断服务程序进行处理,处理 ...
- 深入理解Linux内核(一)——Linux操作系统基础概念
文章目录 前言 操作系统基本概念 多用户系统 用户和组 进程 内核体系结构 Unix文件系统概述 文件 硬链接和软链接 文件类型 文件描述符与索引节点 访问权限和文件模式 文件操作的系统调用 打开文件 ...
- Exynos4412 中断驱动开发(一)—— 中断基础及中断的注册过程
一.中断基础概念 所谓中断,指CPU在执行程序的过程中,出现了某些突发事件即待处理,CPU必须暂停当前的程序.转去处理突发事件,处理完毕后CPU又返回原程序被中断的位置并继续执行. 1.中断分类 a ...
- 2022-07-17 Linux group与user基础概念
Linux group与user基础概念 概念 user 用户 group 用户组 Linux 命令使用 user 用户 useradd 添加用户 userdel 删除用户 usermod 修改账号 ...
- 【Linux】基础:进程的概念
[Linux]基础:进程概念 摘要:本文的主要目的是理解进程的概念.文章通过介绍进程的管理方式来引入进程的概念,从而提出进程的理解--PCB与程序.然后对PCB内容进行详细介绍,并同时介绍了关于进程的 ...
- Linux运维 第二阶段 (一)linux基础概念及常用命令
一.基础概念: 1.CPU(slice):运算器(线路复用).控制器(芯片针脚有电没电).寄存器(保存现场): interrupt(中断,硬件通知机制),FSB(frontside bus前端总线), ...
- linux基础概念和个人笔记总结(6)
防伪码:曾经梦想仗剑走天涯,回过头,却发现还是放不下家的牵挂 后续理论的验证图文详解,我会更新,希望大家可以参考 第十一章 FTP文件传输服务 1.FTP连接 控制连接:tcp21端口,用于发送ftp ...
- 【Linux开发】linux设备驱动归纳总结(一):内核的相关基础概念
linux设备驱动归纳总结(一):内核的相关基础概念 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...
- linux驱动内核哪个文件夹,linux设备驱动归纳总结(一):内核的相关基础概念...
linux设备驱动归纳总结(一):内核的相关基础概念 1. 内核与 linux 设备驱动的作用与关系 内核:用于管理软硬件资源,并提供运行环境.如分配 4G 虚拟空间等. linux 设备驱动:是连接 ...
最新文章
- Node.js学习之路09——Path基本介绍
- mysql导入数据提前修改字段_Mysql一些导入导出数据库,添加修改字段命令_MySQL...
- js中的弹窗alert、confirm和prompt
- 在python语言中语句的续行符是_Python程序设计课后习题答案-第二单元(2页)-原创力文档...
- 分数的大小比较优秀教案_人教版小学数学五年级下册异分母分数加、减法公开课优质课课件教案视频...
- Task 6.1 校友聊之NABCD模型分析
- css不继承上级样式_【FrontEnd】CSS
- [FPGA] 2、新建并运行一个工程
- python爬虫教程-Python爬虫入门教程——爬取自己的博客园博客
- # WebView简介 #
- vscode配置Git管理工具GitLens
- adventureworks mysql_AdventureWorks2012
- LeetCode罗马数字转整数
- 不可重复读和幻读有什么区别区别?
- html 编辑器 拖动,可视化拖拽页面编辑器 一
- 2021年第4季度记账理财应用监测,头部集聚加强,领跑者转型发展
- 高中数学知识点归纳总结三角函数与解三角形
- 疫情下的春招季:AI面试官已就位,请接招!
- This means it will render an <Outlet /> with a null value by default resulting in an “empty“ page.
- 银行系统(万里长征始于足下)
热门文章
- 2017今日头条校招——或与加
- 普歌-飞灵团队-nuxt中jQuery报e.indexOf is not a function错误
- python 怎么将数字转大写_Python将数字转化为中文大写的实例代码
- networking /etc/network/interfaces 笔记221102
- IE的layout布局
- 一个人写一个集群:基于GRPC的golang微服务框架iogo(grpc/protobuf/etcd/freetoo/码客 卢益贵)
- 软件开发工作量及费用量化评估方法在金融行业的应用
- 计算机科学出版费,计算机专业著作出版多钱
- 转载:Docker从入门到上瘾
- 无限极分类php实现—查子孙树、家谱树