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

Cortex-A7和Cortex-M7架构处理器取中断向量全流程分析

0 参考资料

Cortex M3权威指南(中文).pdf
ARM Cortex-A(armV7)编程手册V4.0.pdf

1 Cortex-A7和Cortex-M7处理器架构取中断向量全流程分析

1.1 什么是中断向量?

中断向量就是中断服务函数入口地址,例如我们发生了EXTI0中断,就需要执行EXT0中断对应的中断服务函数EXTI0_IRQHandler,这个中断服务函数入口地址就是中断向量。

1.2 什么是中断向量表?

通常来说CPU会有各种各样不同的中断,它们对应的中断服务函数也不一样。CPU为了在中断发生时更快地跳转到对应的中断服务函数响应中断,就人为将中断向量按顺序存储在内存中(一般是Flash),这样就形成了一张映射表。CPU只要知道这片内存的首地址、中断ID、每个中断向量占据的内存空间,就能很快找到中断源对应的中断服务函数,响应中断。以Cortex-M3为例,它的中断向量表部分定义如下:
在这里插入图片描述

1.3 什么是中断向量表偏移地址?什么是中断向量表基址?

我们已经知道中断向量表的作用,CPU为了能够访问向量表,需要知道向量表的地址,这个就是中断向量表基址(起始地址)。
为了实现这一目的,有些CPU(如Cortex-M3架构处理器)提供了一个中断向量表偏移寄存器,通过中断向量表相对于存储器首地址的偏移量计算出中断向量表基址。还有些CPU(如Cortex-A7架构处理器)提供了中断向量表基址寄存器,可以直接修改中断向量表基址。
以Cortex-M3为例,它的中断向量表偏移量寄存器定义如下:
在这里插入图片描述注意:

Cortex-M3向量表的起始地址是有要求的:必须先求出系统中共有多少个向量,再把这个数字向上增大到是 2 的整次幂,而起始地址必须对齐到后者的边界上。

1.4 Cortex-M7架构处理器是怎么取中断向量的?

本例以基于Cortex-M7的stm32H743为例,分析Cortex-M7架构处理器是如何取中断向量的。

1.4.1 设置中断向量表偏移地址

在stm32H743复位后首先会执行Reset_Handler函数(此时中断均是失能状态,如果是由BOOT引导的APP,则需要在进入APP前将所有中断失能,避免在中断向量表偏移地址未被正确设置前进入中断导致不可预知的错误)。Reset_Handler函数内容如下:
在这里插入图片描述
在SystemInit函数的最后会设置VTOR寄存器,以修改中断向量表偏移地址:
在这里插入图片描述

1.4.2 CPU如何查找中断向量?

以stm32官方例程来说,中断向量表被放到了镜像文件的起始位置。查看其启动文件(startup_stm32h743zitx.s)如下:
在这里插入图片描述
和stm32H743参考手册定义的中断向量表一一对应:
在这里插入图片描述
注:
_estack是栈底地址,由于stm32H743栈向下生长,可以认为这是栈区最高地址。
查看.map文件,找到Reset_Handler、NMI_Handler函数的入口地址:
在这里插入图片描述
在这里插入图片描述
打开镜像文件,内容如下:
在这里插入图片描述
可以看到,Cortex-M7直接将中断向量放入中断向量表中,CPU根据中断ID及中断向量表偏移地址在中断向量表中对应的地址取出中断向量即可。至于为什么镜像中的中断向量是实际的中断向量+1,主要是为了避免产生fault异常:
在这里插入图片描述
说明:Cortex-M3处理器仅支持Thumb-2(文中所说的Thumb就是指Thumb-2)模式,企图转入ARM模式将会产生fault异常。
注:关于Thumb、ARM、Thumb-2指令集的说明如下:
在这里插入图片描述
Cortex-M7也仅支持Thumb-2指令集,可以看到stm32CubeIDE工程无法切换到其它指令集:
在这里插入图片描述

1.4 Cortex-A7架构处理器是怎么取中断向量的?

本例以基于Cortex-A7的stm32MP135为例,分析Cortex-A7架构处理器是如何取中断向量的。

1.4.1 设置中断向量表基地址(首地址)

