ARM架构以及程序运行解析

文章目录

1. ARM架构

2. ARM处理器程序运行的过程

3. 示例

3. 基于ARM架构的STM32单片机

1. 运行模式

2. 寄存器组

3. STM32的基本结构

4. STM32的运行模式

4. 寄存器组详解

1. 未备份寄存器

2. 备份寄存器

3. 程序计数器

4. 程序状态寄存器

5. CPSR和SPSR寄存器


1. ARM架构

ARM架构(Advanced RISC Machines)是目前最为广泛使用的微处理器架构之一,广泛应用于移动设备、嵌入式系统、物联网设备等领域。

1. ARM架构的基本特点

RISC(精简指令集计算机)架构

  • 简化指令集:ARM采用RISC架构,具有简化的指令集,每条指令通常在一个时钟周期内完成。
  • 高效能比:RISC架构使得ARM处理器在同等功耗下,具有较高的性能和能效比。

寄存器数量多

  • 通用寄存器:ARM处理器通常具有16个通用寄存器(R0-R15),这些寄存器用于存储操作数和中间结果。
  • 专用寄存器:包括程序计数器(PC)、堆栈指针(SP)和链接寄存器(LR)等。

负载/存储架构

  • Load/Store架构:所有的数据处理指令只能在寄存器之间进行,访问内存的操作通过专门的Load和Store指令完成。

条件执行

  • 条件指令:ARM处理器的大多数指令都可以根据条件执行,这减少了分支指令的数量,提高了代码效率。

低功耗设计

  • 低功耗特性:ARM处理器设计注重低功耗,这使得其非常适合移动设备和电池供电的嵌入式系统。

ARM架构的主要版本

ARMv4

  • ARM7TDMI:这是早期的ARM架构版本,支持32位指令集,应用于许多早期的嵌入式系统。

ARMv5

  • ARM9:引入了一些性能优化和新指令,改进了指令流水线,提高了处理性能。

ARMv6

  • ARM11:进一步改进了指令集和流水线性能,增加了对多媒体指令集的支持。

ARMv7

  • Cortex-A系列:面向高性能应用,如智能手机和平板电脑。
  • Cortex-R系列:面向实时处理应用,如汽车电子和工业控制。
  • Cortex-M系列:面向低功耗、低成本应用,如微控制器和物联网设备。

ARMv8

  • Cortex-A53/A57:支持64位处理,提高了性能和内存寻址能力,广泛应用于高性能计算领域。

2. ARM处理器程序运行的过程

ARM芯片属于精简指令集计算机(RISC:Reduced Instruction Set Computing),其指令集设计比较简单,具有以下特点:

  1. 对内存只有读、写指令

    • ARM处理器的指令集设计非常简化,主要通过读写指令与内存进行交互。所有的运算都是在寄存器中完成的,只有数据的读取和写入才会涉及内存访问。
  2. 对数据的运算是在CPU内部实现

    • 数据的所有运算都在CPU的寄存器中进行,这样可以提高运算速度,因为寄存器的访问速度远高于内存。
  3. 使用RISC指令的CPU复杂度小,易于设计

    • 由于指令集简单,RISC架构的CPU设计相对较为简易,能够实现更高的性能和能效。

3. 示例

为了更好地理解ARM处理器的工作过程,我们来看一个简单的加法运算:a = a + b。这个运算需要经过以下4个步骤才能实现:

  1. 读取 a 的值:读指令从内存中读取变量 a 的值,并将其存储到CPU的寄存器中。

  2. 读取 b 的值:读指令从内存中读取变量 b 的值,并将其存储到CPU的另一个寄存器中。

  3. 执行加法运算:CPU执行加法指令,将寄存器中存储的 ab 的值相加,并将结果存储到另一个寄存器中。

  4. 写入结果:写指令将加法运算的结果从寄存器写回内存中,存储在变量 a 的位置。

继续深入分析ARM处理器的操作过程。

内部寄存器和ALU

  • 寄存器(R0-R15):ARM处理器内部包含多个通用寄存器,用于存储操作数和中间结果。
  • 算术逻辑单元(ALU):用于执行算术和逻辑运算,如加法、减法、逻辑与或非等操作。

