ARM处理器有哪些工作模式和寄存器?各寄存器作用是什么?ARM异常中断处理流程?

《嵌入式工程师自我修养/C语言》系列——ARM处理器有哪些工作模式和寄存器?各寄存器作用是什么?

  • 一、ARM处理器的工作模式及寄存器
    • 1.1 ARM处理器的工作模式
    • 1.2 ARM处理器中的寄存器
  • 二、ARM 异常中断处理
    • 2.1 什么是异常?异常向量表是什么?
    • 2.2 异常的响应和返回流程
    • 2.3 异常处理过程示例

快速学习嵌入式开发其他基础知识?>>>>>>>>> 返回专栏总目录 《嵌入式工程师自我修养/C语言》<<<<<<<<<

Tip📌:鼠标悬停双虚线关键词/句,可获得更详细的描述

一、ARM处理器的工作模式及寄存器

1.1 ARM处理器的工作模式

  ARM处理器有多种工作模式,如下表所示。应用程序正常运行时,ARM处理器工作在用户模式(User mode),当程序运行出错或有中断发生时,ARM处理器就会切换到对应的特权工作模式

处理器模式模式编码模式介绍
User mode0B10000应用程序正常运行时的工作模式
FIQ mode0B10001快速中断模式,中断优先级比IRQ高,用于处理高优先级中断请求
IRQ mode0B10010中断模式
Supervisor mode0B10011管理模式,用于处理中断和异常,复位和软中断时一般会进入该模式
Abort mode0B10111用于处理内存访问错误,指令读取失败时会进入该模式
Undefined mode0B11011CPU遇到无法识别的、未定义的指令,会进入该模式
System mode0B11111类似用户模式,但可以运行特权OS任务,如切换到其他模式
Monitor mode0B10110仅限于安全扩展

1.2 ARM处理器中的寄存器

  在ARM处理器内部,除了基本的ALU和控制单元,还有一系列寄存器(推荐先阅读《CPU是如何工作的?什么是冯·诺依曼架构和哈弗架构?》),包括各种通用寄存器、状态寄存器、控制寄存器,用来控制处理器的运行,保存程序运行时的各种状态和临时结果,如下图所示。

  ARM总共37个寄存器,但每种模式下最多只能访问18个。

在这里插入图片描述

总结:
1、7个模式中除了user是普通模式以外,其他6个都是特权模式
2、6个特权模式中,除了System模式以外,其他5个都是异常模式
3、模式的切换是通过代码写CPSR寄存器进行主动切换的,或者CPU自动切换
4、各种模式可访问的寄存器数量不同,操作权限不同,方便操作系统的安全等级需求
——引自:CSDN-图南楠:《ARM的工作模式和37个寄存器》

  ARM处理器中的寄存器可分为通用寄存器和专用寄存器两种。寄存器R0~R12属于通用寄存器,除了FIQ工作模式,在其他工作模式下这些寄存器都是共用、共享的:

  • R0~R3:通常用来传递函数参数;
  • R4~R11:用来保存程序运算的中间结果或函数的局部变量等;
  • R12:常用来作为函数调用过程中的临时寄存器。

  除了这些在各个模式下通用的寄存器,还有1个R15寄存器固定用作PC,一个固定用作CPSR,还有一些寄存器在各自的工作模式下是独立存在的,如R13、R14、SPSR寄存器,在每个工作模式下都有自己单独的寄存器,各个寄存器功能描述如下:

  • R13:堆栈指针寄存器(StackPointer,SP),用来维护和管理函数调用过程中的栈帧变化,R13总是指向当前正在运行的函数的栈帧,一般不能再用作其他用途
  • R14:链接寄存器(Link Register,LR),在函数调用过程中主要用来保存上一级函数调用者的返回地址;
  • R15:程序计数器(Program Counter,PC),CPU从内存取指令执行,就是默认从PC保存的地址中取的(所以程序跳转时就是把目标地址代码放到PC中),每取一次指令,PC寄存器的地址值自动增加。
  • CPSR:处理器状态寄存器(Current Processor State Register),主要用来表征当前处理器的运行状态。除了各种状态位、标志位,CPSR寄存器里也有一些控制位,用来切换处理器的工作模式和中断使能控制。该寄存器的详细说明如下图所示。
  • 在这里插入图片描述

两条Tips📌:

  1. CPSR中的mode位(bit4~bit0共5位)决定了CPU的工作模式,在uboot代码中会使用汇编进行设置。
  2. CPSR中的T控制位(bit5共5位)决定了ARM内核的工作状态,如下所示:
    • ARM状态(T为0):ARM处理器执行32位的ARM指令集:

      • 异常中断时,需要使用ARM指令(ARM状态);
      • ARM处理器在上电开始执行代码时,只能处于ARM状态;
    • THUMB状态(T为1):ARM微处理器执行16位的Thumb指令集

  • SPSR:程序状态保存寄存器(Saved Processor State Register),当ARM处理器切换工作模式或发生异常时,SPSR用来保存当前工作模式下的处理器现场,即将CPSR寄存器的值保存到当前工作模式下的SPSR寄存器。当ARM处理器从异常返回时,就可以从SPSR寄存器中恢复原先的处理器状态,切换到原来的工作模式继续运行。

Tip📌:
  在ARM所有的工作模式中,有一种工作模式比较特殊,即FIQ模式。为了快速响应中断,减少中断现场保护带来的时间开销,在FIQ工作模式下,ARM处理器有自己独享的R8~R12寄存器。

二、ARM 异常中断处理

2.1 什么是异常?异常向量表是什么?

——异常
  正常工作之外的流程都叫异常,中断是异常的一种。异常会打断正在执行的工作,并且一般我们希望异常处理完成后继续回来执行原来的工作。当 CPU 正常运行时,每执行完一条指令,PC 值都会增加 4 (即往后移动 32 位,指向下一条指令,thumb指令集PC步进为2)。

Tip📌:
  异常和中断都是处理系统中突发事件的机制,请求处理器打断正常的程序执行流程,进入特定的处理或服务程序。但异常是意外操作引起,系统被动接受,与正在执行的指令有直接关系;中断是向处理器主动申请的,和正在执行的指令没有关系。

——异常向量表
  所有的CPU都有异常向量表,这是CPU设计时就设定好的,是硬件决定的。当发生异常中断时的处理方式为:执行完当前指令后,保护现场并跳转到异常中断处理程序处(CPU 通过将 PC 值改为异常向量表中对应异常处理程序的地址,实现跳转)开始执行。处理程序执行完毕,再回到中断前的位置,恢复现场并继续执行。
Tip📌:异常向量表是硬件向软件提供的处理异常的支持。

  向量表是异常的入口地址,发生对应异常时CPU会跳到对应的向量地址,然后再跳转到向量地址中的异常处理地址,实现异常处理。异常向量表一般都存在地址的最低端,异常类型、来源以及对应的地址分布如下表所示:

地址异常来源
0x00复位(Reset)复位引脚有效(也是系统刚上电时 CPU 跑到的第一个地址)
0x04未定义指令(Undefined Instruction)读到了无法解码的指令
0x08软件中断(SWI,Software Interrupt)指令引起的异常
0x0C指令预取中止(Prefetch)当程序试图执行一个非法的指令或没有执行权限的指令时,会产生该异常
0x10数据访问终止(DataAbort)当程序试图访问一个非法的内存地址或没有访问权限的内存地址时,会产生该异常
0x14无操作(NOP)
0x18外部中断(IRQ)当外部设备向处理器发出中断请求时,会产生该异常
0x1C快速中断(FIQ)当某些设备需要快速响应时,可以使用该异常,该异常的优先级高于IRQ异常

Tip📌:
  在ARM中,向量表中0x14处的异常类型NOP指的是“无操作”(No Operation),也就是说,当处理器遇到该异常时,它不会执行任何操作,直接返回到下一条指令的执行。这个异常类型通常被用作调试或占位符,以确保向量表的每个条目都被占用,不会被其他异常类型所覆盖。

2.2 异常的响应和返回流程

——异常响应流程

  1. 把返回地址存入对应模式的 LR (即 R14 ,链接寄存器);
  2. CPSR 存入对应 SPSR。这个 SPSR 指的是要跳到的中断模式的 SPSR,比如要从 USR 跳到 FIQ,那就把用户模式的 CPSR 送 FIQ 的SPSR;
  3. 重设 CPSR 各域值,实现把 CPU 切换到对应的模式,比如 FIQ 模式位就是 10001,然后就可以用该模式下的独立寄存器了;
  4. 设置 PC( R15 )为中断向量地址,实现强制跳转。
    在这里插入图片描述

——异常返回流程
在这里插入图片描述
  其中“将PC变回用户指令流中相应指令处”的实际操作时:LR 值减去偏移量后送 PC(减偏移量是因为异常来的时候,硬件可能来不及调整地址。下面是一些异常和对应返回的位置):

异常返回时LR取值
复位(Reset)不用返回原位置了
未定义指令(Undefined Instruction)LRLR(无偏移)
软件中断(SWI,Software Interrupt)LR(无偏移)
指令预取中止(Prefetch)LR-4
数据访问终止(DataAbort)LR-8
无操作(NOP)
外部中断(IRQ)LR-4
快速中断(FIQ)LR-4

2.3 异常处理过程示例

