【ARM】ARM寄存器和异常处理

news2024/11/15 17:36:37

目录

1.指令的执行过程

2. ARM处理器概述

3.ARM指令集

4.ARM存储模型

5. ARM工作模式

6.ARM寄存器组织

(1)寄存器

(2)  ARM寄存器

(3)CPSR寄存器​​​​​​​

7. ARM异常处理

(1)异常

(2)异常源

(3)ARM异常模式

(4) ARM异常响应

(5)IRQ异常举例

(6) 异常优先级

(7) FIQ和IRQ



1.指令的执行过程

(1)一条指令的执行分为三个阶段

         1.取址:     

CPU将PC寄存器中的地址发送给内存,内存将其地址中对应的指令返回

到CPU中的指令寄存器(IR)

        2.译码:     

译码器对IR中的指令进行识别,将指令(机器码)解析成具体的运算    

        3.执行:     

控制器控制运算器中对应的运算单元进行运算,运算结果写入寄存器

(2) 每执行一条指令后PC的值会自动增加指向下一条指令

2. ARM处理器概述

ARM产品系列
早先经典处理器 包括ARM7、ARM9、ARM11家族
 Cortex-A系列

针对开放式操作系统的高性能处理器    

应用于智能手机、数字电视、智能本等高端运用 

Cortex-R系列

针对实时系统、满足实时性的控制需求    

应于汽车制动系统、动力系统等

Cortex-M系列

为单片机驱动的系统提供了低成本优化方案    

应用于传统的微控制器市场、智能传感器、汽车周边等

3f50e050b8b9498fab67459420349e50.jpeg

3.ARM指令集

(1)指令集: 处理器能识别的指令的集合称为指令集,不同架构的处理器指令集不同,指令集是处理器对开发者提供的接口

(2)大多数ARM处理器都支持两种指令集:

ARM指令集

 所有指令(机器码)都占用32bit存储空间    

代码灵活度高、简化了解码复杂度    

执行ARM指令集时PC值每次自增4

Thumb指令集

所有指令(机器码)都占用16bit存储空间    

代码密度高、节省存储空间    

执行Thumb指令集时PC值每次自增2

4.ARM存储模型

(1)ARM采用32位架构,基本数据类型有以下三种

Byte(字节)8bits
Halfword(半字)16bits
Word(字)32bits

(2)数据存储

Word型数据在内存的起始地址必须是4的整数倍    

Halfword型数据在内存的起始地址必须是2的整数倍    

注:即数据本身是多少位在内存存储时就应该多少位对齐,且ARM一般使用小端对齐

5. ARM工作模式

(1)ARM有8个基本的工作模式

User    非特权模式,一般在执行上层的应用程序时ARM处于该模式
FIQ 当一个高优先级中断产生后ARM将进入这种模式
IRQ当一个低优先级中断产生后ARM将进入这种模式
SVC当复位或执行软中断指令后ARM将进入这种模式
Abort 当产生存取异常时ARM将进入这种模式
Undef当执行未定义的指令时ARM将进入这种模式
System    使用和User模式相同寄存器集的特权模式
Monitor    为了安全而扩展出的用于执行安全监控代码的模式

(2)工作模式的理解

         不同模式拥有不同权限  

        不同模式执行不同代码  

        不同模式完成不同的功能

(3)ARM工作模式分类

按照权限              User为非特权模式(权限较低),其余模式均为特权模式(权限较高)
按照状态 FIQ、IRQ、SVC、Abort、Undef属于异常模式,即当处理器遇到异常后 会进入对应的模式

6.ARM寄存器组织

(1)寄存器

 概念寄存器是处理器内部的存储器,没有地址
作用一般用于暂时存放参与运算的数据和运算结果
分类包括通用寄存器、专用寄存器、控制寄存器

a64bfde11f264895a95b8bdf0dbab7ca.jpeg

(2)  ARM寄存器

在某个特定模式下只能使用当前模式下的寄存器,一个模式下特有的寄存器其他模式下不可使用

eb7b8907447f4296a7f59ece9233cc9a.png

专用寄存器
R15(PC,Program Counter) 程序计数器,用于存储当前取址指令的地址
R14(LR,Link Register)