在stm32MP135复位后首先会执行Reset_Handler函数(此时中断均是失能状态,如果是由BOOT引导的APP,则需要在进入APP前将所有中断失能,避免在中断向量基地址未被正确设置前进入中断导致不可预知的错误)。Reset_Handler函数内容如下:
在这里插入图片描述
上图红框标记处开始设置中断向量表基地址。
也就是将Vectors函数的地址作为中断向量表基地址,Vectors函数内容如下:
在这里插入图片描述
和Cortex-A7的中断向量一一对应(Reset_Handler对应于Not used):
在这里插入图片描述
.align 7表示Vectors函数地址按照2^7字节对齐,也就是按照128字节对齐。有关VBAR寄存器的描述如下:
在这里插入图片描述

1.4.2 CPU如何查找中断向量?

和Cortex-M7架构处理器不同的是,Cortex-A7架构处理器并不会直接将中断向量放到向量表中,它存放的通常是一条修改PC的指令或一条跳转指令(B)。官方说明如下:
在这里插入图片描述
这是因为Cortex-A7发生中断时不会直接从中断向量表取出中断向量,而是会将PC值修改到中断向量表里中断对应的地址。而这个地址存放的是一条指令,用来跳转到对应的中断服务函数。以stm32MP135为例,其中断向量表如下:
在这里插入图片描述
对应的.list文件如下:
在这里插入图片描述
可以看到stmMP135采用的就是官方推荐的第二种写法。例如,发生IRQ中断,PC会设置为0x2ffe0118,执行pc, [pc, #28]语句,执行完之后PC值为0x2ffe53bf。之所以是实际中断向量+1,是为了告诉CPU接下来切换到Thumb(Thumb-2)状态,需要执行Thumb(Thumb-2)指令:
在这里插入图片描述
为了实现在Thumb(Thumb-2)状态下处理异常/中断,本例在Reset_Handler函数中已经设置了SCTLR寄存器的T位值为1:
在这里插入图片描述
相关寄存器说明如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
ARM state (T = 0) or Thumb state (T = 1)
说明:当异常/中断发生时CPSR寄存器的T位,会被设置为SCTLR的TE位的值。也就是说进入异常/中断CPU会切换到Thumb(Thumb-2)状态。
注:Cortex-A7所指的Thumb指令集就是Thumb-2指令集,因此本文写成了Thumb(Thumb-2)。
在这里插入图片描述
Cortex-A7什么时候在ARM状态?什么时候在Thumb(Thumb-2)状态?
在这里插入图片描述
ARM状态只能执行ARM指令,Thumb状态只能执行Thumb指令。当前执行的指令是ARM指令就处于ARM状态,当前执行的指令是Thumb指令就处于Thumb状态。可以通过CPSR寄存器的T位查看CPU处于什么状态,T=0时处于ARM状态,T=1时处于Thumb状态。至于在什么时候切换状态,编译器会帮我们生成能实现正确的代码。
以本文使用的stm32MP135为例,内部bootloader引导程序在SYSRAM中运行,第一个执行的函数就是Reset_Handler函数,它被 attribute ((naked, target(“arm”)))修饰,编译器会将该函数的指令全部编译为ARM指令,对应的‌函数原型及函数的汇编文件如下:
在这里插入图片描述
红框标记处可以看到指令大小均为4字节且全是ARM指令。
在这里插入图片描述

2 总结

(1)Cortex-M通过修改中断向量偏移地址来实现对中断向量表基地址修改,限制了它修改的范围。而Cortex-A7可以直接修改中断向量基址,灵活性大大增强,我们可以把中断向量表放到DDR、Flash、SRAM等任意存储器上。
(2)Cortex-M中断向量表存放的是中断向量,Cortex-A7中断向量表存放的是跳转/PC修改指令,通过修改PC来跳转到对应的中断服务函数。
(3)中断发生时,Cortex-M处理器直接在中断向量表找到中断向量并执行对应的中断服务函数。中断发生时,Cortex-A7会跳转中断向量表对应的中断偏移位置,然后执行一条指令修改PC值,跳转到对应的中断服务函数。
(4)Cortex-M7处理器取中断向量流程也适用于Cortex-M3/M4。

相关文章:

Cortex-A7和Cortex-M7架构处理器取中断向量全流程分析

0 参考资料 Cortex M3权威指南(中文).pdf ARM Cortex-A(armV7)编程手册V4.0.pdf1 Cortex-A7和Cortex-M7处理器架构取中断向量全流程分析 1.1 什么是中断向量? 中断向量就是中断服务函数入口地址,例如我们发生了EXTI0中断,就需要执行EXT0中…...

MODELS 2024震撼续章:科技与可持续性的未来交响曲

MODELS 2024国际会议正如火如荼地进行着,每一天都充满了新的发现与启迪,每一场分享都是对技术前沿的一次深刻探索,更是对现实世界可持续性挑战的一次积极回应。现在让我们继续这场科技盛宴,看看小编为您精选几场的学术分享吧~ 会议…...

CICD 持续集成与持续交付

一 、CICD是什么 CI/CD 是指持续集成(Continuous Integration)和持续部署(Continuous Deployment)或持续交付(Continuous Delivery) 1.1 持续集成(Continuous Integration) 持续集…...

“数据面”(Data Plane)是指负责实际数据处理和转发的部分

在计算机网络和服务架构中,“数据面”(Data Plane)是指负责实际数据处理和转发的部分。数据面负责执行具体的网络通信任务,如接收、处理和转发数据包。与数据面对应的是“控制面”(Control Plane)&#xff…...

面试题:MySQL你用过WITH吗?领免费激活码

感谢Java面试教程的Java多线程文章,点击查看>原文 Java面试教程,发mmm116可获取IDEA-jihuoma 在MySQL中,WITH子句用于定义临时表或视图,也称为公共表表达式(CTE)。它允许你在一个查询中定义一个临时结果…...

consul 介绍与使用,以及spring boot 项目的集成

目录 前言一、Consul 介绍二、Consul 的使用三、Spring Boot 项目集成 Consul总结前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是…...

Linux常用命令shell常用知识 。。。。面试被虐之后,吐血整理。。。。

Linux三剑客&常用命令&shell常识 Linux三剑客grep - print lines matching a patternsed - stream editor for filtering and transforming textawkman awk Linux常用命令dd命令ssh命令tar命令curl命令top命令tr命令xargs命令sort命令du/df/free命令 shell 知识functio…...

压力测试指南-压力测试基础入门

压力测试基础入门 在当今快速迭代的软件开发环境中,确保应用程序在高负载情况下仍能稳定运行变得至关重要。这正是压力测试大显身手的时刻。本文将带领您深入了解压力测试的基础知识,介绍实用工具,并指导您设计、执行压力测试,最…...

Linux:LCD驱动开发

目录 1.不同接口的LCD硬件操作原理 应用工程师眼中看到的LCD 1.1像素的颜色怎么表示 ​编辑 1.2怎么把颜色发给LCD 驱动工程师眼中看到的LCD 统一的LCD硬件模型 8080接口 TFTRGB接口 什么是MIPI Framebuffer驱动程序框架 怎么编写Framebuffer驱动框架 硬件LCD时序分析…...

QT:常用类与组件

1.设计QQ的界面 widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPushButton> #include <QLineEdit> #include <QLabel>//自定义类Widget,采用public方式继承QWidget&#xff0c;该类封装了图形化界面的相关操作&#xff…...

企业内训|提示词工程师高阶技术内训-某运营商研发团队

近日&#xff0c;TsingtaoAI为某运营商技术团队交付提示词工程师高级技术培训&#xff0c;本课程为期2天&#xff0c;深入探讨深度学习与大模型技术在提示词生成与优化、客服大模型产品设计等业务场景中的应用。内容涵盖了深度学习前沿理论、大模型技术架构设计与优化、以及如何…...

K8S真正删除pod

假设k8s的某个命名空间如&#xff08;default&#xff09;有一个运行nginx 的pod&#xff0c;而这个pod是以kubectl run pod命令运行的 1.错误示范&#xff1a; kubectl delete pod nginx-2756690723-hllbp 结果显示这个pod 是删除了&#xff0c;但k8s很快自动创建新的pod,但是…...

数据结构:队列及其应用

队列&#xff08;Queue&#xff09;是一种特殊的线性表&#xff0c;它的主要特点是先进先出&#xff08;First In First Out&#xff0c;FIFO&#xff09;。队列只允许在一端&#xff08;队尾&#xff09;进行插入操作&#xff0c;而在另一端&#xff08;队头&#xff09;进行删…...

26个用好AI大模型的提示词技巧

如果你已深入探索过ChatGPT、Microsoft Copilot、风变AI等前沿的生成式AI工具&#xff0c;那么你对“prompt”&#xff08;提示词&#xff09;这一核心概念一定有自己的认知。 作为连接你与AI创意源泉的桥梁&#xff0c;“prompt”不仅是触发无限想象的钥匙&#xff0c;更是塑…...

线性表二——栈stack

第一题 #include<bits/stdc.h> using namespace std; stack<char> s; int n; string ced;//如何匹配 出现的右括号转换成同类型的左括号&#xff0c;方便我们直接和栈顶元素 char cheak(char c){if(c)) return (;if(c]) return [;if(c}) return {;return \0;/…...

浏览器发送请求后关闭,服务器的处理过程

之前在开发中&#xff0c;有些后端服务处理非常慢&#xff0c;页面可能会出现504 Gateway time-out的提示&#xff0c;或者服务器还没返回数据&#xff0c;浏览器就关掉了。我们只是看到了浏览器关掉&#xff0c;但是服务器和客户端的状态都是什么样的呢&#xff1f; 问题 在…...

tee命令:轻松同步输出到屏幕与文件

一、命令简介 ​tee​ 命令在 Linux 和 Unix 系统中用于读取标准输入的数据&#xff0c;并将其同时输出到标准输出和文件中。简单来说&#xff0c;tee​ 命令可以用来分割数据流&#xff0c;使其既能够被输出到屏幕&#xff0c;也能够被写入到文件中。 ​​ ‍ 二、命令参数…...

【经验技巧】如何做好S参数的仿测一致性

根据个人经验,想要做好电路板S参数的仿测一致性,如下的相关信息必须被认真对待: 1. PCB叠构(Stack up),仿真模型需要保证设计参数与板厂供应商的生产参数完全一样,这些参数包括: 叠层结构数据;介电常数;损耗因子;蚀刻因子;表面粗糙度。 2. 仿真中,需要保证信号测试…...

js逆向——webpack实战案例(一)

今日受害者网站&#xff1a;https://www.iciba.com/translate?typetext 首先通过跟栈的方法找到加密位置 我们跟进u函数&#xff0c;发现是通过webpack加载的 向上寻找u的加载位置&#xff0c;然后打上断点&#xff0c;刷新网页&#xff0c;让程序断在加载函数的位置 u r.n…...

Spring Boot 进阶-Spring Boot的全局异常处理机制详解

我们知道在软件运行的过程中,总会出现各种各样的问题,各种各样的异常,而程序员的主要任务之一就是解决在程序运行过程中出现的这些异常。在很多程序员开发的代码中我们会看到在关键的地方为了保证程序能够有一个正常的反馈,大量地使用了try catch finally语句。 大量的try …...

【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密

在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)

🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...

Matlab | matlab常用命令总结

常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

docker 部署发现spring.profiles.active 问题

报错&#xff1a; org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

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

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

HarmonyOS运动开发:如何用mpchart绘制运动配速图表

##鸿蒙核心技术##运动开发##Sensor Service Kit&#xff08;传感器服务&#xff09;# 前言 在运动类应用中&#xff0c;运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据&#xff0c;如配速、距离、卡路里消耗等&#xff0c;用户可以更清晰…...

Linux离线(zip方式)安装docker

目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1&#xff1a;修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本&#xff1a;CentOS 7 64位 内核版本&#xff1a;3.10.0 相关命令&#xff1a; uname -rcat /etc/os-rele…...

springboot整合VUE之在线教育管理系统简介

可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生&#xff0c;小白用户&#xff0c;想学习知识的 有点基础&#xff0c;想要通过项…...

C#学习第29天:表达式树(Expression Trees)

目录 什么是表达式树&#xff1f; 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持&#xff1a; 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...