假设我们有两个变量 ab,它们的初始值分别为 0x120x34。我们需要将这两个值相加,并将结果存储回变量 a 中。

指令执行步骤

  1. 从内存读取a的值到寄存器R0
  2. 从内存读取b的值到寄存器R1
  3. 将寄存器R0和R1中的值相加,结果存储在寄存器R0
  4. 将寄存器R0中的结果写回内存中的变量a

对应的ARM汇编指令如下:

  1. LDR R0, [a]:加载变量 a 的值到寄存器 R0
  2. LDR R1, [b]:加载变量 b 的值到寄存器 R1
  3. ADD R0, R0, R1:将 R0R1 中的值相加,结果存储在 R0
  4. STR R0, [a]:将 R0 中的结果存储回内存中的变量 a

3. 基于ARM架构的STM32单片机

STM32单片机是基于ARM Cortex-M系列内核的微控制器,广泛应用于嵌入式系统中。以下是对STM32单片机基础知识的详细介绍,包括运行模式、寄存器组等。

1. 运行模式

ARM Cortex-M内核支持多种运行模式,这些模式用于处理不同的操作需求。主要包括:

1.1 Thread Mode(线程模式)

  • 描述:这是正常的执行模式,通常用于执行主程序和任务。
  • 进入方式:复位时,处理器进入线程模式;通过异常返回指令(如BX LR)也可以进入线程模式。
  • 特性:在此模式下,CPU可以运行主程序和一般的应用代码。

1.2 Handler Mode(处理模式)

  • 描述:用于处理异常和中断。
  • 进入方式:当中断或异常发生时,处理器自动进入处理模式。
  • 特性:在此模式下,CPU处理中断服务程序(ISR)和异常处理程序。

2. 寄存器组

ARM Cortex-M内核包含一组通用寄存器和专用寄存器,用于数据存储和控制操作。

2.1 通用寄存器

  • R0-R12:通用工作寄存器,用于数据运算和临时存储。
  • R13(SP, Stack Pointer):堆栈指针,指向当前堆栈顶。
    • MSP(Main Stack Pointer):主堆栈指针,复位后默认使用。
    • PSP(Process Stack Pointer):进程堆栈指针,用于线程模式下的进程堆栈。
  • R14(LR, Link Register):链接寄存器,存储子程序返回地址。
  • R15(PC, Program Counter):程序计数器,指向当前执行指令的地址。

2.2 特殊功能寄存器

  • xPSR(Program Status Register):程序状态寄存器,包含程序状态、当前异常号等信息。
  • PRIMASK:中断屏蔽寄存器,控制全局中断的屏蔽。
  • FAULTMASK:故障屏蔽寄存器,控制所有故障中断的屏蔽。
  • BASEPRI:基优先级寄存器,用于设置中断屏蔽的基优先级。
  • CONTROL:控制寄存器,控制堆栈指针的选择和特权级别。

3. STM32的基本结构

STM32单片机内部结构包含多个功能模块,每个模块通过总线互连,实现复杂的嵌入式应用。

3.1 内核(Core)

  • Cortex-M内核:负责指令执行和处理任务。
  • NVIC(Nested Vectored Interrupt Controller):嵌套向量中断控制器,管理和处理中断请求。

3.2 存储器(Memory)

  • Flash存储器:用于存储程序代码和常量数据。
  • SRAM(Static RAM):用于存储临时数据和变量。
  • EEPROM(仅部分型号支持):用于存储需要掉电保持的数据。

3.3 外设(Peripherals)

  • GPIO(General-Purpose Input/Output):通用输入输出接口,用于控制和读取外部设备。
  • USART/UART:通用同步/异步收发器,用于串行通信。
  • SPI/I2C:串行外设接口和I2C接口,用于与其他设备进行同步通信。
  • ADC/DAC:模数转换器和数模转换器,用于模拟信号的处理。
  • Timers:定时器,用于定时、计数、PWM输出等。

4. STM32的运行模式

4.1 运行模式(Run Mode)

  • 正常的工作模式,CPU和所有外设正常工作。
  • 功耗相对较高,适用于处理主要任务和高性能应用。

