ARM架构以及程序运行解析

news2024/12/26 10:25:19

文章目录

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.coloradmin.cn/o/1905807.html

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

相关文章

【TB作品】51单片机 Proteus仿真 00001仿真实物PID电机调速系统

实验报告:Proteus 仿真 PID 电机调速系统 一、实验背景 PID(比例-积分-微分)控制器广泛应用于工业控制系统中,用于调节各种物理变量。本实验的目的是通过 Proteus 仿真软件设计并实现一个 PID 电机调速系统,以控制直…

记一次酣畅淋漓的UDF提权(Linux)

外网打点就不放了,翻了一下具备suid权限的命令,没啥结果。 可疑的命令是/usr/lib/dbus-1.0/dbus-daemon-launch-helper但是没有找到用这个命令提权的资料。 弹shell后翻找一下源码,/app/api.py文件中链接了mysql,事出反常必有妖&…

水冷液冷负载系统的六种基本类型

您可以选择六种基本类型的冷却系统,以满足负载的冷却需求。每个人都有其优点和缺点。本文旨在识别不同类型的冷却系统并确定它们的优缺点,以便您可以根据自己的需求做出明智的选择。 液体冷却系统有六种基本类型: 1.液对液 2.闭环干燥系统…

【论文阅读】AsyncDiff: Parallelizing Diffusion Models by Asynchronous Denoising

论文:2406.06911 (arxiv.org) 代码:czg1225/AsyncDiff: Official implementation of "AsyncDiff: Parallelizing Diffusion Models by Asynchronous Denoising" (github.com) 简介 异步去噪并行化扩散模型。提出了一种新的扩散模型分布式加…

J024_打印电影的全部信息

一、需求描述 展示多部电影的信息。 电影信息包括:电影名称、电影得分、电影票价格。 二、代码实现 2.1 Movie类 package com.itheima.collection;public class Movie {//电影名称private String name;//电影得分private int score;//电影票价格private double…

前端面试题(CSS篇五)

一、设备像素、css 像素、设备独立像素、dpr、ppi 之间的区别? 设备像素指的是物理像素,一般手机的分辨率指的就是设备像素,一个设备的设备像素是不可变的。 css像素和设备独立像素是等价的,不管在何种分辨率的设备上,…

LLaMA2模型开源商用:实力比肩ChatGPT,探索AI新高度

【大模型】可商用且更强的 LLaMA2 来了 LLaMA2 简介 论文 GitHubhuggingface模型列表训练数据训练信息模型信息 许可证参考 LLaMA2 简介 2023年7月19日:Meta 发布开源可商用模型 Llama 2。 Llama 2是一个预训练和微调的生成文本模型的集合,其规模从…

java中反射(Reflection)的4个作用

java中反射(Reflection)的4个作用 作用1、在运行时判断任意一个对象所属的类作用2、在运行时构造任意一个类的对象作用3、在运行时判断任意一个类所具有的成员变量和方法作用4、在运行时调用任意一个对象的方法总结 💖The Begin💖…

shared_ptr 线程安全

为什么 shared_ptr 可以安全地在多个线程中共享? 循环引用 因为shared_ptr std::shared_ptr 的引用计数是线程安全的。这意味着你可以在多个线程中安全地拷贝、赋值和销毁 std::shared_ptr。然而,访问或修改 shared_ptr 所指向的对象时,需要…

SpringBoot彩蛋之定制启动画面

写在前面 在日常开发中,我们经常会看到各种各样的启动画面。例如以下几种 ① spring项目启动画面 ② mybatisplus启动画面 ③若依项目启动画面 还有很多各式各样好看的启动画面,那么怎么定制这些启动画面呢? 一、小试牛刀 ① 新建一个Spr…

聊聊数据库变更管控的白屏化

在前文中介绍了当涉及到数据库相关的变更如数据更新或者误删表等误操作时,通过延迟库或者闪回等功能来恢复业务,这些已经属于事后的故障处理了。当故障发生后,所要面临的是故障影响的不可控,所面临的损失也是不可预估的。就像最近…

【Excel】求和带文字的数据

目录标题 1. 给出样例2. CtrlE3. CtrlH → A替换为 → 全部替换 1. 给出样例 2. CtrlE 3. CtrlH → A替换为 → 全部替换

从零开始的python学习生活

pycharm部分好用快捷键 变量名的定义 与之前学习过的语言有所不同的是,python中变量名的定义更加的简洁 such as 整形。浮点型和字符串的定义 money50 haha13.14 gaga"hello"字符串的定义依然是需要加上引号,也不需要写;了 字符…

重温express

前言 很久之前囫囵吞枣的学过一点node,最近决定用nodevue写个博客项目,所以重新学习了express的相关内容。 初始搭建 创建项目 npm init给项目命名创建项目终端进入项目,安装express依赖,npm i expressjs文件中引入express使用…

「C++系列」C++ 常量知识点-细致讲解

文章目录 一、C 常量定义1. 使用#define预处理指令2. 使用const关键字3. 局部常量4. 全局常量5. 指针常量6. 枚举(Enumerations)7. constexpr(C11及以后) 二、C 整数常量1. 十进制整数常量2. 八进制整数常量3. 十六进制整数常量4.…

RAG理论:ES混合搜索BM25+kNN(cosine)以及归一化

接前一篇:RAG实践:ES混合搜索BM25+kNN(cosine) https://blog.csdn.net/Xin_101/article/details/140230948 本文主要讲解混合搜索相关理论以及计算推导过程, 包括BM25、kNN以及ES中使用混合搜索分数计算过程。 详细讲解: (1)ES中如何通过BM25计算关键词搜索分数; (2)…

Postman使用指南①网页版使用

postman官网地址:Postman API Platform 进入后点击右上角免费注册,注册后登录 登录之后即可在网页使用,无需下载

static的理论学习

在说到static之前,需要先明确变量类型: 而在聊到变量类型之前我们可以将变量的两个属性好好学一学 变量的两个属性 作用域(scope): 从内存的角度来看,就是变量存放在栈(stack)中&…

最新版Python安装教程

一、安装Python 1.下载Python 访问Python官网: https:/www.oython.orgl 点击downloads按钮,在下拉框中选择系统类型(windows/Mac OS./Linux等) 选择下载最新稳定版本的Python 以下内容以演示安装Windows操作系统64位的python 左边是稳定发布版本Stabl…

6000字以上论文参考:基于Java+SpringMvc+Vue技术的实验室管理系统设计与实现

可参考:基于JavaSpringMvcVue技术的实验室管理系统设计与实现(6000字以上论文参考)-CSDN博客 论文参考: