2015年(29)
分类: 嵌入式
2015-04-12 20:26:59
51单片机为哈佛结构,单流水线(也可以说是无流水线)处理器。
1、为什么说51单片机是哈佛结构。
因为51单片机的数据存储器和程序存储器是在物理上分离的,数据存储器就是单片机的RAM,而程序存储器是单片机的ROM。
在数据存储器上不允许存储指令,在指令存储器上不允许存储数据。
这两块存储器分别使用独立的两条总线,作为CPU与每个存储器的专用通信线。
下图为网上流传的一个哈佛结构图。
很明显,控制单元能够同时和指令存储器、数据存储器进行通讯,51单片机的ROM读写速度还是挺慢的,特别是写,您在烧写程序的时候应该能感觉到,读的速度比写要好很多,虽然跟RAM比有一定的差距,所以,51单片机代码放在ROM中。
当然,你也可以将程序读入到一个RAM中,只要不是与数据在同一个RAM,那么指令读写速度会上去,而结构还是哈佛结构。
而我们的通用计算机是冯.诺依曼结构,数据和程序存储器是不分离的。
如下图,是网上流传的冯.诺依曼体系结构:
可以看出,只有一个Memory。
我们PC机上的软件首先是在硬盘上,有点类似于ROM,都是非挥发性的存储介质。
在我们双击软件时,操作系统通过加载器将硬盘上的可执行文件加载到内存中,内存类似于51中的RAM,后续的执行过程,指令直接从内存中读取,而数据也是在内存中。
总结一下,冯.诺依曼结构的系统,取数据和取指令是在同一个存储器上进行的,而哈佛结构是在两块存储器上分别取的。
那冯.诺依曼结构就不怕程序将代码区修改吗?
windows下的可执行文件为PE(Portable Executable)格式,而Linux下是ELF(Executable Linkable Format)格式,他们都是从COFF(Common File Format)发展而来,而COFF是将可执行文件分为多个段,包括代码段和数据段之分,代码段是只读的,而数据段是可读写的,这些属性在可执行文件中就已经标注好了。所以,操作系统会保护代码段不受破坏。
我的理解是,哈佛结构在硬件级别进行代码和数据的区分,而冯诺依曼结构是在可执行文件(软件级别)进行区分。
至于对于没有操作系统的冯.诺依曼结构系统的裸机开发,如何保证代码段不被破坏,原谅本人才疏学浅,没懂。
2、51单片机是单流水线结构
来解释另外一个现象,51单片机的1个状态周期等于2个振荡周期,而1个机器周期等于6个状态周期。
算下来,1个机器周期就等于12个振荡周期。这,也应该是51单片机速度慢的原因吧。
那为什么不能一个振荡周期就执行一条指令呢?
孩子,你太天真了。指令指令的过程分为很多步,简单说来,至少有3步,取指令->译码->执行;这每一步都是一个状态,得一步一步来,一个状态一个状态过去,从一个状态跳到另一个状态就需要时钟的驱动;另外加上数据存储、数据回写入寄存器等其他状态,那得经过好几个状态才能执行完一台指令。而51单片机需要6个状态,具体每个状态干什么,大家可以参考相关文献。
那有人就想了,这速度也太龟速了吧。那能不能我在执行的时候同时进行译码和取指令呢?
这就产生了流水线的概念,生活中我们流水线看的很多,就是一件事分成很多个小步骤,每个小步骤由一个人完成,流水线的上游给下游提供资源,下游处理好后,再传递给下下游。这样,效率大大的提高,用一句口号来说,就是极大的解放了生产力。
单片机里面也是,51单片机里面只有1个“小人”,这个人是多面手,既会取指令,又会译码,又会执行,但是,每执行一步,都需要一个T时间,那么执行一条指令,就需要3个T。而3级流水线的处理器就不一样了,它里面有3个小人,每个小人都是专才,第一个只会取指令,并交个第二个小人,第二个只会译码,并将译码结果交个第三个小人,第三个小人是终结者,将指令执行完,虽然每个小人只执行一件事,时间也都是1个T,但是,可以说1个T就能执行一条指令,因为这3个小人在同时工作。这应该就是传说中的3个臭皮匠,气死一个诸葛亮吧,哈哈。
由上面分析可以看出,如果要提高处理器的处理速度,有两个方法(目前我所知道的):
提高时钟周期频率:就是让每个小人的处理速度都快起来,那么,干完一件事(执行完一条指令)的时间就短了。当然,不能无限制的使用太高频率,每个处理器的硬件对频率都有限制。
增加小人的个数,也就是增加流水线级数。如果一件事,一个人做需要T时间,那四个人同时做,就只需要T/4时间,关键问题是,这件事如何分,也就是一条指令执行的状态怎么分。我们说DSP的处理速度很快,为什么?就是因为它的流水线级数很深,人多力量大嘛。但是,人多,也就难管理了,这也是51单片机比DSP简单得多的原因吧,因为51单片机只需要管理一个小人而已,它是单流水线的。