ARM的体系结构

一、可编程器件的编程原理

1、电子器件的发展方向

  • 信号:模拟器件 -> 数字器件
  • 芯片:ASIC -> 可编程器件

很多年前的电视机都是模拟信号,比较好的是日本松下等。后来美国发明了

数字信号。

       ASIC(Application Specific Intergrated Circuits)即专用集成电路,ASIC是专用的,在出厂时已经确定了功能,不可编程。后来发明了可编程器件,在出厂时预留了可以编程的部分。

2、可编程器件的特点

  • CPU在固定频率的时钟控制下节奏运行。(和CPU的主频有关,成反比)
  • CPU可以通过总线读取外部存储设备中的二进制指令集,然后解码执行。

这些可以被CPU解码执行的二进制指令集是CPU设计的时候确定的,是CPU的设计者(ARM公司)定义的,本质上是一串由1和0组成的数字。这就是CPU的汇编指令集。

3、整个编程及运行过程

  • 程序员用汇编指令编程 --经汇编器汇编成二进制可执行程序文件-->二进制文件被CPU读取进去-->CPU内部电路对二进制文件解码-->解码通过则CPU执行指令、完成指令动作。
  • 如果程序员用C语言等高级语言编程,则编译器先将C语言程序编译为汇编程序,再进行上面的后续部分。

上图中,Elf格式文件是linux系统中的可执行程序,而window中的可执行程序是exe。

二、指令集对CPU的意义

1、汇编语言和C语言等高级语言的差别

  • 汇编难写,C好写
  • 汇编无可移植性,C语言有一定可移植性,Java等更高级语言移植性更强。
  • 汇编语言效率最高,C语言次之,Java等更高级语言效率更低。
  • 汇编不适合完成大型复杂的项目,更高级语言更适合完成更大、更复杂的项目。

2、汇编语言的本质

  • 汇编的实质是机器指令(机器码)的助记符,是一种低级符号语言。
  • 机器指令集是一款CPU的编程特征,是这款CPU的设计者制定的。CPU的内部电路设计就是为了实现这些指令集的功能。机器指令集就好象CPU的API接口一样。

3、编程语言的发展过程

  • 纯机器码编程
  • 汇编语言编程(不同的CPU,汇编语言不同,因此汇编语言不适合移植)
  • C语言编程
  • C++语言编程
  • Java 、C#等语言编程
  • 脚本语言编程

4、总结

  • 汇编语言就是CPU的机器指令集的助记符,是一款CPU的本质特征。
  • 不同CPU的机器指令集设计不同,因此汇编程序不能在不同CPU间互相移植。
  • 使用汇编编程可以充分发挥CPU的设计特点,所以汇编编程效率最高,因此在操作系统内核中效率极其重要处都需要用汇编处理。

三、RISC和CISC的区别

1、概念和设计理念

1.1、CISC

  • CISC:complex instruction set computer复杂指令集CPU
  • 乘加指令 = 乘法 + 加法,类似于C语言中的int  a=b*c+d;
  • CISC体系的设计理念是用最少的指令来完成任务(譬如计算乘法只需要一条MUL指令即可),因此CISC的CPU本身设计复杂、工艺复杂,但好处是编译器好设计。CISC出现较早,至今Intel还一直采用CISC设计

1.2、RISC

  • RISC:Reduced Instruction-Set Computer精简指令集CPU。(ARM使用)
  • RISC的设计理念是让软件来完成具体的任务,CPU本身仅提供基本功能指令集。因此RISC CPU的指令集中只有很少的指令,这种设计相对于CISC,CPU的设计和工艺简单了,但是编译器的设计变难了。

1.3、RISC与CISC指令数对比

  • 一般典型CISC CPU指令在300条左右
  • ARM CPU常用指令30条左右

2、CPU设计发展方向

  • 早期简单CPU,指令和功能都很有限
  • CISC年代 —— CPU功能扩展依赖于指令集的扩展,实质是CPU内部组合逻辑电路的扩展。
  • RISC年代 —— CPU仅提供基础功能指令(譬如内存与寄存器通信指令,基本运算与判断指令等),功能扩展由使用CPU的人利用基础架构来灵活实现。
  • 最终:没有纯粹的RISC或CISC,发展方向是RISC与CISC结合,形成一种介于2者之间的CPU类型。

四、统一编址&独立编址&哈佛结构&冯诺依曼结构

1、统一编址和独立编址

1.1、什么是IO,什么是内存

  • 内存是程序的运行场所,内存和CPU之间通过总线连接,CPU通过一定的地址来访问具体内存单元。
  • IO(input and output)是输入输出接口,是CPU和其他外部设备(如串口、LCD、触摸屏、LED等)之间通信的道路。一般的,IO就是指CPU的各种内部或外部外设。

1.2、内存的访问方式

  • 内存通过CPU的地址总线来寻址定位,然后通过CPU数据总线来读写。
  • CPU的地址总线的位数是CPU设计时确定的,因此一款CPU所能寻址的范围是一定的,而内存是需要占用CPU的寻址空间的。
  • 内存与CPU的这种总线式连接方式是一种直接连接,优点是效率高访问快,缺点是资源有限,扩展性差。

1.3、IO的访问方式(统一编址和独立编址)

  • IO指的是与CPU连接的各种外设
  • CPU访问各种外设有2种方式:一种是类似于访问内存的方式,即把外设的寄存器当作一个内存地址来读写,从而以访问内存相同的方式来操作外设,叫IO与内存统一编址方式;另一种是使用专用的CPU指令来访问某种特定外设,叫IO与内存独立编址