4.2 睡眠模式(Sleep Mode)

  • CPU停止工作,但外设和中断系统继续运行。
  • 降低功耗,适用于需要快速响应的低功耗应用。

4.3 停止模式(Stop Mode)

  • 停止大部分外设和时钟,仅保留最低功耗的部分模块。
  • 极大降低功耗,适用于需要较长时间休眠的应用。

4.4 待机模式(Standby Mode)

  • 关闭所有外设和时钟,仅保留少量低功耗模块。
  • 最低功耗模式,适用于长时间休眠的应用。

4. 寄存器组详解

在STM32单片机中,ARM Cortex-M内核的寄存器组主要包括通用寄存器、专用寄存器、程序状态寄存器等。以下是对这些寄存器的详细介绍:

1. 未备份寄存器

未备份寄存器指的是在所有运行模式下都共享的寄存器。这些寄存器包括 R0R7,它们在不同的模式下没有独立的备份,因此在模式切换时其数据可能会被破坏。

  • R0-R7:通用工作寄存器,用于数据运算和临时存储。

2. 备份寄存器

备份寄存器在不同的模式下有独立的物理寄存器,确保在模式切换时数据不会被破坏。STM32单片机中常见的备份寄存器包括:

  • R8-R12:在快速中断模式(FIQ)下,这些寄存器有独立的备份,以保证快速中断处理的效率。
  • R13(SP, Stack Pointer):堆栈指针,有多个物理寄存器对应不同的模式,确保堆栈数据的安全。
  • R14(LR, Link Register):链接寄存器,存储子程序返回地址。不同模式下也有独立的备份。

例如,在FIQ模式下,R8_fiqR12_fiq 是独立的,其他模式下则共享相应的寄存器。

3. 程序计数器

**程序计数器(PC, Program Counter, R15)**保存着当前执行指令的地址值。Cortex-M内核是三级流水线设计,取指令、译码、执行,循环执行。

  • R15(PC):当前执行指令地址 + 8 个字节。
  • 例如,当正在执行第一条指令的同时,也在取第二条指令和译码第三条指令。R15总是指向当前正在执行的指令地址加8个字节。

4. 程序状态寄存器

**程序状态寄存器(PSR)**包括当前程序状态寄存器(CPSR)和备份程序状态寄存器(SPSR)。

  • CPSR:当前程序状态寄存器,包含条件标志位、中断禁用位、当前执行模式标志等。
  • SPSR:备份程序状态寄存器,特定异常中断发生时,用于保存CPSR的值,当异常退出时恢复。

所有运行模式都共用一个CPSR物理寄存器,因此在模式切换时,需要通过SPSR来保存和恢复状态。

5. CPSR和SPSR寄存器

在STM32单片机中,ARM Cortex-M内核的程序状态寄存器(PSR)包含当前程序状态寄存器(CPSR)和备份程序状态寄存器(SPSR)。以下是对这些寄存器的详细解释。

1. CPSR和SPSR寄存器结构

CPSR(Current Program Status Register)寄存器保存了当前的程序状态,包括条件标志、中断屏蔽位、当前执行模式等。SPSR(Saved Program Status Register)寄存器用于在发生异常时保存CPSR的值,以便在异常返回时恢复。

CPSR和SPSR寄存器的结构如下:

标志位描述
31N负数标志,结果为负时置1
30Z零标志,结果为零时置1
29C进位标志,加法操作中结果产生进位时置1,减法操作中结果产生借位时置0
28V溢出标志,带符号数运算结果溢出时置1
27Q只有在ARM v5TE架构支持,累积/饱和标志
26-25IT[1:0]与IT[7:2]一起组成IT[7:0],作为IF-THEN指令执行状态标志位
24J控制指令执行状态,表明本指令是ARM指令还是Thumb指令(Jazelle模式)
23-20Reserved保留位
19-16GE[3:0]SIMD指令有效,大于或等于
15-10Reserved保留位
9E大小端控制位,E=1/0表示大/小端模式
8A禁止异步中断位,A=1表示禁止异步中断
7I禁止IRQ中断位,I=1表示禁止IRQ中断
6F禁止FIQ中断位,F=1表示禁止FIQ中断
5T控制指令执行状态,表明本指令是ARM指令还是Thumb指令
4-0M[4:0]运行模式控制位,表示当前处理器的运行模式

 

