目录
- 一、两种处理器的结构体系
- 1. 哈佛结构体系
- 2. 冯·诺依曼结构体系
- 3. 两种结构的总结
- 二、单片机运行下和非运行下的内存分配
- 1. 非运行时的单片机程序在ROM内的分布
- 2. 运行时的单片机程序在RAM内的分布
- 三、单片机程序和操作系统应用程序的对比
- 四、编译流程
一、两种处理器的结构体系
1. 哈佛结构体系
哈佛结构是一种将程序指令存储和数据存储分开的存储器结构。
中央处理器首先到程序指令存储器中读取程序指令内容,解码后得到数据地址,再到相应的数据存储器中读取数据,并进行下一步的操作(通常是执行)。程序指令存储和数据存储分开,可以使指令和数据有不同的数据宽度,如Microchip公司的PIC16芯片的程序指令是14位宽度,而数据是8位宽度。
目前使用哈佛结构的中央处理器和微控制器有很多,除了上面提到的Microchip公司的PIC系列芯片,还有:
- ATMEL:AVR系列
- ARM:ARM9、ARM10和ARM11,Cortex-M3系列,Cortex-M4系列
- Interl:51系列内核
- Microchip:PIC系列
2. 冯·诺依曼结构体系
冯·诺伊曼结构也称普林斯顿结构,是一种将程序指令存储器和数据存储器合并在一起的存储器结构。
程序指令存储地址和数据存储地址指向同一个存储器的不同物理位置,因此程序指令和数据的宽度相同,如英特尔公司的8086中央处理器的程序指令和数据都是16位宽。
目前使用冯·诺伊曼结构的中央处理器和微控制器有很多。除了上面提到的英特尔公司的8086,还有:
- Interl:其他中央处理器
- ARM:Cortex-A、Cortex-M0和ARM7
- MIPS:MIPS处理器
- Ti:MSP430系列
3. 两种结构的总结
哈佛结构和冯.诺依曼结构都是一种存储器结构。哈佛结构是将指令存储器和数据存储器分开的一种存储器结构;而冯.诺依曼结构将指令存储器和数据存储器合在一起的存储器结构。
- 冯·诺依曼结构的计算机程序和数据区域在同一个存储器上它们物理上是连续的,即程序空间不封闭,程序空间的数据在运行时理论上是可以被修改,此外程序一旦跑飞也有可能运行到数据区,虽然都是一些不常见的特殊情况下。
- 哈佛结构的芯片内部程序空间和数据空间是分开的,这就允许同时取指和取操作数,从而大大提高了运算能力。哈佛总线技术应用是以DSP和ARM为代表的。
DSP芯片硬件结构有冯·诺依曼结构和哈佛结构,两者区别是地址空间和数据空间分开与否。一般DSP都是采用改进型哈佛结构,就是分开的数据空间和地址空间都不只是一条,而是有多条,这根据不同的生产厂商的DSP芯片有所不同。在对外寻址方面从逻辑上来说也是一样,因为外部引脚的原因,一般来说都是通过相应的空间选取来实现的。本质上是同样的道理。
改进型的哈佛结构与哈佛体系结构差别
与冯.诺曼结构处理器比较,哈佛结构处理器有两个明显的特点:
- 使用两个独立的存储器模块,分别存储指令和数据,每个存储模块都不允许指令和数据并存;
- 使用独立的两条总线,分别作为CPU与每个存储器之间的专用通信路径,而这两条总线之间毫无关联。
后来,又提出了改进的哈佛结构,其结构特点为:
- 使用两个独立的存储器模块,分别存储指令和数据,每个存储模块都不允许指令和数据并存;
- 具有一条独立的地址总线和一条独立的数据总线,利用公用地址总线访问两个存储模块(程序存储模块和数据存储模块),公用数据总线则被用来完成程序存储模块或数据存储模块与CPU之间的数据传输;
- 两条总线由程序存储器和数据存储器分时共用。
二、单片机运行下和非运行下的内存分配
运行时:单片机程序运行起来以后,代码是在ROM(Nor Flash)上面跑的,数据是在RAM上面的,描述的就是ROM和RAM两个层面。
非运行:单片机程序没有运行时(没有上电),针对的描述是单片机程序(bin)文件在ROM(Flash)上的分布
注意:当前市面上的单片机根本就没有一个统一的运行时和非运行时的程序模型,这里都是简略、大概差不多的描述。
统称 | 具体实际的硬件器件 |
---|---|
ROM | Flash、EEPROM、NANDFlash、EMMC、SD卡、TF卡 |
RAM | SRAM、DRAM、SDRAM、DDR、DDR2、DDR3、DDR4 |
单片机程序在编译、链接之后会生成hex、bin文件,通过下载工具烧录到芯片内部的ROM里面去,由于单片机的工作特性,所以一般单片机内部ROM都是NOR Flash,NOR Flash具有寻址功能可以在上面运行程序。
1. 非运行时的单片机程序在ROM内的分布
通过单片机下载工具烧录到单片机Flash里面去之后的Flash空间区域分布图:
- Flash:
- Code:为程序代码部分
- Ro-data: 表示程序定义的常量(const修饰的常量、#define 宏定义等),也有Ro-data放在Code区域
- Rw-data:
- Stack:由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 这些值是可读写的,那么stack应该被包含在RW-data(读写数据存储区),也就是单片机的sram中。
- Heap:一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。可以理解,这些也是被包含在单片机的sram中的。
- Global/Static:全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域,程序结束后由系统释放。这些数据也是可读可写的,被包含在RAM中。
注:Stack 和 Heap 是取决于烧入编译器
- RAM:
- Zi-data:表示未初始化的全局变量(Zi-data可以表示RAM未上电时整个区域的状态,或者上电初始化之后未被使用的区域,上表仅仅描述的是ROM区域的空间分布)
2. 运行时的单片机程序在RAM内的分布
初始化之后的ROM和RAM中的数据分布:
初始化的时候会由Boot程序(进入main函数之前)拷贝Flash里面的Rw-data区域到RAM。
初始化之后正常运行时,单片机内ROM和RAM区域分布图:
上电初始化之后Flash的Rw-data就不会再使用了,除非重新上电、复位了boot才会重新从ROM(Flash)中拷贝Rw-data区域到RAM中去。
运行时,根据哈佛结构体系的描述(51内核、Cortex-M3、Cortex-M4是哈佛模型),程序存储区对应ROM(Flash)数据存储区对应RAM,如此这般两个区域就是物理上的分开的–经典的哈佛模型。
三、单片机程序和操作系统应用程序的对比
由于单片机应用领域是极端成本为导向的,所以单片机程序和跑在操作系统上的应用程序没有可比性!
类型 | 操作系统应用程序 | 单片机程序 |
---|---|---|
代码 | RAM | ROM(支持XIP的Nor Flash) |
数据 | RAM | RAM(SRAM) |
单片机的代码是在ROM即支持XIP的Nor Flash上面跑,数据是在RAM上面的,而操作系统应用程序的代码、数据是完全加载到RAM里面运行的(这里不考虑分页、虚拟内存)
操作系统应用程序 | 描述 | 对应单片机程序 |
---|---|---|
BSS段–.bss | 未初始化的全局变量、静态变量,一旦初始化就回收,并转存到数据段之中 | Zi-data |
代码段–.code | 代码,程序结束的时候系统会自动回收存储在代码段中的数据,内存区域较小 | Code |
数据段–.data | 已经初始化的全局变量、静态变量,直到程序结束的时候才会被回收 | Rw-data (global/static) |
堆–.heap | 动态分配内存,alloc出来的对象,需要程序员进行内存管理 | Rw-data (heap) |
栈–.stack | 局部变量,自动分配内存,当局部变量的作用域执行完毕之后就会被系统立即回收 | Rw-data (stack) |
四、编译流程
C源程序-->预编译处理(.c)-->编译、优化程序(.s、.asm)-->汇编程序(.obj、.o、.a、.ko)-->链接程序(.exe、.elf、.axf等)
此文章来自:liefyuan