linux驱动:(22)中断节点和中断函数

目录

中断过程

中断上下文

注意

中断节点

步骤 

中断函数

获取设备节点的中断号函数

获取对应io口的终端号

申请中断函数

中断梳理函数

释放对应中断


中断过程

  • 中断请求
  • 中断响应
  • 保护现场
  • 中断处理
  • 恢复现场
  • 中断返回
  • 中断屏蔽

中断上下文

中断的存在可以极大的提高 CPU 的运行效率,但是中断会打断内核进程中的正常调度和运行,所以为保证系统实时性,中断服务程序必须足够简短,但实际应用中某些时候发生中断时必须处理大量的事物,这时候如果都在中断服务程序中完成,则会严重降低中断的实时性基于这个原因,linux 系统提出了一个概念:把中断服务程序分为两部分:中断上文和中断下

  • 中断上文:完成尽可能少切比较急的任务,中断上文的特点就是响应速度快。
  • 中断下文:处理中断剩余的大量比较耗时间的任务,而且可以被新的中断打断

注意

  • 中断上文越快越好,中断下文可以做比较耗时间的事情,但是不能死循环。
  • 以前的可以嵌套,现在的不可以嵌套
  • 如果中断简单,可以只写上文

中断节点

如果一个设备需要用到中断功能,开发人员就需要在设备树中配置好中断属性信息,因为设备树是用来描述硬件信息的,然后Linux内核通过设备树配置的中断属性来配置中断功能。

我们只需要关系怎么在设备树中指定中断,怎么在代码中获得中断就可以。其他的事情,比如设备树中的中断控制器,这些都是由原的 BSP 工程师帮我们写好了,我们不需要来修改他。

比如,在 xxxx.dtsi,文件,其中的 inc 节点就是xxxx 的中断控制器节点:

intc: interrupt-controller@00a0100{compatible = "arm,cortex-a7-gic";#interrupt-cells = <3>;//表示他的子节点是用3个cells来描述中断的interrupt-controller;//表示中断控制器reg = < 0x00a0100 0x1000>,< 0x00a02000 0x100>;
};
  • intc就是中断控制器,因为节点属性中有一个interrupt-controller;
  • #interrupt-cells = <3>表示他的子节点是用3个cells来描述中断的

gpio1: gpio@0x09c000{compatible = "fsl,imx6ul-gpio","fsl,imx35-gpio";reg = <0x0209c000 0x4000>;interrupts = <GIC_SPI 66 IRQ_TYPE_LEVEL_HIGH>,<GIC_SPI 67 IRQ_TYPE_LEVEL_HIGH>;gpio-controller;#gpio-cells = <2>;interrupt-controller;#interrupt-cells = <2>;
};
  • 上面的中断节点的子节点可以为gpio中断,我们分析一下gpio中断
  • gpio中断节点里面也有interrupt-controller;中断控制器属性
  • interrupts 属性中一个<>括号里面有三个参数,因为他的上一个节点intc中#interrupt-cells属性等于 <3>,这是对应的
    • 第一个参数;中断类型,共享中断和私有中断
    • 第二个参数;中断编号
    • 第三个参数;触发类型 在linux/irq.h中定义
  • #interrupt-cells = <2>;表示如果想用这个gpio节点就要用两个cells来描述这个节点

key{#address-cells =<1>;#size-cells = <1>;compatible = "key";pinctrl-names = "default";pinctrl-0 = <&pinctrl_key>;key-gpio = <&gpio1 18 GPIO_ACTIVE_LOW>;//KEY 0interrupt_parent = <&gpio1>interrupts = <18 IRQ_TYPE_EDGE_BOTH>;//双边沿触发status = "okay";
}
  • 现在这个是接在上面gpio中断节点上面的外设,是一个按键中断,通过中断来获取按键的键值
  • compatible是与驱动名字name匹配的
  • pinctrl和gpio子系统
    • 第5,6,7行设置为了gpio功能,按键的输入
    • key-gpio要设置为引脚复用gpio
  • 描述中断
    • 第8,9行是描述中断的
    • interrupt_parent表示我们要使用gpio1的中断控制器,因为我们这个按键属于gpio1组
    • interrupts表示设置中断源,这个<>括号里面的参数就要根据中断控制器中的interrupt-cells属性来决定要多少个值
      • 第一个参数;要用的中断,也就是io口号
      • 第二个参数;触发类型 在linux/irq.h中定义

步骤 

根据上面分析,如果我们要设置gpio中断,就只需要两步,

  • 第一步是将io设置成gpio
  • 第二步是用interrupt_parent和interrupts来描述中断并绑定什么中断控制器

中断函数

获取设备节点的中断号函数

编写驱动的时候需要用到中断号,每一个中断都有中断号,我们用到中断号,中断信息已经写到了设备树里面,因此可以通过 irq_of_parse_and_map 函数从 interupts 属性中提取到对应的设备号,函数原型如下:

