首页 > 技术文章 > 单片机的内核与架构(结构)

ideaWorks 2022-02-24 12:57 原文

单片机的内核有很多种,如51,AVR,ARM,PIC,Power PC, RISCV阿,有很多种的,网上的解释说内核包含中央运算单元+内部总线+指令解析,还有提到CPU的内核分为两部分运算器和控制器。不管怎么说吧,内核肯定是软件或者硬件最核心的部分,可以包含软件,如Linux内核就是软件的。对软件内核不太了解,下面还是说说单片机把,对单片机来说,个人觉得最重要的只要是内核一样,其汇编指令集也就一样,代码基本不太需要改变。

现在再来讨论下架构,架构有哈佛架构:两个独立的存储模块或区域,程序空间与数据空间分开,便于程序与数据同时访问,另一个位普林斯顿架构,程序空间和数据空间使用同一个存储器,即我们熟知的冯诺依曼体系结构,既然提到了冯诺依曼体系结构,就不得不说一下该体系结构是如何发展来的,这很有启发意义。最早的计算器(也就相当于今天的计算机),它是不可以编程的,内部仅有固定用途的程序,当然那时候可能程序的概念都没有,有的就是一堆连接线,若要改变这个机器的功能必须要重新设计和连接线路,显然这很不灵活,相当费力气。于是人们开始想到最好可以灵活的设计一个计算器,它能根据我的需要做出改变而产生不同的功能,这时人们就差不多萌芽了程序的想法,通过一种手段来实现不同的功能(今天的不同程序实现不同功能)。计算机的组成不需要改变,但需要安装不同的软件(相当于不同程序)就实现了不同的功能,产生了这个想法,那人们就开始琢磨了,如何将这想法付诸于实践,人们想到编写代码的确是一个好方法(这里可能有待考究,也可能是受到了图灵机那个无限长的纸带的启发),那这样的话,机器的结构肯定要面临大的改变了,人们就开始争论了,你说你的想法好,他说我的想法比较妙,还有到底是十进制阿,八进制,还是其它进制呢。这时候,印证了那句话:伟大的时代造就伟大的人物或伟大的人物造就伟大的时代,这个伟大的人物就是冯诺依曼,他提出来抛弃十进制,采用二进制作为数字计算机的数制基础。同时他还强调了得预先编制计算机程序,然后由计算机来按照人们事先制定来完成数值计算。既然需要将程序写到计算机里,那肯定得有地方放这个程序把,于是便又提出了一种叫做存储器的概念,用于存放程序和数据用的。于是人们按照冯诺依曼所说的理论造出了电子计算机,人们称这类计算机为冯诺依曼体系结构计算机(其实准确的还是称之为冯诺依曼体系结构处理器CPU更为准确)

冯诺依曼结构处理器特点:

1. 必须有一个存储器

2. 必须有一个控制器

3. 必须有一个运算器(算术运算+逻辑运算)

4. 必须有输入与输出设备

5. 最突出的一点,程序和数据在一个存储区不分开,经由同一总线传输

 

冯诺依曼的主要贡献就是提出并实现了“存储程序”的概念,由于指令和数据都是二进制的,指令和操作数的地址又密切相关,因此当初想到的是将指令和数据共享同一存储空间(数据与代码区不作区分),且指令和数据共享同一总线,类似于下面这张图:

指令和数据存储为同一空间,因此具有相同的数据宽度

 

早期的计算机大多采用这种冯诺依曼结构,如X86等等。但冯诺依曼体系结构都存在同一存储空间,由于共享同一总线,该计算机取指令与取数据不能同时进行,只有一个完成后再进行下一个,这显然会降低程序运行的速度(网上的说法为访存瓶颈),而且由于数据和程序都存放在同一存储空间,可能会修改程序的执行顺序,那就会引起死机(这个地方,死机问题还有待进一步理解,目前我也理解不够不敢谬论)

鉴于冯诺依曼结构的不足,人们开始考虑是否可以提出一种新的结构来解决此问题,于是人们提出来了哈佛结构,哈佛结构是一种将程序指令存储和数据存储分开的存储器结构,

CPU首先到程序指令存储器中读取程序指令内容(取指),解码后得到数据地址(这里只是比喻,真正译码还需要区分是啥指令,是取数据指令才会去得到数据地址),然后执行,再到相应的数据存储器读取数据(访存,这个步骤也不一定是访问存储器,也可能是寄存器),最后将相应的结果写到通用寄存器(这里很容易忽视的,不是写到存储器),关于CPU这几个步骤(现在也是按这个来划分几级流水线),目前不扯太多了,后面有机会我拿个实际CPU设计咱们分个细节接着唠嗑,非给整明白不可。回来继续聊哈佛结构,这个结构将程序指令存储和数据存储分开,这可使得指令和数据有不同的数据宽度,这就可以充分利用计算资源了(想到这一点就很nice),附图:

