Cortex-A7:ARM官方推荐的嵌套中断实现机制

news2024/11/13 8:03:30

0 参考资料

ARM Cortex-A(armV7)编程手册V4.0.pdf
ARM体系结构与编程第2版

1 前言

Cortex-M系列内核MCU中断硬件原生支持嵌套中断,开发者不需要为了实现嵌套中断而进行额外的工作。但在Cortex-A7中,硬件原生是不支持嵌套中断的,这从Cortex-A7中断向量表中仅为外部中断设置了一个中断向量可以看出。本文介绍ARM官方推荐使用的嵌套中断实现机制,以通过软件方式在Cortex-A7上实现中断嵌套。

2 ARM官方推荐的嵌套中断实现机制

2.1 概述

什么是中断嵌套?

中断嵌套是指中断系统正在执行一个中断服务时,有另一个优先级更高的中断提出中断请求,这时会暂时中止当前正在执行的级别较低的中断源的服务程序,去处理级别更高的中断源,待处理完毕,再返回到被中断了的中断服务程序继续执行的过程。

如何在Cortex-A7上实现嵌套中断?

Cortex-A7硬件原生不支持嵌套中断,按照ARM官方说法实现嵌套中断需要软件实现。

在Cortex-A7上实现嵌套中断的核心思想是什么?

在Cortex-A7上实现嵌套中断的核心思想就是在进入IRQ模式后保存一些必要的信息,然后切换到使能IRQ的特权模式(如系统模式),使得新的中断能够被CPU响应。为了方便操作,一般在进入main函数前就切换到特权模式,在进入IRQ模式后我们切换到同一种特权模式。

为什么不直接在IRQ模式下使能IRQ实现嵌套中断即可?

之所以不能直接在IRQ模式下使能IRQ有很多原因,其中最重要的一个就是因为在下一个IRQ中断到来时会保存错误的CPSR(当前程序状态寄存器)到SPSR_irq(IRQ模式下的程序状态保存寄存器)中,会将中断前的现场破坏掉。

上述问题可以通过下图描述:
在这里插入图片描述

2.2 嵌套中断实现步骤

说明:
进入main函数前就处于系统模式(特权模式),进入IRQ时同样切换到系统模式。

2.2.1 保存上下文

在使能IRQ之前,我们需要保存上下文。包括返回地址及SPSR_irq(IRQ模式下的程序状态保存寄存器)。

2.2.2 确定中断源并失能中断

确定中断源,并将中断失能,防止产生新的同样的中断(对于嵌套中断来说,只有比当前抢占优先级更高的中断才能抢占执行)。

2.2.3 切换到失能IRQ模式的系统模式

系统模式可以操作一些特殊寄存器。这时IRQ仍然处于失能状态。

2.2.4 将LR入栈然后再使能IRQ

为什么需要将LR入栈:
第一次进入IRQ模式前处于系统模式,LR保存的是系统模式下的程序返回地址。为了防止进入系统模式后使用BL指令(BL指令会将LR的值设置为子函数下一条指令地址)破坏LR的值,需要将LR入栈保护起来。否则LR的值被修改后,IRQ执行完毕后将无法返回中断打断位置的下一条指令位置。
将LR入栈之后,便可以使能IRQ,这时便处于使能IRQ的系统模式。

2.2.5 根据中断源执行相应的中断服务函数

这时IRQ已经使能,如果发生了更高抢占优先级的中断,应该抢占当前中断执行。

2.2.6 执行完中断服务函数后将LR出栈

在完成了中断服务函数后首先进入失能IRQ的系统模式,将入栈的LR出栈。

2.2.7 恢复到IRQ模式并返回到中断打断位置

进入失能IRQ的IRQ模式,到这里来嵌套中断的工作宣告结束,根据SPSR_irq(IRQ模式下的程序状态保存寄存器)恢复中断打断前的CPSR(当前程序状态寄存器),将保存在IRQ模式的LR的值写入PC,返回中断打断位置。

2.2.8 ARM官方示例汇编程序