unsigned int irq_of_parse_and_map(sturct device_node *dev,int index)
  • 参数
    • dev:设备节点
    • index:索引号,interupts可能包含多个中断信息,通过index指定要获取的信息
  • 返回值
    • 中断号

获取对应io口的终端号

int gpio_to_irq(unsigned int gpio)
  • 参数
    • gpio:要获取的gpio编号
  • 返回值
    • gpio对应的中断号

申请中断函数

同 GPI0 一样,在Linux内核里面,如果我们要使用某个中断也是需要申请的

int reguest_irq(unsigned int irq,irq_handler_t handler,unsigned long flags,const char *name,void *dev)
  • 参数
    • irq:要申请中断的中断号
    • handler:中断处理函数
    • flags:中断标志位,在linux/interrupt.h中定义
    • name:自定义中断名字,启动后可以在/proc/interrupts中看到
    • dev:传递给中断函数的第二个参数
  • 返回值
    • 0成功,负值失败,-EBUSY已经被申请了

中断梳理函数

irqreturn_t(*irq_handler_t)(int,void *)
  • 参数
    • 第一个参数:要中断处理函数要相应的中断号
    • 第二个参数:通用指针,要与传递进来参数的类型保持一致,用于区分共享中断的不同设备,也可以指向设备数据结构
  • 返回值
    • irqreturn_t是一个枚举类型,返回一般形式是return IRQ_RETVAL(IRQ_HANDLED)
      enum irqreturn{IRQ_NONE = (0 << 0),IRQ_HANDLED = (1 << 0),IRQ_WAKE_THREAD = (1 << 1),
      };
      typedef enum irqreturn irqreturn_t

释放对应中断

中断使用完成以后就要通过 free_irq 函数释放掉相应的中断。 如果中断不是共享的,那么 free_irq 会删除中断处理函数并且禁止中断

void free_irq(unsigned int irq,void *dev)
  • 参数
    • irq:要释放的中断号
    • dev:如果中断设置为共享(IRQF_SHARED)的话, 此参数用来区分具体的中断。 共享中断只有在释放最后中断处理函数的时候才会被禁止掉。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在Docker中运行微服务注册中心Eureka

1、Docker简介&#xff1a; 作为开发者&#xff0c;经常遇到一个头大的问题&#xff1a;“在我机器上能运行”。而将SpringCloud微服务运行在Docker容器中&#xff0c;避免了因环境差异带来的兼容性问题&#xff0c;能够有效的解决此类问题。 通过Docker&#xff0c;开发者可…

角色动画——RootMotion全解

1. Unity(2022)的应用 由Animtor组件控制 在Animation Clip下可进行详细设置 ​ 官方文档的介绍(Animation选项卡 - Unity 手册) 上述动画类型在Rag选项卡中设置: Rig 选项卡上的设置定义了 Unity 如何将变形体映射到导入模型中的网格&#xff0c;以便能够将其动画化。 对于人…

Linux驱动开发——LED驱动开发

文章目录 1 概述1.1 说明 2 基础知识2.1 地址映射2.1.1 ioremap函数2.1.2 iounmap函数 2.2 I/O内存访问函数2.2.1 读操作函数2.2.2 写操作函数 3 硬件原理图分析4 RK3568 GPIO驱动原理4.1 引脚复用设置4.2 引脚驱动能力配置4.3 GPIO输入输出设置4.4 GPIO引脚高低电平设置 5 实验…

【GeekBand】C++设计模式笔记5_Observer_观察者模式

1. “组件协作”模式 现代软件专业分工之后的第一个结果是“框架与应用程序的划分”&#xff0c;“组件协作”模式通过晚期绑定&#xff0c;来实现框架与应用程序之间的松耦合&#xff0c;是二者之间协作时常用的模式。典型模式 Template MethodStrategyObserver / Event 2.…

HarmonyOS/OpenHarmony 自定义弹窗页面级层级控制解决方案

关键词&#xff1a;CuntomDialog自定义弹窗、SubWindow子窗口、页面级、弹窗层级控制、鸿蒙、弹窗展示层级异常 问题存在API版本&#xff1a;API10 - API12&#xff08;该问题已反馈&#xff0c;期望后续官方能增加页面级控制能力&#xff09; 在正常的鸿蒙app开发过程中&…

aws(学习笔记第二课) AWS SDK(node js)

aws(学习笔记第二课) 使用AWS SDK&#xff08;node js&#xff09; 学习内容&#xff1a; 使用AWS SDK&#xff08;node js&#xff09; 1. AWS SDK&#xff08;node js&#xff09; AWS支持多种SDK开发(除了AWS CLI&#xff0c;还支持其他的SDK) AndroidPythonNode.js(Javas…

约数个数约数之和

好久没发文章了.......不过粉丝还是一个没少...... 今天来看两道超级恶心的数论题目&#xff01; No.1 约数个数 No.2 约数之和 先来看第一道&#xff1a;约数个数 题目描述 给定 n 个正整数 ai​,请你输出这些数的乘积的约数个数,答案对 10^97 取模 输入格式 第一行包含…

