当前位置: 首页 > news >正文

中断的硬件框架

往期内容

本专栏往期内容,interrtupr子系统:

  1. 深入解析Linux内核中断管理:从IRQ描述符到irq domain的设计与实现
  2. Linux内核中IRQ Domain的结构、操作及映射机制详解
  3. 中断描述符irq_desc成员详解
  4. Linux 内核中断描述符 (irq_desc) 的初始化与动态分配机制详解

pinctrl和gpio子系统专栏:

  1. 专栏地址:pinctrl和gpio子系统

  2. 编写虚拟的GPIO控制器的驱动程序:和pinctrl的交互使用

    – 末片,有专栏内容观看顺序

input子系统专栏:

  1. 专栏地址:input子系统
  2. input角度:I2C触摸屏驱动分析和编写一个简单的I2C驱动程序
    – 末片,有专栏内容观看顺序

I2C子系统专栏:

  1. 专栏地址:IIC子系统
  2. 具体芯片的IIC控制器驱动程序分析:i2c-imx.c-CSDN博客
    – 末篇,有专栏内容观看顺序

总线和设备树专栏:

  1. 专栏地址:总线和设备树
  2. 设备树与 Linux 内核设备驱动模型的整合-CSDN博客
    – 末篇,有专栏内容观看顺序

img

1.中断路径上的3个部件

● 中断源

  • 中断源指引发中断信号的硬件模块,如GPIO、定时器、串口(UART)、DMA控制器等。这些模块都有各自的寄存器,可以设置中断相关的参数,例如:

    • 使能中断:启用或禁用该模块的中断功能。
    • 中断状态:检查该模块是否发生了中断。
    • 中断类型:设置中断的触发条件,例如上升沿触发、下降沿触发或电平触发等。
  • 中断源可以根据其设置的状态来决定是否向中断控制器发送中断请求信号。

● 中断控制器

  • 中断控制器汇集所有中断源的信号,将其发送至CPU。中断控制器可以:

    • 设置优先级:为不同的中断源设置优先级,以便在多重中断同时发生时,确定先响应哪个中断。当有多个中断源同时申请中断时,CPU会根据中断源的轻重缓急进行裁决,优先响应更加紧急的中断源
    • 向CPU发出中断信号:中断控制器根据优先级和屏蔽设置向CPU发送中断请求信号。CPU通过读取中断控制器寄存器来判断哪个中断源需要响应。
  • 中断控制器的实现因芯片平台而异,例如:

    • STM32F103 使用 NVIC(嵌套向量中断控制器)来处理中断。
    • ARM9 平台中通常由芯片厂商设计的特定中断控制器。
    • Cortex A7 采用 GIC(通用中断控制器),具有更加复杂的中断管理功能。

● CPU

  • CPU会在每条指令执行后检查是否有中断请求。
  • CPU内部的寄存器提供了中断的总开关,可以通过这些寄存器来使能或禁用中断,从而实现对中断响应的控制。

img

2.STM32F103的GPIO中断

对于GPIO中断,STM32F103又引入了External interrupt/event controller (EXTI)。用来设置GPIO的中断类型,如下图:

对于GPIO中断,STM32F103又引入了External interrupt/event controller (EXTI)。用来设置GPIO的中断类型,如下图:

img

EXTI可以给NVIC提供16个中断信号:EXTI0~EXTI15。那么某个EXTIx,它来自哪些GPIO呢?这需要设置GPIO控制器。

2.1 GPIO控制器

STM32F103的GPIO控制器中有AFIO_EXTICR1~AFIO_EXTICR4一共4个寄存器

名为:External interrupt configuration register,外部中断配置寄存器。

用来选择某个外部中断EXTIx的中断源,示例如下:

img

注意:从上图可知,EXTI0只能从PA0、……、PG0中选择一个,这也意味着PA0、……、PG0中只有一个引脚可以用于中断。这跟其他芯片不一样,很多芯片的任一GPIO引脚都可以同时用于中断。

img

2.2 EXTI

