Linux嵌入式系统开发从小白到大牛
上QQ阅读APP看书,第一时间看更新

4.2 嵌入式微处理器的系统架构

对于嵌入式系统来说,微处理器就是系统的心脏,那么这个至关重要的嵌入式系统核心具有怎样的体系结构呢?本节主要从计算机系统结构、指令系统和常用内核架构三个角度来理解嵌入式微处理器。

计算机体系结构总体分为两类,分别是冯·诺依曼体系结构和哈佛体系结构,微控制器也是采用这两种体系结构,微控制还分为精简指令集和复杂指令集。随着生产生活对微处理器性能的需求越来越多样化,微处理器的内核架构也出现了细分,常用的就是x86内核架构、MIPS内核架构、PowerPC内核架构以及ARM内核架构。

4.2.1 冯·诺依曼计算机系统

自从1946年世界上第一台电子计算机埃尼阿克(ENIAC)诞生以来,人类生活开始迈向信息技术时代,这里要给大家隆重介绍一位计算机“大佬”:冯·诺依曼。他不仅在1946年参与第一台电子计算机的研发,而且在同年6月发表了一篇决定计算机系统架构的文章,这篇文章论述的就是冯·诺依曼计算机系统。

那究竟什么是冯·诺依曼计算机系统呢?该系统主要阐述了两点,第一,计算机结构采用二进制表示指令和数据;第二,确定了程序指令存储器和数据存储器合并在一起的存储器结构。其中第二点是冯·诺依曼结构最为显著的特点,就是程序指令存储地址和数据存储地址指向同一个存储器的不同物理位置。这种结构有利于统一编址,所以要求程序指令和数据的位宽要保持一致。冯·诺依曼计算机系统结构如图4-2所示。

图4-2 冯·诺依曼计算机系统结构

提到冯·诺依曼计算机系统结构就不得不提哈佛计算系统结构。哈佛计算机系统结构是一种存储器并行体系结构,主要特点是将程序和数据存储在不同的存储空间中,即程序存储器和数据存储器是两个独立的存储器,每个存储器独立编址、独立访问。CPU首先到程序指令存储器中读取程序指令内容,解码后得到数据地址,再到相应的数据存储器中读取数据,并进行下一步的操作(通常是执行)。程序指令存储和数据存储分开,可以使指令和数据有不同的数据宽度。哈佛计算机系统结构的优点是逻辑代码和变量单独存放,使之不会相互干扰,当程序出Bug的时候,最多只会修改变量的值,而不会修改程序的执行顺序(逻辑关系)。因此,这种结构大量应用在嵌入式编程当中。哈佛计算机系统结构如图4-3所示。

图4-3 哈佛计算机系统结构

小白成长之路:改进型哈佛计算机系统结构的特点

1)使用两个独立的存储器模块,分别存储指令和数据,每个存储模块都不允许指令和数据并存。

2)具有一条独立的地址总线和一条独立的数据总线,利用公用地址总线访问两个存储模块(程序存储模块和数据存储模块),公用数据总线则被用来完成程序存储模块或数据存储模块与CPU之间的数据传输;两条总线由程序存储器和数据存储器分时共用。

冯·诺依曼结构和哈佛结构其实就是CPU如何同时获取指令和数据的两种不同设计思路。哈佛结构认为CPU应该分别通过两组独立的总线来对接指令和数据,而冯·诺依曼结构认为CPU通过1组总线来分时获取指令和数据即可。

4.2.2 指令系统

指令和程序是有区别的,对于计算机来说,指令是计算系统执行的最小单元,指令就是响应计算机执行某种操作的命令,而程序是一串执行命令的指令集。我们都知道计算机系统只能识别0和1,指令也是由0和1组成,因此指令又称为指令码,指令码的集合就是指令系统。

对于微处理器内核来说,指令系统是尤为重要的,因为它不仅影响了微处理器的工作效率,而且也决定了微处理器的基本功能。一套完整的指令系统至少要保证四点:第一,指令系统能够完全满足微处理器的所有指令需要,这里的完全满足是指指令的硬件处理能力;第二,指令系统能为微处理器提高工作效率;第三,指令集要整齐等长;第四,指令系统在设计之初要考虑兼容性问题,要兼容同系列的微处理器。

