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.mfbz.cn/a/782399.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

运维Tips | Ubuntu 24.04 安装配置 xrdp 远程桌面服务

[ 知识是人生的灯塔,只有不断学习,才能照亮前行的道路 ] Ubuntu 24.04 Desktop 安装配置 xrdp 远程桌面服务 描述:Xrdp是一个微软远程桌面协议(RDP)的开源实现,它允许我们通过图形界面控制远程系统。这里使…

Banana Pi BPI-M5 Pro 低调 SBC 采用 Rockchip RK3576 八核 Cortex-A72/A53 AIoT SoC

Banana Pi BPI-M5 Pro,也称为 Armsom Sige5,是一款面向 AIoT 市场的低调单板计算机 (SBC),由 Rockchip RK3576 八核 Cortex-A72/A53 SoC 驱动,提供Rockchip RK3588和RK3399 SoC 之间的中档产品。 该主板默认配备 16GB LPDDR4X 和…

学习笔记——动态路由——OSPF(特殊区域)

十、OSPF特殊区域 1、技术背景 早期路由器靠CPU计算转发,由于硬件技术限制问题,因此资源不是特别充足,因此是要节省资源使用,规划是非常必要的。 OSPF路由器需要同时维护域内路由、域间路由、外部路由信息数据库。当网络规模不…

NAT:地址转换技术

为什么会引入NAT? NAT(网络地址转换)的引入主要是为了解决两个问题 IPv4地址短缺:互联网快速发展,可用的公网IP地址越来越少。网络安全:需要一种方法来保护内部网络不被直接暴露在互联网上。 IPv4 &…

人脸检测(Python)

目录 环境: 初始化摄像头: 初始化FaceDetector对象: 获取摄像头帧: 获取数据: 绘制数据: 显示图像: 完整代码: 环境: cvzone库:cvzone是一个基于…

RAG实践:ES混合搜索BM25+kNN(cosine)

1 缘起 最近在研究与应用混合搜索, 存储介质为ES,ES作为大佬牌数据库, 非常友好地支持关键词检索和向量检索, 当然,支持混合检索(关键词检索向量检索), 是提升LLM响应质量RAG(Retri…

spring boot(学习笔记第十二课)

spring boot(学习笔记第十二课) Spring Security内存认证&#xff0c;自定义认证表单 学习内容&#xff1a; Spring Security内存认证自定义认证表单 1. Spring Security内存认证 首先开始最简单的模式&#xff0c;内存认证。 加入spring security的依赖。<dependency>…

【TB作品】51单片机 Proteus仿真 MAX7219点阵驱动数码管驱动

1、8乘8点阵模块&#xff08;爱心&#xff09; 数码管测试程序与仿真 实验报告: MAX7219 数码管驱动测试 一、实验目的 通过对 MAX7219 芯片的编程与控制&#xff0c;了解如何使用单片机驱动数码管显示数字&#xff0c;并掌握 SPI 通信协议的基本应用。 二、实验器材 51…

触发器编程-创建(CREATE TRIGGER)、删除(DROP TRIGGER)

一、定义 1、触发器&#xff08;Trigger&#xff09;是用户对某一表中的数据做插入、更新和删除操作时被处罚执行的一段程序&#xff0c;通常我们使用触发器来检查用户对表的操作是否合乎整个应用系统的需求&#xff0c;是否合乎商业规则以维持表内数据的完整性和正确性 2、一…

SPL-404:如何彻底改变Solana上的NFT与DeFi

在不断发展的数字资产领域中&#xff0c;非同质化Token&#xff08;NFT&#xff09;已成为一股革命性力量&#xff0c;彻底改变了我们对数字所有权的看法和互动方式。从艺术和收藏品到游戏和虚拟房地产&#xff0c;NFT吸引了创作者、投资者和爱好者的想象力。 本指南将带您进入…

力扣-双指针1

何为双指针 双指针指向同一数组&#xff0c;然后配合着进行搜索等活动。 滑动窗口的时候很好使用。 167.两数之和Ⅱ-输入有序数组 167. 两数之和 II - 输入有序数组 题目 给你一个下标从 1 开始的整数数组 numbers &#xff0c;该数组已按 非递减顺序排列 &#xff0c;请你从…

[Flink]三、Flink1.13

11. Table API 和 SQL 如图 11-1 所示&#xff0c;在 Flink 提供的多层级 API 中&#xff0c;核心是 DataStream API &#xff0c;这是我们开发流 处理应用的基本途径&#xff1b;底层则是所谓的处理函数&#xff08; process function &#xff09;&#xff0c;可以访…

Android 简单快速实现 下弧形刻度尺(滑动事件)

效果图&#xff1a; 直接上代码&#xff1a; package com.my.view;import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Pai…

iptables实现端口转发ssh

iptables实现端口转发 实现使用防火墙9898端口访问内网front主机的22端口&#xff08;ssh连接&#xff09; 1. 防火墙配置(lb01) # 配置iptables # 这条命令的作用是将所有目的地为192.168.100.155且目标端口为19898的TCP数据包的目标IP地址改为10.0.0.148&#xff0c;并将目标…

基于Java+SpringMvc+Vue技术的在线学习交流平台的设计与实现---60页论文参考

博主介绍&#xff1a;硕士研究生&#xff0c;专注于Java技术领域开发与管理&#xff0c;以及毕业项目实战✌ 从事基于java BS架构、CS架构、c/c 编程工作近16年&#xff0c;拥有近12年的管理工作经验&#xff0c;拥有较丰富的技术架构思想、较扎实的技术功底和资深的项目管理经…

【PB案例学习笔记】-29制作一个调用帮助文档的小功能

写在前面 这是PB案例学习笔记系列文章的第29篇&#xff0c;该系列文章适合具有一定PB基础的读者。 通过一个个由浅入深的编程实战案例学习&#xff0c;提高编程技巧&#xff0c;以保证小伙伴们能应付公司的各种开发需求。 文章中设计到的源码&#xff0c;小凡都上传到了gite…

【Spring Boot】关系映射开发(三):多对多映射

《JPA 从入门到精通》系列包含以下文章&#xff1a; Java 持久层 API&#xff1a;JPA认识 JPA 的接口JPA 的查询方式基于 JPA 开发的文章管理系统&#xff08;CRUD&#xff09;关系映射开发&#xff08;一&#xff09;&#xff1a;一对一映射关系映射开发&#xff08;二&#…

Java_网络编程

网络通信的关键三要素 IP、端口号、协议 IP地址 IP地址&#xff08;Internet Protocol&#xff09;&#xff1a;全程“互联网协议地址”&#xff0c;是分配给上网设备的唯一标志。 IP地址有两种形式&#xff1a;IPv4、IPv6 InetAddress 代表IP地址 InetAddress 的常用方法…

【算法训练记录——Day42】

Day42——动态规划Ⅳ 1.leetcode_1049最后一块石头的重量II2.leetcode_494目标和3.leetcode_474一和零 1.leetcode_1049最后一块石头的重量II 思路&#xff1a;石头只能用一次。。。怎么才能让碰撞后重量最小呢&#xff0c;还要转换成动态规划&#xff0c;难以理解。。 看题解&…

J024_打印电影的全部信息

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