在GPIO控制器中,可以设置某个GPIO引脚作为中断源,给EXTI提供中断信号。但是,这个中断的触发方式是怎么的?高电平触发、低电平触发、上升沿触发、下降沿触发?这需要进一步设置。EXTI框图如下:

img

沿着上面框图中的红线,我们要设置:

  • 选择哪些GPIO可以发出中断(EXITmux)
  • Falling trigger selection register:是否选择下降沿触发(EventTrigger)
  • Rising trigger selection register:是否选择上升沿触发(EventTrigger)
  • Interrupt mask register:是否屏蔽中断,允许某个EXTI中断(Masking)

当发生中断时,可以读取下列寄存器判断是否发生了中断、发生了哪个中断:

  • Pending reqeust register

要使用EXTI,流程如下:

img

翻译如下:

  • 配置EXTI_IMR:允许EXTI发出中断
  • 配置EXTI_RTSR、EXTI_FTSR,选择中断触发方式
  • 配置NVIC中的寄存器,允许NVIC把中断发给CPU

2.3 NVIC

多个中断源汇聚到NVIC,NVIC的职责就是从多个中断源中取出优先级最高的中断,向CPU发出中断信号。处理中断时,程序可以写NVIC的寄存器,清除中断。涉及的寄存器:

img

我们暂时只需要关注:ISER(中断设置使能寄存器)、ICPR(中断清除挂起寄存器)。要注意的是,这些寄存器有很多个,比如ISER0、ISER1等等。里面的每一位对应一个中断。ISER0中的bit0对应异常向量表中的第16项(向量表从第0项开始),如下图:img

2.4 CPU

cortex M3/M4处理器内部有这几个寄存器:

2.4.1 PRIMASK

img

把PRIMASK的bit0设置为1,就可以屏蔽所有优先级可配置的中断。
可以使用这些指令来设置它:

CPSIE I  ; 清除PRIMASK,使能中断
CPSID I  ; 设置PRIMASK,禁止中断或者:
MOV R0, #1
MSR  PRIMASK R0  ; 将1写入PRIMASK禁止所有中断MOV R0, #0
MSR PRIMASK, R0  ; 将0写入PRIMASK使能所有中断

2.4.2 FAULTMASK

在这里插入图片描述

FAULTMASK和PRIMASK很像,它更进一步,出来一般的中断外,把HardFault都禁止了。
只有NMI可以发生。
可以使用这些指令来设置它:

CPSIE F  ; 清除FAULTMASK
CPSID F  ; 设置FAULTMASK或者:
MOV R0, #1
MSR  FAULTMASK R0  ; 将1写入FAULTMASK禁止中断MOV R0, #0
MSR FAULTMASK, R0  ; 将0写入FAULTMASK使能中断

2.4.3 BASEPRI

img

BASEPRI用来屏蔽这些中断:它们的优先级,其值大于或等于BASEPRI。
可以使用这些指令来设置它:

MOVS R0, #0x60
MSR BASEPRI, R0   ; 禁止优先级在0x60~0xFF间的中断MRS R0, BASEPRI   ; 读取BASEPRIMOVS R0, #0
MSR BASEPRI, R0    ; 取消BASEPRI屏蔽

3.STM32MP157的GPIO中断

STM32MP157的GPIO中断在硬件上的框架,跟STM32F103是类似的。它们的中断控制器不一样,STM32MP157中使用的是GIC:

img

3.1 GPIO控制器

对于STM32MP157,除了把GPIO引脚配置为输入功能外,GPIO控制器里没有中断相关的寄存器。

3.2 EXTI

GPIO引脚可以向CPU发出中断信号,所有的GPIO引脚都可以吗?不是的,需要在EXTI控制器中设置、选择。GPIO引脚触发中断的方式是怎样的?高电平触发、低电平触发、上升沿触发、下降沿触发?这需要进一步设置。这些,都是在EXTI中配置,EXTI框图如下:img

3.2.1 设置EXITmux

选择哪些GPIO可以发出中断。只有16个EXTI中断,从EXTI0~EXTI15;每个EXTIx中断只能从PAx、PBx、……中选择某个引脚,如下图所示:

img