图XX哈佛结构相比上面讲到的冯诺依曼结构,明显多了两条总线,这解决了上面冯诺依曼结构的访存瓶颈问题,不过它由于总线更为复杂,成本也就上升了(古人说有所得必有所失),由于这种哈佛结构取指令和取数据总线独立,可同时进行,那么自然其处理能力和速度肯定很高了,所以当今的DSP和ARM家族,这里还有近年来兴起的RISCV,大多采用此体系结构。讲到现在,芯片中哈佛结构的运用,其实严格意义上来讲应该算是一种改进型的哈佛结构,因为在其内部总线并没有增加,像51是总线分时复用。现在的X86 CPU的内存RAM,指令和数据还是还是放在一起,没有增加总线,还有现今的ARM处理器和X86 处理器一样,RAM也就只有两条总线,数据总线与地址总线并没有像哈佛结构那样,分成四条总线(数据存储的地址总线,数据存储的数据总线,程序存储器的地址总线,程序存储器的数据总线),但要注意的是,特别要注意一点,它们的CPU核中,也就是缓存的cache中还是区分了指令缓存(I-cache)和数据缓存(D-cache),所以最终执行的时候,指令和数据还都是从不同地方取出的,所以可以这么来说,CPU的外部为冯诺依曼模型,而CPU内部采用的是哈佛结构,两个Cache(缓存)独立,可以同时访问数据和指令,也就是实现了哈佛结构的功能,这种二者合一的称之为改进型的哈佛结构,附图:

至于为什么要设计改进型的哈佛结构呢,因为原来冯诺依曼结构虽然执行效率不高,但其总线结构简单,成本也低,而哈佛结构其总线复杂,成本高,效率也高,于是结合两者长处,但又为了降低成本,于是就有了今天的珠联璧合。另外,值得一说的是,CPU也难以完全采用哈佛结构,原因在于哈佛结构总线过于复杂导致对CPU来说不适应存储器的扩展,而对微处理器MCU来说则不一样,它是集成化了的,存储器都已集成好了,很少会扩展,所以它可能会采用全哈佛,但其成本又限制了这个,所以其大多也采用改进型的哈佛结构。

最后总结一下,哈佛结构和冯诺依曼结构都是一种存储器结构(这里肯定不是指的物理结构,形象意义上的逻辑结构),哈佛结构是将指令存储器和数据存储器分开的一种存储器结构(代码与数据独立编址),而冯诺依曼结构则是将指令存储器和数据存储器合在一起的存储器结构(代码与数据统一编址)

前面说了哈佛和冯诺依曼结构,接下来我们再来说下架构,说到架构,我们就来说一哈,RISC和CISC。英文注释,RISC和CISC都是一种指令集的设计,早期是没有像今天这样区分CISC和RISC的,RISC也是后来才出现的。在早期的计算机中,编译器还没出现,程序都是以机器语言或汇编语言来完成的(像现在很多高级语言都是依赖于编译器,但这在早期根本就没有),当时的看法是硬件比编译器更容易设计,于是工程师们设计了很复杂的硬件,但都是基于复杂的指令的,这些复杂的指令可以直接陈述高级的功能,比如乘加,乘减,就一条指令就搞定,这当然给编程人员带来了极大的便利,另一个加速复杂化的原因是缺乏大的内存,当时的内存每一个字节都非常珍贵,因此促使这种复杂编码,长度不等的执行多个操作的复杂指令的诞生,即CISC(Comlex Instruction Set Computer)。早期的X86,C51都是CISC,其指令集很丰富,使得编译器只做很少的事情(基本不做事情),这样会使得设计的程序指令数很少,所占的内存也就很少了。

但发展就是这样,从来没有一个最好的,只有更好的或者更适合的,人们在研究指令系统合理性的时候发现不能在这么下去了,指令的复杂导致硬件设计也变得更加复杂,也会使得集成和功耗都很难得到进一步的发展,而且也会使得指令过于冗余。于是人们想设计一个新的指令系统来解决这种问题,铛铛铛,这时RISC就诞生了。

RISC既然登场了,就有必要介绍一下,它是如何解决上述问题的,首先它对指令做了精简,究竟是去掉哪些复杂指令,或者留下哪些呢,这里肯定有个取舍的问题,这时就联想到了二八原则,实际程序设计中大多只会用到20%的指令,剩下的几乎很少用到。于是就将这20%的指令作为了精简下来的指令,而且使这些指令具有同等大小的字节长度,只留下了很少的复杂指令(也是常用的),对于一些不常用的复杂指令采用将多个指令拼凑方式实现(比如前面提到的乘加,原先是一个指令现在可能就拆分成乘法和加法两个指令进行实现)。这种改变之下对编译器的要求就高了,对于一个复杂指令,得学会去翻译成多个指令,另外,由于翻译的指令多了,这样也会使得程序变得大了,相应的就会占用CPU更多的内存空间,CPU对内存的访问也会更多,这也会使得计算机的执行效率打个折扣。针对这以上问题,人们采用了增加寄存器的方法,当然相当于增加了额外的存储空间(内存),只有载入和存储指令可以访问内存,数据处理指令只对寄存器进行操作。

讲到RISC指令系统的另一个优势,就是它本身指令长度一致,指令长度一致的指令执行所需要的机器周期相同,很好降低了指令设计成流水线的复杂度,非常适合搞并行计算。

最后总结下,CISC架构指令虽然复杂,但其很明显程序执行的速度更快,就是比较费材,而且由于老牌CPU厂商Intel等,早就采用了CISC,为了考虑向下兼容,也不得不在现有的CPU中采用CISC,而RISC则没有太多历史包袱,不用考虑向下兼容,所以其设计可以很简单放的开,不过目前CISC和RISC正在走向融合,正如前面介绍的哈佛与冯诺依曼那样。Pentitum(Intel 的奔腾系列)是一个例子,它们的CPU内核是基于RISC的,但是它们也能识别CISC,可将其分解为RISC指令指令,这也挺有意思了。

 

推荐阅读