J(bit 24)和T(bit 5):控制指令执行状态

  • 表明这个指令是ARM指令还是Thumb指令。
JT描述
00ARM
01Thumb
11ThumbEE
10Jazelle

M[4:0](bit 4-0):运行模式控制位

  • 表示当前处理器的运行模式。
M[4:0]运行模式
10000User 模式
10001FIQ 模式
10010IRQ 模式
10011Supervisor (SVC) 模式
10110Monitor (MON) 模式
10111Abort (ABT) 模式
11010Hyp (HYP) 模式
11011Undef (UND) 模式
11111System (SYS) 模式

CPSR和SPSR寄存器在ARM Cortex-M内核中扮演重要角色,用于保存和恢复程序状态。理解这些寄存器的结构和作用,可以更好地控制STM32单片机的运行模式和中断处理。通过详细掌握CPSR寄存器中的标志位和控制位,可以提高系统的可靠性和运行效率。

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

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

相关文章

【Unity】UGUI的基本介绍

Unity的UGUI(Unity User Interface)是Unity引擎内自带的UI系统,官方称之为UnityUI,是目前Unity商业游戏开发中使用最广泛的UI系统开发解决方案。以下是关于Unity的UGUI的详细介绍: 一、UGUI的特点 灵活性&#xff1a…

Python 爬虫 tiktok API接口获取tiktok用户关注列表

此接口可获取tiktok用户关注列表。若有需要,请点击文末链接联系我们。 详细采集页面如下https://www.tiktok.com/quanap_official 请求API http://api.xxxx.com/tt/user/following?user_id7252644648840381445&count10&offset0&tokentest 请求参数 返…

改进Transformer模型其实也不难

声明:文章是从本人公众号中复制而来,因此,想最新最快了解各类智能优化算法及其改进的朋友,可关注我的公众号:强盛机器学习,不定期会有很多免费代码分享~ 目录 原理简介 数据介绍 结果展示 完整代码 之前…

【学术会议征稿】第五届计算机工程与智能控制学术会议(ICCEIC 2024)

第五届计算机工程与智能控制学术会议(ICCEIC 2024) 2024 5th International Conference on Computer Engineering and Intelligent Control 第五届计算机工程与智能控制学术会议(ICCEIC 2024)将于2024年10月18日至22日在广州举办&#xff0…

LDR6282-显示器:从技术革新到视觉盛宴

显示器,作为我们日常工作和娱乐生活中不可或缺的一部分,承载着将虚拟世界呈现为现实图像的重要使命。它不仅是我们与电子设备交互的桥梁,更是我们感知信息、享受视觉盛宴的重要窗口。显示器在各个领域的应用也越来越广泛。在办公领域&#xf…

Gradle使用插件SonatypeUploader-v2.6上传到maven组件到远程中央仓库

本文基于sonatypeUploader 2.6版本 插件的使用实例:https://github.com/jeadyx/SonatypeUploaderSample 发布步骤 提前准备好sonatype账号和signing配置 注:如果没有,请参考1.0博文的生成步骤: https://jeady.blog.csdn.net/art…

收银系统源码-营销活动-幸运抽奖

1. 功能描述 营运抽奖:智慧新零售收银系统,线上商城营销插件,商户/门店在小程序商城上设置抽奖活动,中奖人员可内定; 2.适用场景 新店开业、门店周年庆、节假日等特定时间促销;会员拉新,需会…

SQLServer连接异常

2. 文件夹对应的是[internal].[folders]表,与之相关的权限在[internal].[folder_permissions]表 项目对应的是[internal].[projects]表,与之相关的权限在[internal].[project_permissions],版本在[internal].[object_versions]表。 环境对应…

MongoDB本地配置分片