注意:从上图可知,EXTI0只能从PA0、……中选择一个,这也意味着PA0、……中只有一个引脚可以用于中断。这跟其他芯片不一样,很多芯片的任一GPIO引脚都可以同时用于中断。

通过EXTI_EXTICR1等寄存器来设置EXTIx的中断源是哪个GPIO引脚,入下图所示:

img

3.2.2 设置Event Trigger

设置中断触发方式:

img

3.2.3 设置Masking

允许某个EXTI中断:

img

3.2.4 查看中断状态、清中断

img

3.3 GIC

ARM体系结构定义了通用中断控制器(GIC),该控制器包括一组用于管理单核或多核系统中的中断的硬件资源。GIC提供了内存映射寄存器,可用于管理中断源和行为,以及(在多核系统中)用于将中断路由到各个CPU核。它使软件能够屏蔽,启用和禁用来自各个中断源的中断,以(在硬件中)对各个中断源进行优先级排序和生成软件触发中断。它还提供对TrustZone安全性扩展的支持。GIC接受系统级别中断的产生,并可以发信号通知给它所连接的每个内核,从而有可能导致IRQ或FIQ异常发生。

3.4 GIC

CPU的CPSR寄存器中有一位:I位,用来使能/禁止中断。

img

可以使用以下汇编指令修改I位:

  CPSIE I  ; 清除I位,使能中断CPSID I  ; 设置I位,禁止中断

4.IMX6ULL的GPIO中断

IMX6ULL的GPIO中断在硬件上的框架,跟STM32MP157是类似的。IMX6ULL中没有EXTI控制器,对GPIO的中断配置、控制(stm32MP157:EXIT设置EXITx的某一个引脚作为中断源,设置其中断的触发方式,设置EXITx能否中断 >>> 在GPIO控制器里配置中断引脚、中断引脚触发方式、使能GPIO中断),都在GPIO模块内部实现:

img

img

4.1 GPIO控制器

4.1.1 配置GPIO中断

每组GPIO中都有对应的GPIOx_ICR1、GPIOx_ICR2寄存器(interrupt configuration register )。每个引脚都可以配置为中断引脚,并配置它的触发方式:

img

4.1.2 使能GPIO中断

img

4.1.3 判断中断状态、清中断

img

4.2 GIC

ARM体系结构定义了通用中断控制器(GIC),该控制器包括一组用于管理单核或多核系统中的中断的硬件资源。GIC提供了内存映射寄存器,可用于管理中断源和行为,以及(在多核系统中)用于将中断路由到各个CPU核。它使软件能够屏蔽,启用和禁用来自各个中断源的中断,以(在硬件中)对各个中断源进行优先级排序和生成软件触发中断。它还提供对TrustZone安全性扩展的支持。GIC接受系统级别中断的产生,并可以发信号通知给它所连接的每个内核,从而有可能导致IRQ或FIQ异常发生。

4.3 CPU

CPU的CPSR寄存器中有一位:I位,用来使能/禁止中断。可以使用以下汇编指令修改I位:img

  CPSIE I  ; 清除I位,使能中断CPSID I  ; 设置I位,禁止中断

相关文章:

中断的硬件框架

往期内容 本专栏往期内容,interrtupr子系统: 深入解析Linux内核中断管理:从IRQ描述符到irq domain的设计与实现Linux内核中IRQ Domain的结构、操作及映射机制详解中断描述符irq_desc成员详解Linux 内核中断描述符 (irq_desc) 的初始化与动态分…...

数据备份策略:企业防御的关键

数据备份是保护数据免受网络攻击的重要步骤。在从恶意软件或勒索软件攻击中恢复时,公司可以使用保存的备份将其恢复到之前的状态。但是,为了确保数据的完全安全,任何公司的备份策略都应该在其总体策略中包含多种解决方案。 根据关于创建、消…...

Baget 私有化nuget

Baget下载 1、下载运行 方法一:cmd运行 dotnet BaGet.dll --urls http://*:8002 http://localhost:8002 方法二:bat脚本运行Baget 创建Start.bat dotnet BaGet.dll --urls http://*:8002 运行Start.bat 方法三:部署成Window服务 NSSM部…...

