当前位置: 首页 > 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. 并行收集算法…...

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

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

springboot 百货中心供应链管理系统小程序

一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...

el-switch文字内置

el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器&#xff08;ADC&#xff09;&#xff0c;支持8kHz~96kHz采样率&#xff0c;集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器&#xff0c;适用于高保真音频采集场景。 2. 核心特性 高精度&#xff1a;24位分辨率&#xff0c…...

CSS设置元素的宽度根据其内容自动调整

width: fit-content 是 CSS 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...

MySQL 8.0 事务全面讲解

以下是一个结合两次回答的 MySQL 8.0 事务全面讲解&#xff0c;涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容&#xff0c;并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念&#xff08;ACID&#xff09; 事务是…...

深入浅出Diffusion模型:从原理到实践的全方位教程

I. 引言&#xff1a;生成式AI的黎明 – Diffusion模型是什么&#xff1f; 近年来&#xff0c;生成式人工智能&#xff08;Generative AI&#xff09;领域取得了爆炸性的进展&#xff0c;模型能够根据简单的文本提示创作出逼真的图像、连贯的文本&#xff0c;乃至更多令人惊叹的…...

离线语音识别方案分析

随着人工智能技术的不断发展&#xff0c;语音识别技术也得到了广泛的应用&#xff0c;从智能家居到车载系统&#xff0c;语音识别正在改变我们与设备的交互方式。尤其是离线语音识别&#xff0c;由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力&#xff0c;广…...

Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、Spring MVC与MyBatis技术解析 一、第一轮基础概念问题 1. Spring框架的核心容器是什么&#xff1f;它的作用是什么&#xff1f; Spring框架的核心容器是IoC&#xff08;控制反转&#xff09;容器。它的主要作用是管理对…...