1.4、对比

  • 由于内存访问频率高,因此采用总线式连接,直接地址访问,效率最高。
  • IO与内存统一编址方式,优势是将IO当作内存来访问,编程简单;缺点是IO也需要占用一定的CPU地址空间,而CPU的地址空间是有限资源。
  • IO与内存独立编织方式,优势是不占用CPU地址空间,缺点是CPU设计变复杂了。

2、冯诺依曼结构与哈佛结构

2.1、程序和数据

  • 程序运行时两大核心元素:程序 + 数据
  • 程序是我们写好的源代码经过编译、汇编之后得到的机器码,这些机器码可以拿给CPU去解码执行,CPU不会也不应该去修改程序,所以程序是只读的。
  • 数据是程序运行过程中定义和产生的变量的值,是可以读写的,程序运行实际就是为了改变数据的值。

2.2、冯诺依曼结构与哈佛结构

  • 程序和数据都放在内存中,且不彼此分离的结构称为冯诺依曼结构。譬如Intel的CPU均采用冯诺依曼结构。冯诺依曼结构认为,程序与数据在机器中存储时都是用1010存储的,在机器中存储的格式是一样的,所以将它们一起存储。
  • 程序和数据分开独立放在不同的内存块中,彼此完全分离的结构称为哈佛结构。譬如大部分的单片机(MCS51、ARM9等)均采用哈佛结构。

2.3、优劣对比

  • 冯诺依曼结构中程序和数据不区分的放在一起,因此安全和稳定性是个问题(因为程序不需要改变,所以程序应该是只读的,而数据是需要改变的,是可读可写的。所以冯诺依曼结构不太安全),好处是处理起来简单。
  • 哈佛结构中程序(单片机中一般放在ROM、flash中)和数据(单片机中一般放在RAM中)独立分开存放,因此好处是安全和稳定性高,缺点是软件处理复杂一些(需要统一规划链接地址等)
  • 在单片机中一般ROM和RAM是分开的,在嵌入式中现在ROM和RAM是在一起的,都在内存中。
  • 在嵌入式体系中,需要搞清楚CPU的地址总线中是怎么连接的,那一地址是分给谁的,那个谁是干什么用的,什么时候使用它。

五、软件编程控制硬件的关键—寄存器

为什么我写个软件,硬件就会做出反应,为什么软件可以控制硬件呢。

1、什么是寄存器

  • 寄存器属于CPU外设的硬件组成部分
  • CPU可以像访问内存一样访问寄存器
  • 寄存器是CPU的硬件设计者制定的,目的是留作外设被编程控制的“活动开关”
  • 正如汇编指令集是CPU的编程接口API一样,寄存器是外设硬件的软件编程接口API使用软件编程控制某一硬件,其实就是编程读写该硬件的寄存器

2、寄存器的演示

  • 请看S5PV210 datasheet
  • 寄存器地址是连续的,内部没有数据
  • 编程操作寄存器类似于访问内存
  • 寄存器按位来访问(一般CPU都是32位地址总线,单个寄存器也是32位地址。单个寄存器有8个引脚,每个引脚引用4位,共32位)。
  • 寄存器中每个bit位都有特定含义,因此编程操作时需要位操作。
  • 单个寄存器的位宽一般和CPU的位宽一样,以实现最佳访问效率

3、两类寄存器

SoC中有2类寄存器:通用寄存器和SFR

3.1、 通用寄存器

(1)通用寄存器(ARM中有37个)是CPU的组成部分,CPU的很多活动都需要通用寄存器的支持和参与。

  1. 通用寄存器一般是可读可写的,它的作用没有进行固定功能设计。

3.2、 SFR(special function register,特殊功能寄存器)

(1)SFR(special function register,特殊功能寄存器)不在CPU中,而存在于

CPU的外设中,我们通过访问外设的SFR来编程操控这个外设,这就是硬件编程控制的方法。

(2)SFR(特殊功能寄存器)是只读的,是和某一个特定的外设绑定的,寄存器中的每一个位都已经确定了作用,是不能改的。

六、ARM体系结构总结

1、ARM是RISC架构的

  • 常用ARM汇编指令只有二三十条
  • ARM是低功耗CPU
  • ARM的架构非常适合单片机、嵌入式,尤其是物联网领域;而服务器等高性能领域目前主导还是Intel

2、ARM是统一编址的

  • 大部分ARM(M3 M4 M7 M0 ARM9 ARM11 A8 A9等)都是32位架构
  • 32位ARM CPU支持的内存少于4G(ARM中IO和内存是统一编址的,特殊功能寄存器需要占用一部分CPU空间,所以小于4G),通过CPU地址总线来访问。
  • SoC中的各种内部外设通过各自的SFR编程访问,这些SFR的访问方式类似于访问普通内存,这叫IO与内存统一编址。

3、ARM是哈佛结构的

  • 常见ARM(除ARM7外,已淘汰)都是哈佛结构的
  • 哈佛结构保证了ARM CPU运行的稳定性和安全性,因此ARM适用于嵌入式领域
  • 哈佛结构也决定了ARM裸机程序(使用实地址即物理地址)的链接比较麻烦,必须使用复杂的链接脚本告知链接器如何组织程序;对于OS之上的应用(工作在虚拟地址之中)则不需考虑这么多

猜你喜欢

转载自blog.csdn.net/m0_37884601/article/details/81394179