Cortex M3哈佛结构的思考

Cortex M3哈佛结构的思

.map的疑问

使用keil编写cortexM3代码时,工程进行如下的设置

keil工程设置

则会在List目录下生产.map文件。该文件反应了程序的数据、代码段在芯片ramflash中的地址分布。

.map文件片段

根据以前对arm7/9的理解,程序在执行的过程中,会将数据段和代码段拷贝到内存中,拷贝完成后,指针跳转到相应的代码段开始执行。但是,在刚刚截取的.map文件中,从0x2000_0000开始的ram地址中,只分配了各文件所使用到的变量(即数据段),代码段则分布在0x0800_0000开始的romM3中称为flash)中。这样,就产生了一个疑问:可以直接从rom中取指并执行吗?

 

哈佛结构与冯·诺伊曼结构

CPU的构架中,有两种基本的体系结构:哈佛结构和冯·诺伊曼结构。

简而言之,哈佛结构与冯·诺伊曼结构最本质的区别是:哈佛结构使用程序指令存储和数据存储分开的存储器结构,而冯·诺伊曼结构则使用的是程序指令存储和数据存储相同的存储结构。

常见的哈佛结构CPUMicrochip公司的PIC系列芯片,摩托罗拉公司的MC68系列、Zilog公司的Z8系列、ATMEL公司的AVR系列和安谋公司的ARM9ARM10ARM11

常见的冯·诺伊曼结构CPU:英特尔公司的8086,英特尔公司的其他中央处理器、安谋公司的ARM7MIPS公司的MIPS处理器。

哈佛结构与冯·诺伊曼结构

在典型情况下,完成一条指令需要3个步骤,即:取指令、指令译码和执行指令。从指令流的定时关系也可看出冯.诺伊曼结构与哈佛结构处理方式的差别。举一个最简单的对存储器进行读写操作的指令,如下图所示,指令1至指令3均为存、取数指令,对冯.诺伊曼结构处理器,由于取指令和存取数据要从同一个存储空间存取,经由同一总线传输,因而它们无法重叠执行,只有一个完成后再进行下一个。

图 冯.诺曼结构处理器指令流的定时关系示意图    

如果采用哈佛结构处理以上同样的3条存取数指令,如下图所示,由于取指令和存取数据分别经由不同的存储空间和不同的总线,使得各条指令可以重叠执行,这样,也就克服了数据流传输的瓶颈,提高了运算速度。哈佛结构强调了总的系统速度以及通讯和处理器配置方面的灵活性。

 

图 哈佛结构处理器指令流的定时关系示意图

哈佛机构的高性能体现在在单片机、DSP芯片平台上运行的程序种类和花样较少,因为各个电子娱乐产品中的软件升级比较少,应用程序可以用汇编作为内核,最高效率的利用流水线技术,获得最高的效率。

冯诺依曼结构主要是基于电脑购买者对电脑的使用途径不同----各种娱乐型用户、各种专业开发用户等,且安装的软件的种类繁多,升级频繁,多种软件同时运行时处理的优先级比较模糊,因特尔芯片不具备彻底智能分配各程序优先级和流水线的机制,机械的分配优先和流水线反而容易使用户不便。

比如,你使用电脑过程中对暴风影音播放器的使用中,有时希望它最快打开,有时希望它的打开实在打开浏览器之后,因此人对个人电脑的软件使用习惯是很不同的。从而,致力于提高主频和缓存的冯诺依曼结构才是PC的最佳选择。

体系结构与采用的独立与否的总线无关,与指令空间和数据空间的分开独立与否有关。51单片机虽然数据指令存储区是分开的,但总线是分时复用得,所以属于改进型的哈佛结构。ARM9虽然是哈佛结构,但是之前的版本(例如ARM7)也还是冯.诺依曼结构。早期的X86能迅速占有市场,一条很重要的原因,正是靠了冯.诺依曼这种实现简单,成本低的总线结构。现在的处理器虽然外部总线上看是诺依曼结构的,但是由于内部CACHE的存在,因此实际上内部来看已经 类似 改进型哈佛结构的了。至于优缺点,哈佛结构就是复杂,对外围设备的连接与处理要求高,十分不适合外围存储器的扩展。所以早期通用CPU难以采用这种结构。而单片机,由于内部集成了所需的存储器,所以采用哈佛结构也未尝不可。现在的处理器,依托CACHE的存在,已经很好的将二者统一起来了。(以上,来自网络)

CortexM3结构

 

CortexM3 CPU构架

从图中可以看出,M3的内核构架为冯·诺伊曼结构。这样,.map的疑问相对容易解释了。程序在执行的过程中,一边从rom中取指,一边操作ram中的数据。而不是之前理解的,需要将数据拷贝到ram中再执行。

引发的其他思考

程序在运行的过程中,如何通过“跳转”,找到相应的变量/函数?

联系最开始的map文件,记录了各个变量与地址的关系。比如编译器给RxFSN这个变量分配了地址0x2e00_0000。那么程序需要访问该变量时,则访问0x2e00_0000地址(这个可以过程理解为机器语言的执行。通过各各种调试手段,我们可以使用汇编语句看到程序的执行,因为汇编语言更加接近机器语言。通常会使用一个变量名来代替这个地址,以方便阅读,而这些符号--变量名则是编译器维护的)。

你可能感兴趣的:(嵌入式学习笔记)