链接寄存器,一般有以下两种用途:    

> 执行跳转指令(BL/BLX)时,LR会自动保存跳转指令下一条指令的地址,程序需要返回时将LR的值复制到PC即可实现    

> 产生异常时,对应异常模式下的LR会自动保存被异常打断的指令的下一条指令的地址,异常处理结束后将LR的值复制到PC可实现程序返回

R13(SP,Stack Pointer)栈指针,用于存储当前模式下的栈顶地址
CPSR(Current Program Status Register)当前程序状态寄存器 

(3)CPSR寄存器

 CPSR寄存器分为四个域,[31:24]为条件域用F表示、[23:16]为状态域用S表示、[15:8]为预留域用X表示、[8:0]为控制域用C表示

45605903526648f5bd62eb106406c2e6.png

Bit[4:0][10000]User    [10001]FIQ     [10010]IRQ     [10011]SVC     [10111]Abort   [11011]Undef   [11111]System  [10110]Monitor
Bit[5] [0]ARM状态     [1]Thumb状态
 Bit[6] [0]开启FIQ     [1]禁止FIQ
 Bit[7][0]开启IRQ     [1]禁止IRQ
Bit[28] 

> 当运算器中进行加法运算且产生符号位进位时该位自动置1,否则为0    

> 当运算器中进行减法运算且产生符号位借位时该位自动置0,否则为1

Bit[29]    > 当运算器中进行加法运算且产生进位时该位自动置1,否则为0     > 当运算器中进行减法运算且产生借位时该位自动置0,否则为1
Bit[30]    当运算器中产生了0的结果该位自动置1,否则为0
Bit[31]     当运算器中产生了负数的结果该位自动置1,否则为0

7. ARM异常处理

(1)异常

处理器在正常执行程序的过程中可能会遇到一些不正常的事件发生,这时处理器就要将当前的程序暂停下来转而去处理这个异常的事件,异常事件处理完成之后再返回到被异常打断的点继续执行程序

1d9ed181a44f4b05bbd30f7311bb1609.jpeg

(2)异常源

 导致异常产生的事件称为异常源

ARM异常源
FIQ    快速中断请求引脚有效    
IRQ    外部中断请求引脚有效
 Reset复位电平有效
 Software Interrupt执行swi指令
Data Abort    数据终止
Prefetch Abort指令预取终止
 Undefined Instruction遇到不能处理的指令

(3)ARM异常模式

异常模式:在ARM的基本工作模式中有5个属于异常模式,即ARM遇到异常后会切换成对应的异常模式

2be89d6fe0cf4612a1f771cf44166afe.png

(4) ARM异常响应

ARM产生异常后的动作(自动完成)

1.拷贝CPSR中的内容到对应异常模式下的SPSR_<mode>    

2.修改CPSR的值   

         2.1.修改中断禁止位禁止相应的中断   

         2.2.修改模式位进入相应的异常模式    

         2.3.修改状态位进入ARM状态    

3.保存返回地址到对应异常模式下的LR_<mode>    

4.设置PC为相应的异常向量(异常向量表对应的地址)

异常向量表

 > 异常向量表的本质是内存中的一段代码    

> 表中为每个异常源分配了四个字节的存储空间    

> 遇到异常后处理器自动将PC修改为对应的地址    

> 因为异常向量表空间有限一般我们不会再这里写异常处理程序,而是在对应的位置写一条跳       转指令使其跳转到指定的异常处理程序的入口    

c995ed5810224419a0b3eda9b67ea03d.jpeg

注:ARM的异常向量表的基地址默认在0x00地址但可以通过配置协处理器来修改其地址

ARM异常返回的动作(自己编写)

    1.将SPSR_<mode>的值复制给CPSR, 使处理器恢复之前的状态                     

   2.将LR_<mode>的值复制给PC ,使程序跳转回被打断的地址继续执行 

(5)IRQ异常举例

bc9850d3198b48e78e615c7144a31204.jpeg

(6) 异常优先级

9b0963e26c8f49fda71ad5cfd38a878b.jpeg