AREA boot, CODE, READONLY
ENTRYLDR PC, Reset_Add           @ 中断向量表LDR PC, Undefined_Add@...LDR PC, FIQ_AddReset_Add       DCD Start_Boot  @ 中断处理程序入口,放在内存中@ DCD:分配一段连续的空间并初始化@ 含义:标号 Reset_Add 的值为 Start_Boot 起的一段
Undefined_Add   DCD Undefined_Handler
@...
FIQ_Add         DCD FIQ_Handler
​
Start_Boot                      @...进行实际处理的代码,即中断处理程序实现
Undefined_Handler               @...进行实际处理的代码
FIQ_Handler                     @...进行实际处理的代码

Tip📌:这个可以当模板用,其他的中断处理也就是改改调用的函数。

EXPORT IRQ_Handler      @ EXPORT,声明全局标号,全程序可见,可在其他文件中引用
AREA IRQ_Handler, CODE, READONLY
SUB LR, LR, #0x4        @ 设置返回地址为 LR-4
STMFD SP!, {R0-R12, LR} @ 寄存器压栈,保护现场。进中断后这些寄存器随便用
MRS R4, SPSR            @ SPSR 存 R4
STMFD SP!, {R4}         @ 压栈,R4 存入 SP 指向的内存位置(即栈顶)
BL IRQ_Function         @ 跳转到真正的中断处理子函数
LDMFD SP!, {R4}         @ 恢复
MSR SPSR_cxsf, R4       @ cxsf是指四个8位的域,此处是整个32位寄存器
LDMFD SP!, {R0-R12, PC}^ @ 恢复现场并返回
END

>>>>>>>>> 返回专栏总目录 《嵌入式工程师自我修养/C语言》<<<<<<<<<

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[RCTF2015]EasySQL1 题目分析与详解

一、题目介绍&#xff1a; 1、题目来源&#xff1a; BUUCTF网址 2、题目介绍&#xff1a; 拿到flag。 二、解题思路&#xff1a; 我们发现题目首页有登录和注册账号两个选项&#xff0c;我们首先尝试注册账号&#xff0c;尝试注册username为admin的账号&#xff0c;输入密码…

FPGA OSERDESE2

Output Parallel-to-Serial Logic Resources (OSERDESE2) OSERDESE2 在Xilinx 7 系列器件是一款专用的并行至串行转换器,具有特定的时钟和逻辑资源,旨在促进高速源同步接口的实现。每个OSERDESE2模块都包括一个专用的数据串行器和 3 状态控制。数据和 3 态串行器都可以在 SD…

TVS管+二极管钳位电路的分析

我们通常的电路中多用TVS管或者单二极管来进行钳位&#xff0c;TVS管二极管同时钳位的情况比较少见&#xff0c;这篇文章就是分析TVS管二极管同时钳位的电路&#xff0c;主要学习其分析思路。 电路如下图&#xff0c;就是个flyback。可以看到&#xff0c;电路中有个钳位电路&a…

petalinux_zynq7 驱动DAC以及ADC模块之五:nodejs+vue3实现web网页波形显示

前文&#xff1a; petalinux_zynq7 C语言驱动DAC以及ADC模块之一&#xff1a;建立IPhttps://blog.csdn.net/qq_27158179/article/details/136234296petalinux_zynq7 C语言驱动DAC以及ADC模块之二&#xff1a;petalinuxhttps://blog.csdn.net/qq_27158179/article/details/1362…

MySQL锁三部曲:临键、间隙与记录的奇妙旅程

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 MySQL锁三部曲&#xff1a;临键、间隙与记录的奇妙旅程 前言临键锁的奥秘间隙锁记录锁 前言 在数据库世界中&#xff0c;锁是维护数据完整性的一种关键机制。而MySQL中的临键锁、间隙锁和记录锁则是锁…

博客阿里云服务器2024年最新优惠价格表,61元起

博客 阿里云服务器2024年最新优惠价表&#xff0c;轻量级应用服务器61元起&#xff0c;云服务器99元起 01-30 第591章 2024年阿里云服务器最新优惠价是多少&#xff1f; 阿里云服务器的租用价格在不同时期是不同的。 进入2024年&#xff0c;阿里云服务器的优惠价格也发生了…

【Python笔记-设计模式】桥接模式

一、说明 桥接模式是一种结构型设计模式&#xff0c; 主要用于将抽象部分与它的实现部分分离&#xff0c; 从而能在开发时分别使用&#xff0c;使系统更加灵活&#xff0c;易于扩展。 (一) 解决问题 所有 组合类的数量将以几何级数增长 抽象和实现分离&#xff1a;桥接模式可…

K8S部署Java项目 pod报错 logs日志内容:no main manifest attribute, in app.jar

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

通配符证书的作用