五种IO模型与阻塞IO

一、前言 在网络中通信的本质其实是网络中的两台主机的进程间进行通信&#xff0c;而进程通信的本质就是IO。 IO分为输入&#xff08;input&#xff09;和输出&#xff08;output&#xff09;站在进程的角度讲&#xff0c;进程出去数据为输出&#xff0c;外部数据进入进程为输…

YOLOv8 基于NCNN的安卓部署

YOLOv8 NCNN安卓部署 前两节我们依次介绍了基于YOLOv8的剪枝和蒸馏 本节将上一节得到的蒸馏模型导出NCNN&#xff0c;并部署到安卓。 NCNN 导出 YOLOv8项目中提供了NCNN导出的接口&#xff0c;但是这个模型放到ncnn-android-yolov8项目中你会发现更换模型后app会闪退。原因…

[ComfyUI]Flux:太强了!任意扩图神器,小红书极致逼真风格出游打卡写实风

随着人工智能技术的不断发展&#xff0c;图像生成与反推技术已经成为了AI领域的一大热点。今天&#xff0c;我们就来为大家详细介绍一款由ComfyUI团队开发的超强图像反推工具——Flux&#xff0c;以及如何使用它实现任意扩图和极致逼真风格出游打卡写实风。 一、Flux&#xff…

【AI大模型】使用Embedding API

一、使用OpenAI API 目前GPT embedding mode有三种&#xff0c;性能如下所示&#xff1a; 模型每美元页数MTEB得分MIRACL得分text-embedding-3-large9,61554.964.6text-embedding-3-small62,50062.344.0text-embedding-ada-00212,50061.031.4 MTEB得分为embedding model分类…

centos7安装配置nginx

先安装依赖 安装依赖之前最好先执行下update yum update yum install gcc gcc-c pcre pcre-devel zlib zlib-devel openssl openssl-devel -y cd /usr/local/nginx wget http://nginx.org/download/nginx-1.18.0.tar.gz tar -zxvf nginx-1.18.0.tar.gz cd /usr/local/ngi…

双非本 985 硕,上岸快手大模型算法岗!

最近已有不少大厂都在秋招宣讲&#xff0c;也有一些已在 Offer 发放阶段了。 节前&#xff0c;我们邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学。 针对新手如何入门算法岗、该如何准备面试攻略、面试常考点、大模型技术趋势、算法项目落地经验分享等热门话题进行…

高校校园交友系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;用户管理&#xff0c;基础数据管理&#xff0c;论坛管理&#xff0c;公告信息管理&#xff0c;轮播图信息管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;用户&#…

反调试—1

IsDebuggerPresent() CheckRemoteDebuggerPresent() 其内部实际调用NtQueryInformationProcess() bool _stdcall ThreadCall() {while (true){BOOL pbDebuggerPresent FALSE;CheckRemoteDebuggerPresent(GetCurrentProcess(), &pbDebuggerPresent);if (pbDebuggerPres…

fiddler抓包18-2_导出jmeter、postman脚本(带请求头)

课程大纲 1. Fiddler导出请求为curl脚本 选中请求&#xff0c;“文件” - “导出会话” - “选中的会话” - “cURL Script”。 2. 导入jmeter ① 复制curl脚本。 ② 打开jmeter&#xff0c;“工具” - “import from cURL”&#xff0c;粘贴脚本&#xff0c;勾选“Add cooki…

二分查找一>寻找峰值

1.题目&#xff1a; 2.解析&#xff1a; 暴力遍历代码&#xff1a;O(N),由于该题数据很少所以可以通过 暴力遍历&#xff1a;O(N),由于该题数据很少所以可以通过int index 0;for(int i 1; i < nums.length-1; i) {//某段区域内一直递增&#xff0c;更新就indexif(nums[i]…

红黑树学习

红黑树: k v 方式 用在哪里&#xff1a; 1.hash 强查找的过程&#xff1a; 1.rbtree 2.hash 3.b/b tree 4.链表 红黑树&#xff1a; 1.每个结点是红的或者是黑的 2.根结点是黑的 3.每个叶子结点是黑的 4.如果一个结点是红的&#xff0c;则它的两个儿子是黑的 5.对每个节点&…

性能学习5:性能测试的流程

一.需求分析 二.性能测试计划 1&#xff09;测什么&#xff1f; - 项目背景 - 测试目的 - 测试范围 - ... 2&#xff09;谁来测试 - 时间进度与分工 - 交付清单 - ... 3&#xff09;怎么测 - 测试策略 - ... 三.性能测试用例 四.性能测试执行 五.性能分析和调优 六…

ElasticSearch备考 -- Search across cluster

一、题目 配置两个集群&#xff0c;集群名称为my-application-01、my-application-02&#xff0c;导入es自带Sample flight data数据集&#xff0c;配置扩集群检索&#xff0c;查询数据 二、思考 准备工作有两个集群&#xff0c;并需要对集群配置角色中增加 remote_cluster_cl…