mongodb server version: 7.0.12 社区版 mongo shell version: 2.2.10 平台:win10 64位 控制台:Git Bash 分片相关节点结构示意图 大概步骤 1. 配置 配置服务器 副本集 (最少3个节点) -- 创建数据目录 mkdir -p ~/dbs/confi…

华为eNSP:HCIA汇总实验

本次拓扑实验需求: 1、内网地址用DHCP 2、VLAN10不能访问外网 3、使用静态NAT 实验用到的技术有DHCP、划分VLAN、IP配置、VLAN间的通信:单臂路由、VLANIF,静态NAT、基本ACL DHCP是一种用于自动分配IP地址和其他网络参数的协议。 划分VLA…

新型模型架构(参数化状态空间模型、状态空间模型变种)

文章目录 参数化状态空间模型状态空间模型变种Transformer 模型自问世以来,在自然语言处理、计算机视觉等多个领域得到了广泛应用,并展现出卓越的数据表示与建模能力。然而,Transformer 的自注意力机制在计算每个词元时都需要利用到序列中所有词元的信息,这导致计算和存储复…

简单介绍 Dagger2 的入门使用

依赖注入 在介绍 Dagger2 这个之前,必须先解释一下什么是依赖注入,因为这个库就是用来做依赖注入的。所以这里先简单用一句话来介绍一下依赖注入: 依赖注入是一种设计模式,它允许对象在运行时注入其依赖项。而不是在编译时确定&a…

Andorid 11 InputDispatcher FocusedApplication设置过程分析

在Input ANR中,有一类ANR打印的reason 为 “xx does not have a focused window” ,表明 输入事件 5s 内,只有FocusedApplication,而没找到focused window。本文分析下FocusedApplication的设置过程。 setFocusedApp 源码路径&am…

用PlantUML可视化显示JSON

概述 PlantUML除了绘制UML中的一些标准图之外,也可以以图形化的方式显示一些其他图形或数据形式的结构,这其中就包括JSON。 它以一种简单且优美的图形形式,表达了JSON的结构。你可以用它来作为设计JSON数据文件的依据,辅助设计或…

day01:项目概述,环境搭建

文章目录 软件开发整体介绍软件开发流程角色分工软件环境 外卖平台项目介绍项目介绍定位功能架构 产品原型技术选型 开发环境搭建整体结构:前后端分离开发前后端混合开发缺点前后端分离开发 前端环境搭建Nginx 后端环境搭建熟悉项目结构使用Git进行版本控制数据库环…

【C++】AVL树(旋转、平衡因子)

🌈个人主页:秦jh_-CSDN博客🔥 系列专栏:https://blog.csdn.net/qinjh_/category_12575764.html?spm1001.2014.3001.5482 ​ 目录 前言 AVL树的概念 节点 插入 AVL树的旋转 新节点插入较高左子树的左侧---左左:…

【C++】stack和queue的模拟实现 双端队列deque的介绍

🔥个人主页: Forcible Bug Maker 🔥专栏: STL || C 目录 🌈前言🔥stack的模拟实现🔥queue的模拟实现🔥deque(双端队列)deque的缺陷 🌈为什么选择…

七、Docker常规软件安装

目录 一、总体步骤 二、安装tomcat 1、docker hub上查找tomcat镜像 三、安装MySQL 1、查看MySQL镜像 2、拉取MySQL镜像到本地,本次拉取MySQL5.7 3、使用MySQL镜像创建容器 4、使用Windows数据库工具,连接MySQL实例 5、常见问题 6、创建MySQL容器实例 7、新…

DDP:微软提出动态detection head选择,适配计算资源有限场景 | CVPR 2022

DPP能够对目标检测proposal进行非统一处理,根据proposal选择不同复杂度的算子,加速整体推理过程。从实验结果来看,效果非常不错 来源:晓飞的算法工程笔记 公众号 论文: Should All Proposals be Treated Equally in Object Detect…

同声传译app哪个好免费?对话交流推荐这5个

暑期到,也是旅游出行的好日子~自打周边不少国家都开放免签政策之后,出国游也变得更加方便了~对于外语水平不高的朋友来讲,想要保证出行体验,其实手上只要备好一个同声传译app就OK! 倘若你还不清楚都有哪些同声传译app…