ARM体系架构 从学校毕业开始算起,半路出家进入汽车电子领域已经有段时间了。平时的工作都是做一些应用层软件,对于底层软件知之甚少,单片机内部的软件运行机制更是一知半解。今天晚上下班终于翻开基础教材《嵌入式系统基础》[1],恶补了一下。为了让理解的更加深刻,所以把学习内容提炼提炼,做成学习笔记分享给大家。 最开始先介绍以下ARM架构,ARM是Advanced RISC Machines Limited公司推出的一种RISC处理器体系结构即相关技术。ARM占比所有32位嵌入式处理器的75%,成为占全世界最多数的32位架构。ARM处理器广泛使用在嵌入式系统设计,低耗电节能,非常适用移动通讯领域。消费性电子产品,例如可携式装置(PDA、移动电话、多媒体播放器、掌上型电子游戏,和计算机),电脑外设(硬盘、桌上型路由器),甚至导弹的弹载计算机等军用设施。 1 Soc的研发与生产方式 随着大规模集成电路制作工艺的发展,芯片上集中了多种功能模块包括CPU以及各种借口电路模块。芯片可以实现系统的功能,因此这种芯片被叫做片上系统(System on Chip,Soc)。计算机的这种片上系统(Soc)特别适合于嵌入式应用,所以也被叫做嵌入式处理器。 在Soc技术出现之前,CPU、接口模块以及功能模块都是单独的芯片,用户可以根据需要选择合适的芯片组成自己的系统,从而达到个性化的要求。但是这种系统体积大、功耗高、故障多因此现在都倾向于使用单片系统。 但是这样也带来新的问题:芯片生产商要求通过通用化提高效率,而用户要求的是个性化定制,所以在系统集成上就出现了用户和芯片制造商如何分工的问题。生产商与用户之间需要寻找合理的分工策略,从而使得芯片既有通用性也必须满足要求的个性定制。 目前半导体生产厂商为了集中精力尽可能短的时间内开发新产品,将处理器核心(CPU以及CPU通用功能模块)的研发工作交给第三方公司(例如ARM公司以及MIPS公司)。处理器核心的研发者既不设计芯片也不生产芯片,其产品只是一种处理器的体系架构及微处理器和相关功能模块的只是产权(Intellectual Property,IP)。而半导体芯片生产商则向处理器核心的研发者购买知识产权的使用权,然后根据市场的需求,在其基础上进行二次开发来生产适合各种类型应用的嵌入式处理芯片。
ARM处理器型号 2 ARM处理器核的结构
ARM内核架构 ARM内核进行运算的核心部件是算术逻辑运算单-ALU(arithmetic and logic unit)。它对两个操作数进行逻辑或者算术运算。为了提高嵌入式处理器的工作速度,以保证实时性的要求,ARM在处理器中尽可能多地设置了寄存器。ARM处理器共有37个32位寄存器。 3 冯•诺依曼结构及哈佛结构 冯•诺依曼结构也称普林斯顿结构,是一种将程序指令存储器和数据存储器合并在一起的存储器结构。程序指令存储地址和数据存储地址指向同一个存储器的不同物理地址,因此程序指令和数据的宽度相同。 哈佛结构是一种将程序指令存储和数据指令存储分开的存储器结构。中央处理器首先到程序存储器中读取程序指令内容,解码后得到数据地址,再到相应的数据存储器中读取数据,并进行下一步操作。程序指令存储和数据存储分开,可以使指令和数据有不同的数据宽度。 哈佛结构的微处理器通常具有较高的执行效率。ARM9、ARM10和ARM11属于哈佛结构。
冯•诺依曼结构 VS 哈佛结构 4 ARM处理器的运行模式 运行不同的程序所需的硬件资源不同,因此ARM处理器可以为程序提供7种不同的硬件资源组合,每一种硬件资源组合叫做一种运行模式。USR(用户模式):ARM处理器正常程序执行模式。FIQ(快速中断模式):用于高速数据传输或通道处理IRQ(中断模式):用于通用的中断处理SVC(管理模式):操作系统使用的保护模式ABT(终止模式):当数据或指令预取出错时进入的模式。SYS(系统模式):运行具有特权的操作系统任务。UND(未定义指令中止模式):当处理器试图执行未定义指令时进入的模式 现代计算机系统都有用户模式,只为用户程序提供了有限硬件资源的运行模式。相对于用户模式来说,对硬件资源的使用有某种特权的运行模式叫做特权模式(除了用户模式其他六种运行模式都是特权模式)。 5 ARM的两种工作状态 ARM的RISC体系结构的发展中已经提供了低功耗、小体积、高性能的方案。而为了解决代码长度的问题,ARM体系结构又增加了T变种,开发了一种新的指令体系,这就是Thumb指令集,它是ARM技术的一大特色。 Thumb是ARM体系结构的扩展。它有从标准32位ARM指令集抽出来的36条指令格式,可以重新编成16位的操作码。这能带来很高的代码密度。 支持Thumb的ARM体系结构的处理器状态可以方便的切换、运行到Thumb状态,在该状态下指令集是16位的Thumb指令集。 ARM指令集对比Thumb指令集:完成相同的操作,Thumb指令通常需要更多的指令,因此在对系统运行时间要求苛刻的应用场合ARM指令集更为适合;Thumb指令集没有包含进行异常处理时需要的一些指令,因此在异常中断时,还是需要使用ARM指令,这种限制决定了Thumb指令需要和ARM指令配合使用。 ARM处理器的工作状态由程序状态寄存器CPSR的D5位的值控制,ARM指令集和Thumb指令集都设有处理器工作状态切换指令,以供程序在执行过程中对处理器进行状态切换。启动时,处理器默认状态为ARM状态。 Thumb指令与ARM指令的时间效率和空间效率对比:Thumb代码所需的存储空间为ARM代码的60%~70%;Thumb代码使用的指令数比ARM代码多30%~40%;使用32位的存储器,ARM代码比Thumb代码快约40%;若使用16位存储器,则Thumb代码比ARM代码快40%~50%;与ARM代码相比较,使用Thumb代码,存储器的功耗会降低约30%。 若对系统的性能有较高要求,则应使用32位存储系统和ARM指令集;若对系统的成本及功耗有较高要求,则应使用16位存储系统和Thumb指令集。当然,若两者结合使用,充分发挥各自的优点,则会取得更好的效果。 6 ARM处理器的寄存器 ARM处理器共有37个寄存器,根据处理器的工作状态,这37个寄存器有两种不同的组织方式:ARM方式和Thumb方式。 6.1 ARM状态下寄存器的组织方式 虽然ARM处理器共有37个寄存器,但是根据处理器的运行模式,程序能够真正使用的只是其中的18个或者17个。 6.1.1 基础寄存器 两种或两种以上运行模式所共享的寄存器叫做基础寄存器。他们是R0~R15和CPSR,其中R0~R7、R15和CPSR为所有运行模式共享;R8~R12为除了快中断模式之外的其他所有运行模式共享;R13和R14为用户模式和系统模式共享,如下图所示:
6.1.2 模式私有寄存器 为了对数据进行保护,ARM为某些运行模式设置了一些只能在该运行模式下使用的私有寄存器,上图中带有后缀的寄存器均为私有寄存器。 ARM规定,当处理器在某种模式运行时,凡是与该模式私有寄存器序号相同的基本寄存器都将被禁用。例如在终止模式下,与该模式私有寄存器R13_abt~R14_abt序号相同的基础寄存器R13和R14就处于禁用状态。为了减少寄存器名称的数量,ARM规定,寄存器名称统一写为R<序号>方式,但是这个名称所对应的实际物理寄存器与处理器当前运行模式相关。也就是说,程序中的一个寄存器名称可能对应着多个物理寄存器,程序中的这个名称究竟指的是哪个物理寄存器,则由系统根据当前运行的模式来决定。 6.1.3 程序计数器R15(PC) 在ARM中,基础寄存器R15固定得作为程序计数器来使用。为了提高程序的可读性,通常用PC来标识。在CPU中,一条指令的执行简单的划分为:取指-译码-执行,三个部分[2]。PC中存放的是下一条将要“执行”的指令的地址,这里的执行并不是取指-译码-执行中的第三个步骤,而是指的将存放于内存中的指令输送进CPU中“准备执行”,那么第一步就要取指,PC中存放的是从内存中取指所需要的地址。ARM处理器的字长是32位,则一条汇编指令的长度也是32位,也就是四个字节,而内存中一个地址单是一个字节,也就是说一条指令要占据4个地址单。假设程序顺序执行(一条接一条,没有跳转),假设当前正在CPU中执行的指令A的首地址是0,也就是说指令A的存放位置是内存中的0—3这4个地址单。假设指令A后面紧跟着指令B,指令B后面紧跟指令C,如果顺序执行,按理来说pc中存放的地址应该是指令B的首地址,也就是PC=0+4。但是由于ARM处理器中采用了流水线的技术,假设是3级流水线,那么执行A处于三个步骤中的“执行”时,指令B已经开始进行“译码”,而真正开始“取指”的是指令C。也就是说,当指令A在运行的时候,PC中存放的地址应该是指令C的地址,也就是说PC=0+8。 6.1.4 程序状态寄存器PSR 基础寄存器R16专门用作程序状态寄存器。为了提高程序的可读性,程序中也可以称为PSR。
CPSR格式 ARM处理器中有6个PSR,当前程序状态寄存器CPSR是所有运行模式所共享的,而另外5个PSR为模式私有,用来对CPSR进行备份的寄存器叫做SPSR。 由于CPSR中保存的是程序当前运行模式的状态信息,所以当前运行模式发生变化时,为了防止这些信息丢失,ARM对每种异常运行模式都设置了一个与CPSR的格式完全相同的备份寄存器SPSR(Saved Progarm Status Register)。即当处理器进入异常运行模式时,系统会自动把CPSR的当前值转存到SPSR;当从异常模式退出时,再自动把当初保存到SPSR中的状态信息存回CPSR。 由于用户模式和系统模式不属于异常模式,所以这两个模式没有SPSR。 6.1.5 堆栈指针R13(SP) 堆栈是计算机存储数据的一种数据结构,SP的作用就是指示当前要出栈或入栈的数据,并在操作执行后自动递增或递减。 计算机中的堆栈主要用来保存临时数据,局部变量和中断/调用子程序程序的返回地址。程序中栈主要是用来存储函数中的局部变量以及保存寄存器参数。1) 保存现场;2) 传递参数:汇编代码调用 C 函数时,需传递参数;3) 保存临时变量:包括函数的非静态局部变量以及编译器自动生成的其他临时变量; 6.1.6 链接寄存器R14(LR) 寄存器R14也称为子程序链接寄存器(Subroutine Link Register)或链接寄存器LR。当执行子程序调用指令BL时,R14会备份R15(程序计数器PC)的内容,以便子程序结束后能使程序正确地返回。 6.2 Thumb状态下寄存器的组织方式 Thumb状态下的寄存器同样也分为模式相关寄存器和模式无关寄存器两种,其命名及使用方式也与ARM状态下的方式一样。但Thumb状态下的寄存器集是ARM状态下寄存器集的一个子集。
7 存储器的组织 7.1 数据存储方式 ARM是一种32位处理器,即ARM处理器处理的数据通常是以32位二进制位基本单位的。ARM中的一个32位数叫做一个字。在存储器中,ARM的一个基本数据需要占用4个连续存储单,为了判断哪四个单为一个字,ARM规定一个字所占用的4个连续存储单的第一个单地址的低2位必须是00。 根据字的4字节在4个存储单中的存储顺序,ARM提供了两种存储方式:小端方式和大端方式。系统默认的是小端方式,即字的低位字节在地址的底端(小端)。
7.2 ARM的堆栈组织方式 在计算机应用中,常常需要在内存中建立一种特殊工作方式的存储区域,这种存储区域中数据的读/写方式是按先进后出(First In Last Out,FILO)的原则来组织的,这种存储区域就叫做堆栈。 为了只是堆栈的位置,计算机系统都有一个堆栈指针的专用寄存器来存放堆栈的地址:
堆栈按照其生长方式可分为两种:地址递增式地址递减式 在系统初始化时,如果把堆栈指针置于较低的地址,当向堆栈存入一个数据时,堆栈的指针会指向高地址移动,即下次再存入数据时,数据的存放地址位于先存入数据上方的这个堆栈叫做地址递增式的堆栈。反之,如果数据的存储方向刚好与地址递增方式的堆栈的方向相反,则这种堆栈就叫做地址递减式堆栈。 8 ARM体系结构的其他特点 8.1 灵活方便的协处理器接口 在ARM中,可以通过ARM核的协处理器接口配置一个或多个协处理器的方法来增强ARM处理器的功能。一个ARM核最多可以配置16个协处理器。 ARM体系结构有三组总线,可以方便地扩充各种处理器、DSP或I/O。AHB: Advanced High performance BusASB: Advanced System BusAPB: Advanced Peripherial Bus 8.2 嵌入式的在线仿真调试 为了对处理器进行仿真调试,大多数基于ARM的处理器嵌入了ICE-RT逻辑,以便通过JTAG来仿真调试。另外,处理器还可以嵌入跟踪宏单ETM(Embedded Trace Macrocell),用于监控内部总线,以实时跟踪指令和数据的执行。 8.3 低电压低功耗的设计 ARM架构通过采用降低工作电压,减少门电路的翻转次数、降低时钟频率等措施,大大降低了处理器的功耗,有力地支持了处理器在手持设备中的应用。 9 ARM体系结构版本及系列 处理器的体系结构定义了指令集(ISA)和基于这一体系架构下处理器的程序员模型。尽管每个处理器性能不同,所面对的应用也不同,但每个处理器的实现都要遵循这一体系架构。ARM体系架构为嵌入式系统发展商提供了很高的系统性能,同时保持优异的功耗和面积效率。 9.1 ARM体系结构版本 ARM体系结构版本指的是ARM对应的各种指令集。迄今为止,ARM体系结构定义了ARMv1~ARMv8共八个版本。 “指令集架构”命名 | ARMv | n | variants | x(variants) |分成四个组成部分:ARMv — 固定字符,即ARM Versionn — 指令集版本号。迄今为之,ARM架构版本发布了8个系列,所以n=[1:8]。variants — 变种。x(variants) — 排除x后指定的变种 常见的variants有以下字母可选:T — Thumb指令集M — 长乘法指令E — 增强型DSP指令J — Java加速器JazelleSIMD — ARM媒体功能扩展 指令集的设计是处理器结构中最重要的一个部分,用ARM的术语称之为ISA(Instruction Set Architecture)。所有的ARM Cortex-M 处理器均基于Thumb-2技术,在一种工作状态中允许混合使用16位和32位指令。这一点与传统的ARM处理器如ARM7TDMI不同。为了更好地理解ARM处理器中不同指令集的差异,接下来我们简单回顾一下ARM指令集的发展历史。[3] 早期的ARM处理器(在ARM7TDMI处理器之前)仅支持32位ARM指令集。在接下来的数年间,ARM架构从版本1发展到版本4,ARM指令集也随之不断发展。ARM指令集功能强大,大多数指令支持条件执行,同时提供了很好的性能。但是与8位和16位架构的处理器相比,32位的ARM指令集需要更多的存储器空间。随着手机等设备对32位处理器需求的不断增加,功耗和成本都变得十分关键。如何减少程序占用空间大小的问题亟待解决。 在1995年,ARM推出了ARM7TDMI处理器,开始支持一种新的工作状态,可以运行一种新的16位指令集。这种16位指令集称为Thumb指令集(Thumb即大拇指,一语双关,表明它比ARM指令集占用空间更小)。ARM7TDMI可以工作在ARM状态(默认情况下),也可以工作在Thumb状态。正常工作时,处理器可以在软件的控制下在ARM状态和Thumb状态间切换。程序的一部分利用ARM指令来编译,从而获得更高的性能,其余部分用Thumb指令编译,从而获得更高的代码密度,减少程序占用的空间。利用这种实现机制,应用程序就可以在缩紧代码大小的同时获得较高的性能。在有些情况下,Thumb代码可以比相同条件下的ARM代码减少30%的程序空间。 在ARM7TDMI处理器的设计中,利用一种映射功能可以将Thumb指令翻译成ARM指令,之后进行解码。这样只需要一个指令译码器即可。ARM和Thumb两种工作状态在新的ARM处理器中仍然支持,例如Cortex-A处理器系列及Cortex-R处理器系列。虽然Thumb指令集能够提供ARM指令集所能提供的大多数功能,但是它仍然存在一些限制。例如对可操作的寄存器,寻址模式都存在限制,用于数据或地址操作的立即数范围也有所减少。 2003年,ARM推出了Thumb-2技术,将16位指令集和32位指令集集成到一种工作状态。Thumb-2指令集是Thumb指令集的超集。许多指令是32位的,因此可以像ARM指令集一样实现相应操作,但是它与ARM指令集有不同的指令编码方式。第一个支持Thumb-2技术的处理器是ARM1156T-2处理器。 在2006年,ARM发布了Cortex-M3处理器。Cortex-M3处理器集成Thumb-2技术,仅支持Thumb工作态。与早期的ARM处理器不同,Cortex-M3处理器不支持ARM指令集。之后更多的Cortex-M处理器发布,为面向不同市场分别采用了Thumb指令集的不同指令范围。因为Cortex-M3处理器不支持ARM指令集,所以向后不能与传统的ARM处理器如ARM7TDMI兼容。换句话说,ARM7TDMI上运行的二进制镜像文件不能在Cortex-M3处理器上运行。Cortex-M3处理器(ARMv7-M)中的Thumb-2指令集是ARM7TDMI ( AR M v4T)处理器中的Thumb指令集的超集,许多ARM指令可以移植到等价的32位Thumb指令,从而使应用的移植更加方便。 ARM指令集仍在不断发展当中。2011年,ARM发布了ARMv8架构。它包含了一些新的指令集用于64位操作。当前ARMv8架构仅限于Cortex-A处理器,Cortex-M处理器暂不包含这种架构。
9.2 ARM处理器系列 目前,基于ARM体系结构的ARM处理器包括ARM7、ARM9、ARM9E、ARM10E、SecurCore和Intel公司的Xscale等多个系列。他们除了具有ARM体系结构的共同特点之外,每个系列还都有各自的特点和应用领域。 在 ARMv3 ~ ARMv6 时期 ARM{x}{y}{z}{T}{D}{M}{I}{E}{J}{F}{-S} ·x — 处理器系列·y — 存储管理/保护单·z — cache·T — 支持Thumb指令集·D — 支持片上调试·M — 支持快速乘法器·I — 支持Embedded ICE,支持嵌入式跟踪调试·E — 支持增强型DSP指令·J — 支持Jazelle·F — 具备向量浮点单VFP·-S — 可综合版本比如:ARM926, 属于ARMv5指令集架构的,CPU是 ARM9系列的,2个存储管理/保护单,6个 Cache。 在 ARMv7 以后时期,公司改革了以前的冗长的命名方法,用看起来比较整齐的办法,统一用 Cortex 作为主名[4]。
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/61076.html