/*
名称:嵌入式之存储总结(从C51、STM32、S3C2440入手)
说明:最近在学习S3C2440相关存储器的时候,把C51、STM32和S3C2440有关存储部分的内容横向比较了一下,在此做一总结。
*/
从大的方面来说,计算机系统有三个主要的组成部分:CPU、存储器(主存和辅存)和输入输出设备。其中存储器在整个体系的作用一般是程序和数据的存储,其起着相当牛逼的作用。
本节内容分为以下几个部分:
一、C51、STM32和S3C2440的存储体系
二、C51、STM32和S3C2440的存储设备
三、C51、STM32和S3C2440启动方式
四、其他
-------------------------------与正式内容隔开的华丽的分割线-------------------------------------------
一、C51、STM32和S3C2440的存储体系
1、C51的存储体系
先上一张C51的存储结构图。
从总体的方向看,C51内部含有RAM(256B)和ROM(4K),还可以外接64K的外部ROM和64K的片外RAM。
其中对于内部RAM(IDATA区)来说,其内部256字节的RAM又可分为3个部分,如下图所示:
其中的低128字节的地址空间为普通的RAM区,高128字节的地址空间为后来C52单片机升级扩展所用①。这里的SFRs(特殊功能寄存器,用来对片内各个功能模块进行管理、控制、监视的控制寄存器和状态寄存器,其中常见的P0-P4也在这个地址区域)也是占据80-FF高字节的地址空间。
这时,可能有些基础的同学要发话了:“普通的高128字节和特殊功能区的高128字节访问不会冲突吗?”
答:高128字节RAM与特殊功能寄存器区貌似共用相同的地址范围,都使
用80H~FFH,地址空间,虽然貌似重叠,但物理上是独立的,使用时通过不同的寻址方式加以区分。 高128字节RAM只能间接寻址,特殊功能寄存器区可以直接寻址。(功能类似于后面要叙述的统一变址和独立分开编址)
对于外部扩展的64KRAM(XDATA区),它的地址是:0x0000–0xFFFF,这里的0x0000和内部RAM的0x00是不同的,是完全独立的两个空间。他们的访问方法也是不同的。MCS-51使用MOVX指令,来读写XDATA区。而且,访问XDATA区,是需要DPTR寄存器(数据指针寄存器,位于特殊寄存器中)来辅助的。因为只有DPTR才能装得下十六位的XDATA地址。
对于内部存储的ROM来说,它有4K的存储空间,主要用来存放程序、常数。其中0x0000-0x0FFF为其地址空间。
对于外部扩展的ROM来说,其有最大64K的存储空间。其地址空间为0x1000-0xFFFF。这里要注意的是内部和外部扩展的ROM,不太准确的说,它两是统一编址的。通过16位地址访问。它们之间的切换使用可以通过EA引脚。②
好,总结一下:C51的体系结构采用的是哈弗结构,即它的程序空间和数据空间是分开编址的,即各自有各自的地址空间,互不重叠。通过不同的指令分开访问。它具有:
(a)、内部集成了4K的程序存储器ROM;
(b)、内部具有256B的数据存储器RAM(用户空间+SFR空间);
(c)、 可以外接64K的程序存储器ROM和 数据存储器RAM。
从物理结构的角度讲,51单片机的存储系统可以分为四个存储空间:既片内ROM,RAM和片外ROM、RAM。
注释:
①:对于传统的8051单片机来说,其只有内部低128字节的RAM,后来升级出现了256字节的内部RAM,再后来单片机技术继续升级,出现了多大1024字节的内部RAM。需要注意的是,这里升级都是算作内部RAM。不要和外部扩展64K的RAM混淆。
②:这里有个不太清晰的小问题:对于64K的存储空间来说,需要16位的地址线,应该会用到P0口和P2口。这样P0口和P2口还能作为普通的IO口吗?我猜测应该是不影响。普通情况下,就算不扩展外部程序存储器,内部的4K存储器也需要12根地址线,会用到P0和P2,而我们还在无所畏惧的用着P0和P2当做普通IO口。
2、STM32的存储体系。
对于STM32 来说,其采用的冯诺依曼体系结构,程序存储器、数据存储器、寄存器被组织在4GB的线性地址空间内,以小端格式(little-endian)存放。其存储器映射的大图如下:
再来一张清晰点的表格:
然后,对于统一编址的存储器映射来说,每个Block都有其特殊的功能,存储部分主要是在Block0、Block1和Block2。一般来说,Block0用来设计成内部 FLASH, Block1 用来设计成内部 RAM, Block2 用来设计成片上的外设。
细化点来说,嗯。上几个表格就行。
注意:这上面Blcok中的地址根据不同的STM32产品,略有不同。比如说不同容量的STM32,内部FLash的地址空间就不同。
3、S3C2440的存储体系
对于S3C2440来说,它也是基于冯诺依曼结构的统一编址。如下图所示:
以上只是存储控制器的地址分布空间。每个Bank(相当于STM32中的Block)大小为128M,这里的bank可以接一些符合接口的存储器外设,如NandFlash、NorFLash、SDRAM、网卡等等 。(通过这种方式连接上系统的设备都可以直接使用指针来访问)
上图是寄存器映射。地址空间从0x4800000-0x5fffffff。
和STM32不同的是32位4G的地址空间,除了以上的存储器地址孔家和特殊寄存器地址空间,剩下的地址空间没有使用。而STM32的地址空间大都分配了出去。
写了这么多了,剩下的下一次写吧。