购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.6 嵌入式系统的存储体系

2.6.1 嵌入式系统存储器的概述

嵌入式系统作为专用的计算机系统,存储器是嵌入式系统中不可或缺的组成部分,嵌入式存储器有的集成到嵌入式微处理器片内部,有的为片外扩展存储器,主要用于存储指令和数据。嵌入式存储器采用的是类似计算机的设计方法,差异主要体现在体积、功耗、价格和嵌入式处理器的存储器大小及可扩展性等。与普通PC机不同,嵌入式系统片外存储器一般使用Flash、小型闪存卡作为嵌入式系统的存储装置,主要用于存放系统软件和用户软件,包括启动引导软件、操作系统和硬件驱动,以及用户用于实现应用目的而设计的软件。嵌入式系统设计中需要考虑如何安排这些存储器的地址,尤其是NOR Flash和SDRAM,因为它们涉及系统的启动步骤等。常用的嵌入式存储器件包SDRAM、Flash、E2PROM、大容量存储系统(SD卡、U盘、硬盘)等。

2.6.2 嵌入式系统存储器的分类

根据存储器在嵌入式系统中所起的作用,可分为主存储器、辅助存储器、高速缓冲存储器、控制存储器等。为了解决对存储器要求容量大、速度快、成本低三者之间的矛盾,通常采用多级存储器体系结构,即使用高速缓冲存储器、主存储器和外存储器。嵌入式系统的存储体系结构如图2.11 所示。其中外部存储器的存储来自远程存储结构,主存储器保存来自外部存储器的数据,片外高速缓存保存来自主存储器的数据,片内高速缓存保存来自片外高速缓存的数据,寄存器数据来源于片内高速缓存,是嵌入式系统中高速的存储单元,由边沿触发方式的触发器、门电路组成,主要是用来暂时存放数码或指令,一个触发器可以存储 1 位二进制代码,故存放 n 位二进制代码的寄存器是由 n 个触发器来构成的。

图2.11 嵌入式系统的存储体系结构

1)高速缓存(Cache)

在嵌入式系统中,Cache位于CPU和内存之间,虽然其存储空间很小,但存取速度很快,Cache传递数据给CPU,同时向主存获取数据。Cache缓解了CPU和主存中速度差异,在CPU运行时,所访问的数据会趋向于一个较小的局部空间地址内(如循环操作),此时Cache用来存储当前最为活跃的程序和数据,直接与CPU进行交互。Cache由半导体材料(通常是SRAM)构成,其功能对于开发人员来说是透明存在的。值得注意的是Cache的存储内容是当前最为活跃的程序和数据,CPU访问高速缓存Cache由命中率判断[Cache命中率=(平均存取时间-主存存取时间)/(高速缓存存取时间-主存存取时间)],当CPU所访问的数据在Cache中命中时,直接从Cache中读取数据。若CPU访问的数据不在Cache中,则还是需从主存中读取。

2)内存

内存是嵌入式系统的重要组成之一,内存是与CPU进行信息交流的桥梁,嵌入式系统中的所有程序的执行都是在内存中进行的,内存可以直接影响嵌入式的效率,因此,内存通常选择速度较快的存储器。

RAM是随机存取存储器(Random Access Memory)的简称,是内存的主要组成部分,其存储的内容可以随意取出或者存入,且存取速度与存储单元的位置无关,存储速度快,通常作为操作系统或其他正在运行中的程序的临时数据存储介质。RAM在断电时将会丢失其存储数据,故用于存储短时间使用的程序和数据。嵌入式开发常见的RAM有SRAM,DRAM,DDRAM(双倍速率随机存储器)。

①SRAM是静态存储器,因此只要供电它就会保持一个值,不用对它进行周期性刷新。其基本存储单元由触发器构成,每个存储单元由 6 个晶体管组成,因此其成本较高,但它具有较高的速率,可以用来做Cache。

②DRAM是动态存储器,需要有规律地定时进行刷新,但价格比SRAM低。DRAM中的每个存储单元由一个晶体管和一个电容器组成,因为组成包括电容器,而电容器会漏电,所以才要定期刷新,刷新周期一般为 1 ms。

③SDRAM(Synchronous DRAM)同步动态随机存储器,即数据的读写需要时钟来同步。其存储采用分页存储。DRAM和SDRAM由于实现工艺问题,容量较SRAM大。但是读写速度都不如SRAM。