对于微处理器来说,按照指令集复杂与否,可以划分为复杂指令系统(简称CISC)和精简指令系统(简称RISC)。为了帮助大家理解两种不同的指令系统,现举个冲奶粉的例子。

复杂指令集执行过程:step1,去冲奶粉;step2,拿来奶粉冲好。

精简指令集执行过程:step1,去;step2,取杯子;step3,放奶粉;step4,倒热水;step5,拿来。

对比冲奶粉这个例子,显然复杂指令速度快、效率高,但是如果是冲100次奶粉呢?

复杂指令集:step1,去冲奶粉;step2,拿来奶粉冲好……重复100次。

精简指令集:step1,去;step2,拿杯子×100次;step3,放奶粉×100次;step4,倒热水×100次,step5,拿来。对比冲奶粉100次这个例子,精简指令集效率更高。

简单而言,复杂指令集和精简指令集的设计思路完全不同,两种处理器在工作时的思考方式也有很大的区别。复杂指令集更适合处理一些高密度的计算任务,而精简指令集则更适合处理器做一些简单重复的任务。举个例子,如果要让我们执行早上起床上班的任务应该怎么做呢?复杂指令集此时只要下达上班的命令,我们就会自动执行一系列复杂的动作,如起床、穿衣、洗漱、出门、上车等命令;而精简指令集则要单独向我们下达一个一个简单的指令,从而一步一步执行它下达的命令,最终达成上班的目的。具体操作流程可以参考冲奶粉的例子。

这就是两者为什么不好比较性能的原因,这样的思路导致了CISC和RISC两种处理器的巨大差异,前者更加专注于高性能但同时也需要高功耗,而后者则专注于小尺寸低功耗的领域。执行高密度的运算任务时CISC更具备优势,而执行简单重复劳动时RISC就能占到上风。

4.2.3 微处理器的内核架构

前面讲解了冯·诺依曼计算机系统结构和哈佛计算机系统结构,但是微处理器的内核结构是以微观的角度来理解微处理器的组成。微处理的内核架构是基于冯·诺依曼计算机系统结构或者哈佛计算机系统结构之上的技术架构,是芯片厂商在研发芯片时需要考虑的,但是芯片厂商在研发芯片时还需要一个重要的核心,就是芯片的内核。因为只有有了芯片的内核以后,芯片厂商才能规划芯片的性能以及整体布局。比如根据内核支持的微处理器的位宽、时钟系统、中断系统来设计芯片最高支持频率、存储空间大小以及中断。在嵌入式领域里常见的微处理器内核架构有4种,分别是x86内核架构、PowerPC内核架构、MIPS内核架构以及本书使用的ARM内核架构。

这里为什么要讨论内核架构?第一,因为内核架构的不同,对于操作系统移植来说也是不同的,比如很难将x86内核架构下的Windows系统移植到ARM内核的处理器中。第二,了解内核架构能够帮助我们理解芯片手册的内容,就像学习STM32中的中断系统时,如果不告诉我们内核是ARM系列Cortex-M3内核,在查看芯片手册遇到嵌套中断向量地址的概念时,就很难理解为什么中断向量地址要这么设计。这是因为内核已经对中断向量地址分布进行了约束。第三,了解内核架构,有利于判断芯片是冯·诺依曼结构还是哈佛结构,以及判断芯片是精简指令集系统还是复杂指令集系统。

可以使用arch命令或者uname-m命令查看系统微处理的内核架构,虚拟机环境下查看的x86内核架构如图4-4所示。

图4-4 虚拟机环境下查看的x86内核架构

1.x86内核架构