IRQ_Handler
		SUB lr, lr, #4
		SRSFD sp!, #0x1f 	@ use SRS to save LR_irq and SPSR_irq in one step onto the
							@ System mode stack
	CPS #0x1f 				@ Use CPS to switch to system mode
	PUSH {r0-r3, r12} 		@S tore remaining AAPCS registers on the System mode stack
	AND r1, sp, #4 			@ Ensure stack is 8-byte aligned. Store adjustment and
							@ LR_sys to stack
	SUB sp, sp, r1
	PUSH {r1, lr}
	BL 						@ identify_and_clear_source
	CPSIE i 				@ Enable IRQ with CPS
	BL C_irq_handler
	CPSID i 				@ Disable IRQ with CPS
	POP {r1, lr} 			@ Restore LR_sys
	ADD sp, sp, r1 			@ Unadjust stack
	POP {r0-r3, r12} 		@ Restore AAPCS registers
	RFEFD sp! 				@ Return using RFE from the System mode stack.

3 总结

(1)为实现嵌套中断必须通过切换到特权模式实现,且在main函数之前就设置为相同的特权模式(如系统模式)。
(2)开发者需要自行根据中断抢占优先级决定触发的中断是否有资格运行。
(3)使用软件方式实现嵌套中断相比非嵌套中断处理方式会多不少指令,效率有所下降。
(4)开发者需要自行根据中断嵌套规则,决定新中断是否有资格抢占执行。
(5)相比于硬件原生支持嵌套中断,软件实现嵌套中断不但效率低下还非常容易出错。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Sentinel实时监控不展示问题

问题 官方插件 Endpoint 支持,可以实时统计出SpringBoot的健康状况和请求的调用信息 在使用 Endpoint 特性之前需要在 Maven 中添加 spring-boot-starter-actuator 依赖,并在配置中允许 Endpoints 的访问。 Spring Boot 1.x 中添加配置 management.se…

硬件工程师笔试面试——MOS管

目录 8、MOS管 8.1 基础 MOS管原理图 MOS实物图 8.1.1 概念 8.1.2 特点 8.1.3 类型 7.2 相关问题 7.2.1 MOS管在不同应用中的阈值电压和最大漏极电流通常是多少? 7.2.2 如何根据电路设计选择合适的MOS管类型? 7.2.3 MOS管在高频应用中的优势是什么,它如何影响电路…

数据结构(4)栈和队列

一、栈 栈是一种线性的数据存储结构,由于栈只允许从一端进行数据的插入和删除。因此,栈是先进后出(FILO)的特性。 系统栈是由系统进行创建和维护的,数据结构中的栈是由自己创建和维护的。 栈的类型有:满增栈…

网络基础入门指南(三)

一、远程管理交换机 1.配置IP地址 远程管理需要通过IP地址访问网络设备交换机的接口,默认无法配置IP地址需要使用虚接口vlan1 2.配置远程登录密码 远程管理需要配置VTY接口VTY是虚拟终端,是一种网络设备远程连接的方式vty 0 4表示可同时打开5个会话 3…

数控纵切自动车床

数控纵切自动车床,作为现代机械加工领域的重要设备,集成了高精度、高效率与自动化等诸多优势。下面,我将从多个方面为您详细介绍这一先进设备。 ‌一、设备概述‌ 数控纵切自动车床,顾名思义,是一种结合了数控技术与纵…

vscode clang-format 格式化

系列文章目录 文章目录 系列文章目录vscode clang-formatOverview1.安装 clang-format2.设置格式化配置文件3.格式化配置文件示例关于作者 vscode clang-format Overview 项目统一格式化clang-formatvscode 1.安装 clang-format 1.vscode中,进行以下操作&#…

C++(二)----类和对象

一、前言 众所周知,C与C语言不同的地方就是,C引入了类和对象,可以在兼容C语言的同时面向对象编程,同时具备了封装、继承、多态三种特点(划重点)。面向对象可以说是C最重要的部分了,而类和对象就…

AnyChart 数据可视化框架

AnyChart 数据可视化框架 AnyChart 是一个灵活的 JavaScript(HTML5、SVG、VML)图表框架,适合任何需要数据可视化的解决方案。 目录 下载并安装开始插件将 AnyChart 与 TypeScript 结合使用将 AnyChart 与 ECMAScript 6 结合使用技术集成贡献…