④DDRAM(Display Data RAM)是显示数据随机存储器的简称,是为了解决SDRAM中读写速度慢的一种RAM。其基于SDRAM技术,引入一种称为双倍预取的技术(即在内存芯片内部的数据宽度是外部接口数据宽度的两倍),使峰值的读写速度达到输入时钟速率的两倍。

3)主存储器

在嵌入式系统中,主存储器常见的有ROM和Flash两种,一般被用来保存较大容量的数据,在部分文献中也将Flash归类为ROM。ROM(Read Only Memory,一般是指Mask ROM)是只读存储器,Flash是从ROM和RAM发展而来的,Flash不仅具备电子可擦除可编程(EEP ROM)的性能,还可以快速读取数据(RAM的优势)。

常见的主存储器有:

①Mask ROM(掩膜ROM):一次性由厂家写入数据的ROM,用户无法修改。

②PROM(可编程ROM):由用户来编程一次性写入数据,只能写入数据一次。

③EPROM(电可擦写ROM):可以重复擦除与写入,但是要通过紫外光才能擦除。

④EEPROM(电可擦除可编程ROM,也就是E 2 PROM):解决了EPROM的擦除问题,可以通过加电擦除原数据,擦除更加方便。

⑤Flash(闪速存储器):它综合了EEPROM的优点,极大幅地提高了读写速度。常见的有NOR Flash、NAND Flash。NOR Flash允许程序直接在上面运行,但是价格较贵,NOR Flash有自己的地址线和数据线,可以采用类似于memory的随机访问方式,在NOR Flash上可以直接运行程序,所以NOR Flash可以直接用来做boot,采用NOR Flash启动时会将地址映射到 0x00上。NAND Flash解决了NOR Flash成本较贵的问题,Nand Flash是I/O设备,数据、地址、控制线都是共用的,需要软件区控制读取时序,所以不能像NOR Flash、内存一样随机访问,也不能EIP(片上运行),因此不能直接作为boot。

⑥EMMC (Embedded Multi Media Card):将NAND Flash芯片和控制芯片设计成 1 颗MCP芯片,手机客户只需要采购eMMC芯片,放进新手机中,不需处理其他繁复的NAND Flash兼容性和管理问题,最大优点是缩短新产品的上市周期和研发成本,加速产品的推陈出新速度。

4)外部存储器

嵌入式系统中,常见的外部存储器有CF卡、SD卡等。一般被用来保存大容量的数据,其特点如下:

①CF卡:最早推出的存储卡,体积比磁盘储存器和光盘存储器小,抗磁性好、储存性能稳定。

②SD卡:可以看作CF卡的升级版,体积比CF卡小,安全性也更高。支持SD模式和SPI模式,外围只需简单电路就可以用于嵌入式开发。嵌入式领域最常见的外部存储器SD可以被用作嵌入式操作系统的启动盘来保存操作系统文件。

2.6.3 嵌入式系统存储器管理

由 2.6.2 节图2.11 可知,嵌入式系统中的存储器被组织成为一个类似金字塔的层次结构,这些存储器之间的管理单元通常被称为存储器管理单元(MMU),MMU在CPU和物理内存之间进行地址转换,将地址从逻辑空间映射到物理空间,这个过程称为内存映射。MMU的主要作用包括虚拟存储空间到物理空间的映射,存储器访问权限的控制,设置虚拟存储空间的缓冲特性。Cortex-A系列的很多微处理器带有MMU,然而,在Cortex-M4 内核中,主要采用层次化的总线结构和存储器保护单元(MPU)进行存储器管理。

1)存储器映射

所谓存储器映射是指给存储器分配地址的过程,若再给存储器分配一个地址称为存储区重映射。STM32F4xx是 32 位的微控制器,其总线也是 32 位,可以访问的地址空间有 4G。为了节省资源,STM32F4xx将 4G的存储地址空间划分为不同的功能模块区域,并进行地址映射。

如图2.12 所示为STM32F4xx的存储器映射,存储空间被划分为不同的功能区域。

图2.12 中,STM32F4xx系列芯片的存储器映射地址范围和对应的功能见表2.11。

图2.12 STM32F4xx的存储器映射

表2.11 存储器映射地址范围和对应的功能

2)数据的存储格式

