Cortex-A7:简单中断处理(不可嵌套中断)机制
0 参考资料
ARM Cortex-A(armV7)编程手册V4.0.pdf
ARM体系结构与编程第2版
1 前言
Cortex-M系列内核MCU中断硬件原生支持嵌套中断,开发者不需要为了实现嵌套中断而进行额外的工作。但在Cortex-A7中,硬件原生是不支持嵌套中断的,这从Cortex-A7中断向量表中仅为外部中断设置了一个中断向量可以看出。本文介绍Cortex-A7的简单的中断处理机制,即不可嵌套中断的处理机制。
2 Cortex-A7:简单中断处理(不可嵌套中断)机制
2.1 概述
简单的中断处理机制意味着在中断发生之后,将会屏蔽掉同类中断,如果在响应中断期间有多个中断请求需要处理,则会按照优先级顺序(取决于中断服务函数写法)依次处理。这样的设计下无法使高抢占优先级的中断抢占低抢占优先级中断执行,也就无法实现中断嵌套。
2.2 中断处理步骤
简单中断处理步骤可以概括为以下5步。
2.2.1 硬件保存上下文
当发生外部中断,硬件将会自动执行以下几个操作:
(1)将当前模式下(中断发生前)的PC(程序计数器)后面第2条指令地址保存到IRQ模式下的LR(链接寄存器)
(2)将当前模式下CPSR(当前程序状态寄存器)保存到到IRQ模式的SPSR(程序状态保存寄存器)
(3)修改CPSR(当前程序状态寄存器),将I位设置为1屏蔽IRQ,同时将模式设置为IRQ模式切换到IRQ模式
(4)将PC(程序计数器)设置为IRQ的中断向量
以上步骤可以用如下示意图描述:
2.2.2 跳转到中断服务函数
(1)中已经将IRQ中断向量传入PC(程序计数器),下一条指令则开始执行中断服务函数
2.2.3 中断服务函数保存上下文
中断服务函数应当将会被修改的寄存器入栈,在中断服务函数完成后将保存的寄存器出栈,恢复原来的值。这里需要注意,如果是使用汇编语言编写中断服务函数,开发者应该自行编写出入栈操作语句。如果是使用C语言编写中断服务函数,则编译器会完成寄存器的出入栈操作。
以上步骤可以用如下示意图描述:
2.2.4 根据中断源执行相应的中断服务函数
不同于Cortex-M的所有外部中断都有独立的中断向量,Cortex-A7的中断处理程序需要自行判断中断源,并调用相应的中断服务函数。
2.2.5 从中断处理程序中返回
(1)将SPSR_IRQ(IRQ模式下的SPSR寄存器)复制到CPSR(当前程序状态寄存器),将系统状态恢复到中断发生前的状态
(2)将IRQ模式下的LR(链接寄存器)内容复制到PC(程序计数器)。下一条指令便会执行中断打断点的下一条指令,恢复现场。
以上步骤可以用如下示意图描述:
2.2.6 简单的IRQ中断服务函数实例
IRQ_Handler
PUSH {r0-r3, r12, lr} @ Store AAPCS registers and LR onto the IRQ mode stack
BL @ identify_and_clear_source
BL @ C-irq_handler
POP {r0-r3, r12, lr} @ Restore registers and
SUBS pc, lr, #4 @ return from exception using modified LR
操作如下:
(1)将LR(程序链接寄存器)及可能破坏的寄存器入栈
(2)识别中断源
(3)跳转到相应的中断服务函数
(4)将保存的寄存器出栈
(5)将LR(链接寄存器)值-4,然后写入PC(程序计数器)
这里之所以需要将LR(链接寄存器)值-4再写入PC原因如下:
当IRQ或FIQ中断产生时,PC(程序计数器)指向当前指令后面第3条指令(对于ARM指令来说,它指向当前指令地址+12字节的位置,对于Thumb指令来说,它指向当前指令地址加6个字节的位置)。ARM指令下,当IRQ和FIQ中断发生时,处理器会将值(PC-4)保存到异常模式下的LR(链接寄存器)中,这时PC-4即指向当前指令后的第2条指令。因此返回操作中再将PC-4就可以得到当前指令后的第一条指令,从而实现现场恢复。
说明:
3 总结
(1)以上例子同样适用于FIQ中断。
(2)IRQ中断的关键操作是保存了中断打断点后面第2条指令地址到IRQ模式的LR(链接寄存器),使得中断打断后能够恢复现场。
(3)从简单中断处理机制可以看出,由于进入IRQ模式时IRQ一直处于屏蔽状态,因此是不可能做到中断嵌套。同时又由于LR(链接寄存器)在每次进入IRQ模式前会硬件自动设置为打断点后面第2条指令地址,即使我们人为进入使能IRQ的IRQ模式,假如我们在将LR(链接寄存器)入栈之前触发了一次IRQ中断后由于LR(链接寄存器)被修改,第一个IRQ将无法返回第一次打断点,一直执行被第二次中断打断后的断点到退出IRQ模式中间的语句,陷入死循环。
相关文章:

Cortex-A7:简单中断处理(不可嵌套中断)机制
0 参考资料 ARM Cortex-A(armV7)编程手册V4.0.pdf ARM体系结构与编程第2版1 前言 Cortex-M系列内核MCU中断硬件原生支持嵌套中断,开发者不需要为了实现嵌套中断而进行额外的工作。但在Cortex-A7中,硬件原生是不支持嵌套中断的,这从Cortex-A…...
k8s HPA
水平自动扩容和缩容HPA HPA全称Horizontal Pod Autoscaler,即pod水平自动伸缩。HPA可以基于CPU利用率对replication controller、deployment和replicaset中的pod数量进行自动扩缩容(除了CPU利用率,也可以基于其他应用程序提供的度量指标cust…...

5G移动网络运维实验(训)室解决方案
随着第五代移动通信技术(5G)的快速普及和工业互联网的迅猛发展,全球制造业正面临着前所未有的深刻变革。5G技术凭借其超高的传输速率、极低的延迟以及大规模的连接能力,为工业自动化、智能制造等领域带来了革命性的技术支持。为了…...

单片机学习笔记
一、单片机帝国的诞生与发展 1.1 单片机的基本概念 单片机是一种集成电路芯片,采用超大规模的集成电路把具有数据处理功能的中央处理器存储器、输入输出端口、外围电路和相关外设集成在一块硅片上构成一个小而完整的微型计算机系统。 一般而言,单片机也…...

SpringBoot中@Value获取值和@ConfigurationProperties获取值用法及比较
SpringBoot中Value获取值和ConfigurationProperties获取值用法及比较 更新时间:2024年08月08日 09:41:48 作者:岳轩子 在Spring Boot中,Value注解是一个非常有用的特性,它允许我们将外部的配置注入到我们的Bean中,ConfigurationProperties用于将配置文件…...

执行任务赚积分
题目描述 现有N个任务需要处理,同一时间只能处理一个任务,处理每个任务所需要的时间固定为1。 每个任务都有最晚处理时间限制和积分值,在最晚处理时间点之前处理完成任务才可获得对应的积分奖励。 可用于处理任务的时间有限,请问…...
使用TLS解决Docker API暴露2375端口的问题
问题起因 由于本人开发环境是在 Windows,开发完成后需要使用 Dockerfile 打包镜像,这个过程需要有一个 Docker 服务完成,Windows 安装 Docker 会影响到很多环境,我又不想本地开虚拟机使用 Docker,于是我就索性使用服务…...
Pyspark中catalog的作用与常用方法
文章目录 Pyspark catalog用法catalog 介绍cache 缓存表uncache 清除缓存表cleanCache 清理所有缓存表createExternalTable 创建外部表currentDatabase 返回当前默认库tableExists 检查数据表是否存在,包含临时视图databaseExists 检查数据库是否存在dropGlobalTemp…...

聚焦2024数博会|与天空卫士一起探索AI与数据安全的融合应用
中国国际大数据产业博览会(简称数博会),是全球首个以大数据为主题的博览会,自2015年创办以来,经过多年的深厚沉淀,数博会已发展成为国际知名、引领前沿趋势的专业展示合作平台。 2024年8月28日至30日&#…...

实战docker第二天——cuda11.8,pytorch基础环境docker打包
在容器化环境中打包CUDA和PyTorch基础环境,可以将所有相关的软件依赖和配置封装在一个Docker镜像中。这种方法确保了在不同环境中运行应用程序时的一致性和可移植性: Docker:提供了容器化技术,通过将应用程序及其所有依赖打包在一…...

企业数字化转型的利器:RFID资产管理系统
在当今数字化时代,资产管理的效率和精确度对企业的成功至关重要。常达智能物联的RFID资产管理系统,凭借其高效、智能的管理方式,成为众多企业在数字化转型中的关键工具。 RFID资产管理系统的核心优势 一、精准资产定位与追踪 常达智能物联的…...

matplotlib中文乱码问题
在使用Matplotlib进行数据可视化的过程中,经常会遇到中文乱码的问题。显示乱码是由于编码问题导致的,而matplotlib 默认使用ASCII 编码,但是当使用pyplot时,是支持unicode编码的,只是默认字体是英文字体,导…...

提高开发效率的实用工具库VueUse
VueUse中文网:https://vueuse.nodejs.cn/ 使用方法 安装依赖包 npm i vueuse/core单页面使用(useThrottleFn举例) import { useThrottleFn } from "vueuse/core"; // 表单提交 const handleSubmit useThrottleFn(() > {// 具…...

【数据结构】你真的学会了二叉树了吗,来做一做二叉树的算法题及选择题
文章目录 1. 二叉树算法题1.1 单值二叉树1.2 相同的树1.3 另一棵树的子树1.4 二叉树的遍历1.5 二叉树的构建及遍历 2. 二叉树选择题3. 结语 1. 二叉树算法题 1.1 单值二叉树 https://leetcode.cn/problems/univalued-binary-tree/description/ 1.2 相同的树 https://leetco…...
压力测试知识总结
压力测试知识总结 引言 随着信息技术的飞速发展,软件系统在各个行业中的应用越来越广泛,其稳定性和可靠性成为用户关注的焦点。压力测试作为软件测试中的一种重要方法,对于确保软件在高负载环境下的稳定性和可靠性具有重要意义。本文将从压…...

@import导入样式以及scss变量应用与static目录
import函数:使用import语句可以导入外联样式表,import后跟需要导入的外联样式表的相对路径,用;表示语句结束。 static目录:就是无论你有没有在这个目录里用过,它都会进行编译打包 import函数应用:先在在项目里创建一个common 目录, 目录里面分别创建css,…...

分类中的语义一致性约束:助力模型优化
前言 这里介绍一篇笔者在去年ACL上发表的一篇文章,使用了空间语义约束来提高多模态分类的效果,类似的思路笔者也在视频描述等方向进行了尝试,也都取得了不错的效果。这种建模时对特征进行有意义的划分和约束对模型还是很有帮助的,…...
前端框架介绍
前端框架是Web开发中不可或缺的工具,它们通过提供结构化的开发方式、模块化组件、响应式设计以及高效的性能优化,极大地简化了Web应用程序的开发过程。以下是对当前主流及新兴前端框架的详细介绍,这些框架不仅涵盖了广泛的功能,还…...

java基础知识-JVM知识详解
文章目录 一、JVM内存结构二、常见垃圾回收算法1. 标记-清除算法(Mark-Sweep Algorithm)2. 标记-整理算法(Mark-Compact Algorithm)3. 复制算法(Copying Algorithm)4. 分代收集算法(Generational Collection)5. 增量收集算法(Incremental Collection)6. 并行收集算法…...

流动会场:以声学专利为核心的完美移动场地—轻空间
流动会场作为一种全新的活动场所选择,凭借其便捷的移动性与先进的声学设计,正逐渐成为各类演出、会议和文化活动的热门场地。其独特之处不仅在于搭建速度快、灵活性高,还在于其核心技术——声学专利的强大支持。 专利声学设计,打造…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...

在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...

ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...

JVM 内存结构 详解
内存结构 运行时数据区: Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器: 线程私有,程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 每个线程都有一个程序计数…...