对于x86内核架构大家都不会陌生,因为人们日常使用的Windows操作系统就是在此内核架构平台下搭建起来的,x86内核架构最早由Intel于1978年研发出来,诞生的标志是In-tel发布的8086型微处理器。x86内核架构采用复杂指令集系统,但是在内存空间里采用的是冯·诺依曼计算机系统结构,因为内存空间里不区分数据与指令;以x86内核架构制作的芯片则是采用哈佛结构。因此不能把x86简单地定义为某一种结构,准确说应该是混合结构。

2.MIPS内核架构

MIPS是由美国MIPS科技公司开发的一种内核架构,主要采用精简指令集系统,其特点是内核支持大量的寄存器、指令码以及可视化的管道延时时隙,这些显著的特点在专业领域非常容易开发出片上SOC系统。因此MIPS内核架构多用于网关和机顶盒等方面。国产芯片龙芯,就是采用的MIPS架构。

3.PowerPC内核架构

PowerPC内核架构是由苹果、IBM以及摩托罗拉三个巨头科技公司组成的AIM联盟研发的一种新型精简指令集内核架构。之所以称为新型内核机构是因为PowerPC发布于较晚于其他架构的1991年,主要是特点是外设集成度高,可集成USB、PCI、DDR控制器、SATA控制器、千兆网口控制器、CAN控制器、RapidIO以及PCI_Express控制器。其次是性能高、稳定性好,一般用于高端领域,比如汽车行业,最为人们熟知的就是飞思卡尔系列微处理器。

4.ARM内核架构

ARM内核架构是本小节内容重点讨论的一个内核结构,原因有两点。第一,本书主要介绍Linux操作系统移植和Linux项目开发,而项目使用的微处理器就采用ARM内核架构。我们选用的是时下比较火的I. MX6ULL系列的一款芯片,该芯片的内核架构就是ARM系列的Cortex-A7内核。第二,ARM内核处理器在嵌入式领域可谓是占据着半壁江山,很多嵌入式应用场合基本上都会将ARM内核处理器作为首选,因为它功耗低、性能强悍,最重要的是成本低。

讨论ARM内核架构以前,需要先了解一下ARM这家宏伟的高科技公司。说ARM是一家宏伟的高科技公司,是因为人们现在使用的平板计算机和智能手机95%的CPU核心使用的都是ARM架构,但是ARM公司却不生产芯片。包括嵌入式领域比较主流的STM32单片机以及本章选用的I. MX6ULL系列的芯片都是用的ARM内核,但都不是ARM公司生产的。ARM公司主要是做微处理器内核IP技术授权,打个设计电路板的比喻,ARM只设计基本核心的原理图,不做PCB板的打样以及SMT相关的工作。

ARM公司前身名叫Acorn,于1978年由物理学家Hermann Hauser和工程师Chris Cur-ry创办的。1985年,Roger Wilson和Steve Furber设计了他们自己的第一代32位、6MHz的处理器,做出了一台RISC指令集的计算机,简称ARM(Acorn RISC Machine)。这就是第一代ARM处理器ARM1。随后,改良版的ARM2也被研发出来,用在BBC Archimedes 305上。

后来Acorn被Olivetti收购,在Andy Hopper的提议下,1990年11月27日,Advanced RISC Machines Ltd.(简称ARM)被分拆出来,正式成为一家独立的处理器公司,由苹果公司出资150万英镑,芯片厂商VLSI出资25万英镑,Acorn本身则以150万英镑的知识产权和12名工程师入股。公司的办公地点非常简陋,就是一个谷仓。这个项目到后来进入ARM6,首版的样品在1991年发布,苹果计算机使用ARM6架构的ARM 610来当成他们Ap-ple Newton产品的处理器。在1994年,艾康计算机使用ARM 610作为他们个人计算机产品的处理器。下面看看如今ARM公司微处理器的产品,如图4-5所示。

图4-5 ARM现有的CPU内核架构

ARM是一家技术前瞻度比较高的科技公司,因此除了嵌入式领域的微处理器以外,它也开始布局云计算、边缘计算、安全以及机器学习相关的内核架构。这些不是本书研究的范围,我们主要研究的是操作系统移植,因此只需要了解ARM不同版本内核之间的特点和区别即可。