前端函数的参数都有哪些?

在前端开发中,函数的分类可以根据不同的标准进行。以下是一些常见的函数分类方式,并附有相应的例子: 按传递方式分类: 按值传递:JavaScript 中的基本类型(如数字、字符串、布尔值)都是按值传递的…...

【CSS】什么是BFC?

块级格式化上下文(Block Formatting Context,简称BFC)是CSS布局中的一种重要概念,它决定了块级盒子如何在其容器内排列,以及浮动元素对其周围元素的影响。理解BFC可以帮助解决许多常见的网页布局问题,比如清…...

HCIP小型园区网拓扑实验

1.拓扑以及需求 2.需求分析 需要的核心技术 1、虚拟局域网(VLAN) 2、链路聚合(E-trunk) 3、多生成树协议(MSTP) 4、VLANIF三层逻辑接口 5、虚拟路由冗余协议(VRRP) 6、动态主…...

GRR测量系统的重复性和再现性

GRR(GaugeRepeatabilityandReproducibility)即测量系统的重复性和再现性,是用于评估测量系统性能的一个重要指标。以下是对GRR的详细解释: 一、定义 • 重复性(Repeatability):在相同条件下&…...

133.鸿蒙基础01

鸿蒙基础 1.自定义构建函数1. 构建函数-[Builder ](/Builder )2. 构建函数-传参传递(单向)3. 构建函数-传递参数(双向)4. 构建函数-传递参数练习5. 构建函数-[BuilderParam ](/BuilderParam ) 传递UI 2.组件状态共享1. 状态共享-父子单向2. 状态共享-父子双向3. 状态共享-后代组…...

科技查新小知识

首先科技查新是什么? 科技查新是文献检索和情报调研相结合的情报研究工作,它以文献为基础,以文献检索和情报调研为手段,以检出结果为依据,通过综合分析,对查新项目的新颖性进行情报学审查,写出有…...

docker安装portainer

1、拉取镜像 docker pull portainer/portainer-ce:latest2、执行 docker run -d --restartalways --name portainer -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v /data/portainer/data:/data -v /data/portainer/public:/public portainer/portain…...

【Word2Vec】传统词嵌入矩阵训练方法

目录 1. Word2Vec 简介2. Word2Vec 的训练方法2.1 Skip-Gram模型2.2 CBOW(Continuous Bag of Words)模型 3. Word2Vec 中的词嵌入表示4. 训练过程中是否使用独热编码? 1. Word2Vec 简介 Word2Vec 是一种词嵌入模型,主要通过无监督…...

电脑不显示wifi列表怎么办?电脑不显示WiF列表的解决办法

有用户会遇到电脑总是不显示wifi列表的问题,但是不知道要怎么解决。随着无线网络的普及和使用,电脑无法显示WiFi列表的问题有时会让人感到困扰。电脑不显示WiFi列表是很常见的问题,但这并不意味着你无法连接到网络。不用担心,这个…...

详解 Dockerfile:从入门到实践

Docker 是一个开源的应用容器引擎,它允许开发者将应用及其依赖包打包到一个可移植的容器中,然后发布到任何流行的 Linux 机器或 Windows 机器上,也可以实现虚拟化。Dockerfile 是一个文本文件,其中包含了一系列命令,用…...

随机变量的概率分布

第 5 章——概率分布 5.2 随机变量的概率分布 【例5-1】 计算期望值、方差、标准差 【代码框5-1】 计算期望值、方差、标准差 import pandas as pd import numpy as np example5_1 = pd.read_csv(./pydata/example/chap05/example5_1.csv)# 计算期望值 mymean = sum...

Kafka生产者如何提高吞吐量?

批量发送:生产者可以配置 batch.size 参数,将多个消息打包成一个批次发送。这样可以减少网络通信的次数,提高吞吐量。inger.ms:设置 linger.ms 参数,可以让生产者在发送消息前等待一段时间,以便收集更多的消…...

mysql:解决windows启动失败无报错(或长时间未响应)