(7) FIQ和IRQ

 FIQ的响应速度比IRQ快    

        1. FIQ在异常向量表位于最末 ,可直接把异常处理写在异常向量表之后,省去跳转    

        2. FIQ模式有5个私有寄存器(R8-R12) ,执行中断处理程序前无需压栈保存寄存器,可直接处理中断    

        3. FIQ的优先级高于IRQ     

                3.1 两个中断同时发生时先响应FIQ     

                3.2 FIQ可以打断RIQ,但RIQ不能打断FIQ

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

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

相关文章

26 | 备库为什么会延迟好几个小时?

在官方的 5.6 版本之前,MySQL 只支持单线程复制,由此在主库并发高、TPS 高时就会出现严重的主备延迟问题。 coordinator 就是原来的 sql_thread, 不过现在它不再直接更新数据了,只负责读取中转日志和分发事务。真正更新日志的,变成了 worker 线程。而 work 线程的个数,就是…

IDEA远程连接Docker服务

1.确保你的服务器已经安装docker docker安装步骤可查看&#xff1a;CentOS 9 (stream) 安装 Docker 2.安装完docker后开启远程连接 默认配置下&#xff0c;Docker daemon只能响应来自本地Host的客户端请求。如果要允许远程客户端请求&#xff0c;需要在配置文件中打开TCP监听…

CCF-Csp算法能力认证,202206-1归一化处理(C++)含解析

前言 推荐书目&#xff0c;在这里推荐那一本《算法笔记》&#xff08;胡明&#xff09;&#xff0c;需要PDF的话&#xff0c;链接如下 「链接&#xff1a;https://pan.xunlei.com/s/VNvz4BUFYqnx8kJ4BI4v1ywPA1?pwd6vdq# 提取码&#xff1a;6vdq”复制这段内容后打开手机迅雷…

抖音小店保证金真的能退回吗?内行人的真实情况大揭秘!

哈喽~我是电商月月 新手开抖音小店都会纠结于保证金的缴纳&#xff0c;不同类目保证金金额不同&#xff0c;不同营业执照办理的店铺&#xff0c;保证金收费也不同&#xff0c;具体的缴纳金额大家可以去浏览器搜索抖店官网进行查询 当然找不到的&#xff0c;也可以直接问我&am…

C++程序设计:C++的内存分布与管理

C的内存分布与管理 栈区堆区全局区代码区常量区 栈区 &#xff08;1&#xff09;什么是栈区&#xff1f; 栈区&#xff08;Stack&#xff09; 是用于存储函数调用&#xff0c;局部变量和函数参数的一种内存区域&#xff0c;它的特性就是先进后出&#xff08;FILO&#xff09;。…

揭秘抖音快速涨10000粉的方法:巨量千川投流让你轻松快速增粉

抖音已经成为了当今社交平台的热门之一&#xff0c;而如何快速涨粉已经成为了很多人关注的焦点。本文将揭秘一种高效的方式——巨量千川投流&#xff0c;通过官方真实流量和真实粉丝&#xff0c;每天快速涨关注&#xff0c;实现快速增粉1000~10万。 巨量千川投流是一种专业的抖…

proteus使用问题

1、无法和视频里面一样新建工程 2、实验效果和视频不也一样 自己的电路图(灯不亮)&#xff1a;

vant中van-tabs使用中的小问题

1. 怎么去掉默认选中的效果 van-tabs默认情况下启用第一个标签&#xff0c;实际开发中不满足需求&#xff0c;想要点击后再进行选中 解决办法 首先&#xff0c;在标签组数中&#xff0c;添加一个占位标签在样式中设置首个标签不显示代码如下&#xff1a; //js 实际有意思的…

<sa8650> snapdragon-auto-hqx-4-5-6-0基线代码camera开发错误记录

<sa8650> snapdragon-auto-hqx-4-5-6-0基线代码camera开发错误记录 一、 qcxserver自启动关不掉二、 qcxserver启动后串行器(MAX96717)detect不到?三、 qcarcam_test运行后系统log提示QCarCamReserve错误四、 tuning错误导致的异常DumpCore本文主要记录CAMERA开发过程中的一…