在嵌入式系统存储中,每个地址单元都对应着一个字节,一个字节为 8 bit。但是在C语言中,除了 8 bit的char型之外,还有 16 bit的short型和 32 bit的long型(要看具体的编译器)。另外,对于位数大于 8 位的处理器,例如 16 位或者 32 位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如何将多个字节安排的问题。这样就产生了大端存储模式和小端存储模式。例如,一个 16 bit的short类型变量X,在内存中的地址为 0x0010,X的值为0x1122,那么 0x11 为高字节,0x22 为低字节。常用小端模式存储的处理器有x86,ARM,DSP,51 单片机则采用大端模式。在ARM-Cortex系列处理器中,可以使用REV,REV16,REVSH指令进行大小端的切换。

①小端模式:是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中。

②大端模式:是指数据的低位保存在内存的高地址中,而数据的高位保存在内存的低地址中。

例如,变量X=0x12345678,我们知道,数据在计算机中存储的单位是字节,1Byte=8 Bit=2 个十六进制位。

变量X在内存中有以下两种不同的存储方式:

①小端模式存储。

②大端模式存储。

通常,在通信协议中的数据传输、数组的存储方式、数据的强制转换等都会牵涉大小端问题,如果字节序不一致,就需要大小端转换。

①对于 16 位字数据,可以通过以下代码实现:

②#define BigtoLittle16(A)((((uint16)(A)&0xff00)>>8)|(((uint16)(A)&0x00ff)<<8))

③对于 32 位字数据,可以通过以下代码实现:

④#define BigtoLittle32(A)((((uint32)(A)&0xff000000)>> 24)|(((uint32)(A)&0x00ff0000)>>8)|(((uint32)(A)&0x0000ff00)<<8)|(((uint32)(A)&0x000000ff) <<24))

3)启动流程

所谓启动,一般来说就是指下载好程序后,重启芯片时,SYSCLK的第 4 个上升沿,BOOT引脚的值将被锁存。用户可以通过设置BOOT1 和BOOT0 引脚的状态,来选择在复位后的启动模式,启动模式选择见表2.12。

表2.12 STM32F4xx系列芯片启动模式选择

①主闪存存储器启动:STM32F4xx一般有一个内置的Flash,当使用JTAG或者SWD模式下载程序时,程序被默认下载到内置Flash,重启后程序从内置Flash启动。

②系统存储器启动:这种模式启动的程序功能是由厂家设置的。一般来说,这种启动方式用得较少。系统存储器是芯片内部一块特定的区域,STM32F4xx在出厂时,由ST在这个区域内部预置了一段BootLoader,也就是人们常说的ISP程序,这是一块ROM,出厂后无法修改。一般来说,人们选用这种启动模式,是为了从串口下载程序,因为在厂家提供的BootLoader中,提供了串口下载程序的固件,可以通过这个BootLoader将程序下载到系统的Flash中。但是这个下载方式需要以下步骤:

Step1:将BOOT0 设置为 1,BOOT1 设置为 0,然后按下复位键,这样才能从系统存储器启动BootLoader。

Step2:最后在BootLoader的帮助下,通过串口下载程序到Flash中。

Step3:程序下载完成后,又有需要将BOOT0 设置为GND,手动复位,这样STM32 才可以从Flash中启动看到,利用串口下载程序比较麻烦,需要跳帽跳来跳去,非常不注重用户体验。

③内置SRAM启动:这种模式一般用于程序调试。假如用户只修改了代码中一个小小的地方,然后就需要重新擦除整个Flash,比较费时,可以考虑从这个模式启动代码(即内存区启动),用于快速的程序调试,等程序调试完成后,再将程序下载到SRAM中。

④Flash锁死解决办法:开发调试过程中,由某种原因导致内部Flash锁死,无法连接SWD以及JTAG调试,无法读到设备,可以通过修改BOOT模式重新刷写代码。修改为BOOT0=1,BOOT1=0,即可从系统存储器启动,ST出厂时自带BootLoader程序,SWD以及JTAG调试接口都是专用的。重新烧写程序后,可将BOOT模式重新更换到BOOT0=0,BOOT1=X即可正常使用。 r8th8xtqguhTWIRi0iW1DQmvKjtOLq5YmbsohYn629HJgasIb35CmqMtcwKtSn4O

点击中间区域
呼出菜单
上一章
目录
下一章
×