前言 遇到好多次在修改配置文件后,mysql无法启动的问题了,这里给出一个可能原因的解决方案。 由于mysql需要修改配置文件,所以我在winserver2012服务器上更改了配置文件my.ini mysql5.7配置文件默认地址:C:\ProgramData\MySQL\MyS…...

【山——回文判断】

题目 代码 #include <bits/stdc.h> using namespace std; bool check(int num) {string s to_string(num);int l 0, r s.size() - 1;while (l < r){if (l && s[l] - s[l - 1] < 0)return false;if (s[l] ! s[r--])return false;}if (l && l r…...

FPGA学习笔记#7 Vitis HLS 数组优化和函数优化

本笔记使用的Vitis HLS版本为2022.2&#xff0c;在windows11下运行&#xff0c;仿真part为xcku15p_CIV-ffva1156-2LV-e&#xff0c;主要根据教程&#xff1a;跟Xilinx SAE 学HLS系列视频讲座-高亚军进行学习 学习笔记&#xff1a;《FPGA学习笔记》索引 FPGA学习笔记#1 HLS简介及…...

欧几里得算法python

一、问题描述 求最大公约数 class Fraction:def __init__(self, a, b):self.a aself.b bx self.gcd(a, b)self.a / xself.b / xdef gcd(self, a, b):while b >0:r a % ba bb rreturn adef zgs(self, a, b):x self.gcd(a, b)return a / x * bdef __add__(self, other…...

【layui】echart的简单使用

图表类型切换&#xff08;柱形图和折线图相互切换&#xff09; <title>会员数据</title><div class"layui-card layadmin-header"><div class"layui-breadcrumb" lay-filter"breadcrumb"><a lay-href""&g…...

【JavaEE】-- HTTP

1. HTTP是什么&#xff1f; HTTP&#xff08;全称为"超文本传输协议"&#xff09;是一种应用非常广泛的应用层协议&#xff0c;HTTP是基于TCP协议的一种应用层协议。 应用层协议&#xff1a;是计算机网络协议栈中最高层的协议&#xff0c;它定义了运行在不同主机上…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

12.找到字符串中所有字母异位词

&#x1f9e0; 题目解析 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义&#xff1a; 若两个字符串包含的字符种类和出现次数完全相同&#xff0c;顺序无所谓&#xff0c;则互为…...

大学生职业发展与就业创业指导教学评价

这里是引用 作为软工2203/2204班的学生&#xff0c;我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要&#xff0c;而您认真负责的教学态度&#xff0c;让课程的每一部分都充满了实用价值。 尤其让我…...

Python 包管理器 uv 介绍

Python 包管理器 uv 全面介绍 uv 是由 Astral&#xff08;热门工具 Ruff 的开发者&#xff09;推出的下一代高性能 Python 包管理器和构建工具&#xff0c;用 Rust 编写。它旨在解决传统工具&#xff08;如 pip、virtualenv、pip-tools&#xff09;的性能瓶颈&#xff0c;同时…...

MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)

macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 &#x1f37a; 最新版brew安装慢到怀疑人生&#xff1f;别怕&#xff0c;教你轻松起飞&#xff01; 最近Homebrew更新至最新版&#xff0c;每次执行 brew 命令时都会自动从官方地址 https://formulae.…...

Bean 作用域有哪些?如何答出技术深度?

导语&#xff1a; Spring 面试绕不开 Bean 的作用域问题&#xff0c;这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开&#xff0c;结合典型面试题及实战场景&#xff0c;帮你厘清重点&#xff0c;打破模板式回答&#xff0c…...

安卓基础(Java 和 Gradle 版本)

1. 设置项目的 JDK 版本 方法1&#xff1a;通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分&#xff0c;设置 Gradle JDK 方法2&#xff1a;通过 Settings File → Settings... (或 CtrlAltS)…...

怎么开发一个网络协议模块(C语言框架)之(六) ——通用对象池总结(核心)

+---------------------------+ | operEntryTbl[] | ← 操作对象池 (对象数组) +---------------------------+ | 0 | 1 | 2 | ... | N-1 | +---------------------------+↓ 初始化时全部加入 +------------------------+ +-------------------------+ | …...