spring框架学习记录(3)

Spring事务 Spring事务简介 事务作用&#xff1a;在数据层保障一系列的数据库操作同成功同失败Spring事务作用&#xff1a;在数据层或业务层保障一系列的数据库操作同成功或同失败 Spring事务角色 事务管理员&#xff1a;发起事务方&#xff0c;在Spring中通常指代业务层开…

计算机网络学习记录 物理层 Day2

计算机网络学习记录 你好,我是Qiuner. 为记录自己编程学习过程和帮助别人少走弯路而写博客 这是我的 github https://github.com/Qiuner gitee https://gitee.com/Qiuner 如果本篇文章帮到了你 不妨点个赞吧~ 我会很高兴的 &#x1f604; (^ ~ ^) 想看更多 那就点个关注吧 我会…

48. 旋转图像/240. 搜索二维矩阵 II

48. 旋转图像 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 示例 &#xff1a; 输入&#xff1a;matrix [[5,1,9,11],[2,4,…

【STM32】西南交大嵌入式实验四:异步串行通信

实验板串行相关电路&#xff1a; 数码管等外设的电路前面的实验已经提到过&#xff0c;不再赘述。 使用cubeMX配置项目&#xff1a; 因为数码管&#xff0c;蜂鸣器这些外设对应的引脚在前面的项目里已经配置过&#xff0c;可以选择前面的一个项目&#xff0c;另存为&#xff0…

[Kubernetes] sealos部署 K8s 集群

文章目录 1.sealos 介绍2.操作系统基础配置3.安装部署 K8s4.验证 K8s 集群5.部署测试资源 1.sealos 介绍 Sealos 是一个基于 Kubernetes 内核的云操作系统发行版。它采用云原生方式&#xff0c;摒弃传统的云计算架构&#xff0c;转向以 Kubernetes 为云内核的新架构。这使得企…

【训练与预测】02 - 完整的模型验证套路

02 - 完整的模型验证套路 模型图 验证一个模型就是指使用已经训练好的模型&#xff0c;然后给它提供输入。 test.py import torch import torchvision from PIL import Imagedevice torch.device("cuda" if torch.cuda.is_available() else "cpu") ima…

C/C++ 初级球球大作战练手

效果演示&#xff1a; https://live.csdn.net/v/385490 游戏初始化 #include <stdbool.h> #include<stdio.h> #include<stdlib.h> #include<time.h> #include<graphics.h> #include <algorithm> #include<math.h> #include<mmsy…

飞天使-k8s知识点31-rancher的正确打开方式

文章目录 安装之前优化一下内核参数以及系统内核版本 rancher安装主要是使用以下命令nginx的配置为解决办法 安装之前优化一下内核参数以及系统内核版本 内核版本 4.17 cat > /etc/modules-load.d/iptables.conf <<EOF ip_tables iptable_filter EOF 然后重启服务器…

燃气电力瓶装气行业入户安检小程序开发

我们开发的小区业主入户安检小程序&#xff0c;旨在满足燃气、电力以及其他需要入户安检的行业需求。该程序支持自定义安检项目&#xff0c;实现线下实地安检与线上数据保存的完美结合。在安检过程中&#xff0c;我们可以拍照或录像&#xff0c;以确保安检的透明性和可追溯性&a…

亚马逊是如何铺设多个IP账号实现销量大卖的?

一、针对亚马逊平台机制&#xff0c;如何转变思路&#xff1f; 众所周知&#xff0c;一个亚马逊卖家只能够开一个账号&#xff0c;一家店铺&#xff0c;这是亚马逊平台明确规定的。平台如此严格限定&#xff0c;为的就是保护卖家&#xff0c;防止卖家重复铺货销售相同的产品&a…

Python | Leetcode Python题解之第75题颜色分类

题目&#xff1a; 题解&#xff1a; class Solution:def sortColors(self, nums: List[int]) -> None:n len(nums)p0, p2 0, n - 1i 0while i < p2:while i < p2 and nums[i] 2:nums[i], nums[p2] nums[p2], nums[i]p2 - 1if nums[i] 0:nums[i], nums[p0] num…