通配符证书是一种 SSL/TLS 证书&#xff0c;可用于保护多个域&#xff08;主机&#xff09;&#xff0c;由域名字段中的通配符 (*) 指示。这种证书主要用于具有许多子域的组织。通配符证书对主域及其所有一级子域有效。例如&#xff0c;一个针对 *.example.com 的通配符证书可以…

SSM框架学习笔记07 | Spring MVC入门

文章目录 1. HTTP协议2. Spring MVC2.1. 三层架构2.2. MVC&#xff08;解决表现层的问题&#xff09;2.3. 核心组件 3. Thymeleaf3.1. 模板引擎3.2. Thymeleaf3.3. 常用语法 代码 1. HTTP协议 网址&#xff1a;https://www.ietf.org/ &#xff08;官网网址&#xff09; https:…

在苹果电脑MAC上安装Windows10(双系统安装的详细图文步骤教程)

在苹果电脑MAC上安装Windows10&#xff08;双系统安装的详细图文步骤教程&#xff09; 一、准备工作准备项1&#xff1a;U盘作为系统安装盘准备项2&#xff1a;您需要安装的系统镜像 二、启动转换助理步骤1&#xff1a;找到启动转换助理步骤2&#xff1a;启动转换助理步骤3&…

Unity接入SQLite (一):SQLite介绍

1.简介 SQLite是一个开源的嵌入式关系数据库管理系统。它是一种轻量级的数据库引擎&#xff0c;不需要单独的服务器进程&#xff0c;可以直接嵌入到应用程序中使用。Sqlite使用简单、高效&#xff0c;并且具有对标准SQL的完整支持。它适用于需要在本地存储和访问数据的应用程序…

docker-compose 搭建laravel环境

laravel环境包含nginx,mysql,php7.4,redis 一、安装好docker后pull镜像 1.nginx镜像 docker pull nginx:latest单独启动容器 docker run --name nginx -p 80:80 -d nginx 2.php镜像 docker pull php:7.4-fpm3.mysql镜像 docker pull mysql:5.74.redis镜像 docker pull r…

(done) 两个矩阵 “相似” 是什么意思?

参考视频&#xff1a;https://www.bilibili.com/video/BV1zu411673J/?spm_id_from333.337.search-card.all.click&vd_source7a1a0bc74158c6993c7355c5490fc600 参考资料&#xff1a;https://baike.baidu.com/item/%E7%9B%B8%E4%BC%BC%E7%9F%A9%E9%98%B5/10369874?frge_a…

核密度分析

一.算法介绍 核密度估计&#xff08;Kernel Density Estimation&#xff09;是一种用于估计数据分布的非参数统计方法。它可以用于多种目的和应用&#xff0c;包括&#xff1a; 数据可视化&#xff1a;核密度估计可以用来绘制平滑的密度曲线或热力图&#xff0c;从而直观地表…

一键生成请求方法的工具 —— OpenAPI Typescript Codegen

文章目录 用法自定义请求参数的方法1&#xff09;使用代码生成器提供的全局参数修改对象2&#xff09;直接定义 axios 请求库的全局参数&#xff0c;比如&#xff1a;全局请求响应拦截器 报错解决 用法 首先下载axios npm install axios官网&#xff1a;https://github.com/f…

基于ssm框架的高校班级管理系统设计与实现

为解决当前高校班级管理中管理方式落后、手段落后及效率低下等问题而以当前主流的互联网技术设计一款高校班级管理系统。该系统采用B/S模式的设计思路而将前端&#xff08;JSP技术&#xff09;和后端&#xff08;SSM框架MySQL数据库&#xff09;整合于一体并通过Java语言代码编…

win10编译openjdk源码

上篇文章作者在ubuntu系统上实践完成openjdk源码的编译&#xff0c;但是平常使用更多的是window系统&#xff0c;ubuntu上编译出来JDK无法再windows上使用。所以作者又花费了很长时间在windows系统上完成openjdk源码的编译&#xff0c;陆续花费一个月的时间终于完成了编译。 本…

前端导出下载文件后提示无法打开文件

问题 项目中的导出文件功能&#xff0c;导出下载后的文件打开提示如下&#xff1a; 原因 对返回的响应数据进行打印&#xff0c;发现响应数据为字符串格式&#xff0c;前期规划的后端返回数据应该 blob 对象的。后经排查后发现是请求头缺少了响应数据格式的配置&#xff0c;应…

.NET Core使用NPOI导出复杂,美观的Excel详解

前言&#xff1a; 这段时间一直专注于数据报表的开发&#xff0c;当然涉及到相关报表的开发数据导出肯定是一个不可避免的问题啦。客户要求要导出优雅&#xff0c;美观的Excel文档格式的来展示数据&#xff0c;当时的第一想法就是使用NPOI开源库来做数据导出Excel文档&#xf…