区块链学习笔记1--比特币

区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。 从狭义上来说:区块链是一种按照时间顺序将数据区块以顺序相连的方式组合成的一种链式数据结构,并以密码学的方式保证的不可篡改和不可伪造的分布式账本。 意思就是…

Zabbix自定义监控项与触发器

当我们需要获取某台主机上的数据时,直接利用 zabbix 提供的模板可以很方便的获得需要的数据,但是有些特别的数据,利用这些现有的模板或监控项是无法实现的,例如网站状态信息的监控、mysql数据库主从状态等信息。这是就需要自己定义键值和监控…

上门家政做饭系统小程序开发概览

上门做饭系统是一种融合了现代科技手段的创新餐饮服务模式,旨在为用户提供便捷且个性化的上门烹饪体验。通过互联网技术,这一系统连接了专业的私人厨师与有需求的家庭或个人,让高品质的餐饮服务更加触手可及。编辑:qawsed2466 核心…

【C++】优先级队列反向迭代器的实现

一、优先级队列: 优先级队列(priority queue)是一种容器适配器, 它默认使用vector作为其底层存储数据的容器,在vector上又使用了堆算法将vector中元素构造成堆的结构,因此priority_queue就是堆,…

Rust 助力无服务器构筑云计算新引擎

引言 今年 Amazon Lambda 迎来了它的第一个十周年。在过去的十年里,无服务器架构改变了软件开发的方式,简化了应用程序的部署和扩展,成为云计算的新引擎。而在众多支持无服务器技术的编程语言中,Rust 以其卓越的安全性和高性能成…

项目管理工作流是什么?项目管理工作流管理实战技巧!

项目管理工作流是指在协作过程中通过限制任务状态的流转进行流程控制的一种方式。项目从启动到完成所经历的一系列有序、可控的步骤和流程,它详细描述了项目执行过程中各项任务和活动的顺序、依赖关系、责任人以及完成标准等,是项目成功执行的重要保障。…

java设计模式 桥接模式

桥接模式(Bridge Pattern)是一种结构型设计模式,旨在将抽象部分与其实现部分分离,使它们都可以独立地变化。桥接模式通过将继承改为组合,实现了在不修改现有类的情况下,动态地切换和扩展抽象类与其具体实现…

Windows 平台安装 Nacos 2.x

环境准备 64 位操作系统,Windows 10 / Linux Centos 7JDK 1.8 安装包下载 安装包下载官方地址:https://github.com/alibaba/nacos/releases 启动 将安装包解压到安装的目录下,改名为 nacos-2.0.4。然后进行到 bin 目录下,打开…

数据集 Look into Person (LIP) 是最流行的单人人体语义分割 >> DataBall

开源数据集 Look into Person (LIP) 是最流行的单人人体语义分割 深度学习 Look into Person (LIP) 是最流行的单人人体分割数据集,它使用像素级注释进行注释,具有19个语义人体部分标签和一个背景标签。LIP包含50,462个带注释的图像,分为30,4…

CAN集线器(工业级、隔离式)

型号: MS-HUB-C 概述 MS-HUB 是一款可通过一路 CAN ,一路 RS-232为主口扩展出 7 路 CAN 从口的工业级光电隔离型 CAN 分配器。可以有效的实现 CAN 网络的中继、扩展与隔离。采用先进的自动流控技术自动侦测CAN 信号流向。MS-HUB 具备光电隔离功能&#x…

UEFI学习笔记(二):edk2构建编译流程

UEFI入门(二):edk2项目编译流程 一、Build流程框架Build的三个阶段:1、Autogen2、Make3、ImageGen 二、编译构建步骤:1. 安装依赖工具2. 初始化构建环境3. 配置工具链和目标4. 定义平台配置5. 构建并编译 三、uefi-too…

怎么通过Java实现和数据库的连接???(附带练习)

JDBC 今日目标 掌握JDBC的的CRUD理解JDBC中各个对象的作用掌握Druid的使用 1,JDBC概述 在开发中我们使用的是java语言,那么势必要通过java语言操作数据库中的数据。这就是接下来要学习的JDBC。 1.1 JDBC概念 JDBC 就是使用Java语言操作关系型数据库的…