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

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. 并行收集算法…...

流动会场:以声学专利为核心的完美移动场地—轻空间

流动会场作为一种全新的活动场所选择,凭借其便捷的移动性与先进的声学设计,正逐渐成为各类演出、会议和文化活动的热门场地。其独特之处不仅在于搭建速度快、灵活性高,还在于其核心技术——声学专利的强大支持。 专利声学设计,打造…...

GEMM内核与MHA中的寄存器分配优化策略

1. GEMM内核与寄存器分配基础解析通用矩阵乘法(GEMM)作为深度学习计算的核心算子,其性能表现直接决定了神经网络训练和推理的效率。在硬件层面,寄存器分配的优劣往往能带来数倍的性能差异。我们以典型的GEMM运算C αAB βC为例&…...

FT231XQ USB串口桥接板设计解析与实战应用指南

1. 项目概述:从FT232R到FT231XQ的USB串口桥接板演进在嵌入式开发和硬件调试的日常工作中,一个可靠、小巧且功能清晰的USB转串口(UART)桥接板(Breakout Board, 简称BoB)几乎是工程师手边的标配工…...

Ubuntu经常安装软件

1、垃圾清理工具stacer sudo apt updatesudo apt install stacer apt cleanapt autocleanapt autoremove 2、类似与everything的工具Fsearcch 1sudo add-apt-repository ppa:christian-boxdoerfer/fsearch-stable 2sudo apt update 3sudo apt install fsearch (注&#xf…...

DeepSeek重复代码识别失效了?5个被90%团队忽略的AST解析盲区及修复清单

更多请点击: https://codechina.net 第一章:DeepSeek代码重复检测失效的真相与影响 DeepSeek-R1 模型在代码理解任务中表现出色,但其内置的代码重复检测机制在特定场景下存在系统性失效。根本原因在于模型对语义等价但语法结构差异显著的代…...

超低功耗电池电压监控电路设计:从LM324到LPV324的硬件方案优化

1. 项目概述与核心需求解析在捣鼓各种电池供电的电子设备时,无论是自己做的无线传感器节点、便携式小工具,还是给孩子改装的玩具,有一个问题总是绕不开:你怎么知道电池快没电了?总不能每次都等到设备彻底罢工&#xff…...

Autodesk Fusion 360在Linux上的技术实现与性能优化深度解析

Autodesk Fusion 360在Linux上的技术实现与性能优化深度解析 【免费下载链接】Autodesk-Fusion-360-for-Linux This is a project, where I give you a way to use Autodesk Fusion 360 on Linux! 项目地址: https://gitcode.com/gh_mirrors/au/Autodesk-Fusion-360-for-Linu…...

从API Key管理视角看Taotoken平台的安全与审计功能

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 从API Key管理视角看Taotoken平台的安全与审计功能 对于依赖大模型API进行开发的团队而言,API Key的管理与安全是项目稳…...

终极指南:Windows 10完美安装PL2303驱动,解决老旧USB转串口芯片兼容性问题

终极指南:Windows 10完美安装PL2303驱动,解决老旧USB转串口芯片兼容性问题 【免费下载链接】pl2303-win10 Windows 10 driver for end-of-life PL-2303 chipsets. 项目地址: https://gitcode.com/gh_mirrors/pl/pl2303-win10 你是否还在为Windows…...

AutoPentest:面向红队的渗透测试决策引擎架构解析

1. 这不是又一个“自动化扫描器”,而是一套能替你做决策的渗透测试工作流引擎AutoPentest这个名字,第一眼容易让人联想到Nmap加个for循环、或者Burp Suite里点几下Intruder——但实际用过的人很快会意识到:它根本不在同一个维度上。我第一次在…...

Linux命令:perf

perf 命令 基本介绍 perf(Performance Counters for Linux)是 Linux 系统中用于性能分析的强大工具套件。它基于内核性能计数器(PMC),可以分析 CPU 使用率、内存访问、缓存命中率、分支预测等硬件级性能指标&#xff0…...