一、前言
我们用Visual Studio
来开发程序时,可以选择编译Debug
版本,也可以选择编译Release
版本。Debug版本为调试版本,Release版本为对外发布版本。
同样,在我们嵌入式软件中,也有类似这样子的做法。在嵌入式中,我们可以编译输出RAM版本
的可执行文件用于在线调试,也可以编译输出FLASH版本
的可执行文件固化到FLASH
中。
二、TI的DSP官方例程中RAM版本与FLASH版本怎么切换
1、切换方法
首先,看一下TI
的DSP
例程工程,其工程默认是编译RAM版本
的:
那么,怎么修改使其编译生成FLASH版本
的可执行文件呢?我们可以看到系统控制初始化函数里的代码如下:
显然,根据我们的C语言知识,只要我们定义宏_FLASH
就可以切换为FLASH
版本了。那么,我们需要手动添加这一句宏代码吗。其实是不用的,我们可以在工程属性Properties
里头添加:
在Predefined Symbols
里添加_FLASH
宏:
然后,再修改Configuration
为CPU1_FLASH
:
可以看到,工程目录下多了一个CPU1_FLASH
文件夹:
编译之后生成的就是FLASH版本
的.out
后缀的可执行文件。如果我们想再切换为RAM版本
,则只需把_FLASH
宏给删掉,再把Configuration
改为CPU1_RAM
即可,重新编译就可以生成RAM版本
的.out
文件。
我们在工程属性里定义的预定义宏的作用范围是整个工程都有效的。这在我们在使用keil MDK
做STM32
开发时也是有类似操作的,如:
同样的,keil MDK
也是可以设置多个target
的,如:
2、为什么存在RAM模式和FLASH模式呢?
在开发调试阶段为了节省程序装载时间和延长Flash
寿命,可以将代码空间定位到CPU内部RAM
中进行调试,等到调试完毕,确定代码编写得没问题之后,就可以切换至FLASH模式
进行编译,输出最终的可执行文件。这就是一个工程同时包含RAM
版本与FLASH
版本的意义。
除此之外,RAM
是易失性存储器,即掉电数据会丢失;FLASH
是非易失性存储器,即掉电之后数据还是存在的。所以,我们最终的程序都是要下载到FLASH
中的,并且烧写到FLASH
中的可执行文件(带调试信息)也是可以进行在线调试的。可以没有RAM
版本代码,但不可没有FLASH
版本的代码。
三、科普:常见存储器种类
下面,我们一起来归纳学习一下常见的存储器种类。以下内容摘抄于野火《零死角玩转STM32-F429挑战者V2.pdf》
。
存储器是计算机结构的重要组成部分。存储器是用来存储程序代码和数据的部件,有了存储器计算机才具有记忆功能。基本的存储器种类如:
存储器按其存储介质特性主要分为易失性存储器
和非易失性存储器两
大类。其中的易失/非易失
是指存储器断电后,它存储的数据内容是否会丢失的特性。由于一般易失性存储器存取速度快,而非易失性存储器可长期保存数据,它们都在计算机中占据着重要角色。在计算机中易失性存储器最典型的代表是内存,非易失性存储器的代表则是硬盘 。
1、RAM 存储器(易失性存储器)
RAM
是Random Access Memory
的缩写,被译为随机存储器。 所谓随机存取,指的是当存储器中的消息被读取或写入时,所需要的时间与这段信息所在的位置无关。 现在 RAM
已经专门用于指代作为计算机内存的易失性半导体存储器。
根据 RAM 的存储机制,又分为动态随机存储器 DRAM(Dynamic RAM)
以及静态随机存储器 SRAM(Static RAM)
两种。
(1)DRAM
动态随机存储器 DRAM 的存储单元以电容的电荷来表示数据,有电荷代表 1
,无电荷代表 0
。如:
但时间一长,代表 1
的电容会放电,代表 0
的电容会吸收电荷,因此它需要定期刷新操作,这就是动态(Dynamic)
一词所形容的特性。刷新操作会对电容进行检查,若电量大于满电量的 1/2
,则认为其代表 1
,并把电容充满电; 若电量小于 1/2
,则认为其代表 0
,并把电容放电,藉此来保证数据的正确性。
- SDRAM
根据 DRAM 的通讯方式,又分为同步
和异步
两种,这两种方式根据通讯时是否需要使用时钟信号来区分。 下图一种利用时钟进行同步的通讯时序,它在时钟的上升沿表示有效数据:
由于使用时钟同步的通讯速度更快,所以同步 DRAM
使用更为广泛,这种 DRAM
被称为 SDRAM(Synchronous DRAM)
。
- DDR SDRAM
为了进一步提高 SDRAM
的通讯速度,人们设计了 DDR SDRAM
存储器(Double DataRate SDRAM)
。它的存储特性与 SDRAM
没有区别,但 SDRAM
只在上升沿表示有效数据,在 1 个时钟周期内,只能表示 1 个有数据。
而 DDR SDRAM
在时钟的上升沿及下降沿各表示一个数据,也就是说在 1 个时钟周期内可以表示 2 数据,在时钟频率同样的情况下,提高了一倍的速度。至于 DDRII
和 DDRIII
,它们的通讯方式并没有区别,主要是通讯同步时钟的频率提高了。
当前个人计算机常用的内存条是 DDRIII SDRAM
存储器,在一个内存条上包含多个DDRIII SDRAM
芯片 。
(2)SRAM
静态随机存储器 SRAM 的存储单元以锁存器来存储数据,如:
这种电路结构不需要定时刷新充电,就能保持状态(当然,如果断电了,数据还是会丢失的),所以这种存储器被称为静态(Static)RAM
。
同样地, SRAM
根据其通讯方式也分为同步(SSRAM)
和异步 SRAM
。
(3)DRAM 与 SRAM 的应用场合
对比 DRAM
与 SRAM
的结构,可知 DRAM
的结构简单得多,所以生产相同容量的存储器, DRAM
的成本要更低,且集成度更高。而 DRAM
中的电容结构则决定了它的存取速度不如 SRAM
,特性对比 如:
所以在实际应用场合中, SRAM
一般只用于 CPU 内部的高速缓存(Cache)
,而外部扩展的内存一般使用 DRAM
。
2、非易失性存储器
非易失性存储器种类非常多,半导体类的有 ROM
和 FLASH
,而其它的则包括光盘、软盘及机械硬盘。
(1)ROM存储器
ROM
是Read Only Memory
的缩写,意为只能读的存储器。 现在一般用于指代非易失性半导体存储器,包括后面介绍的 FLASH
存储器,有些人也把它归到 ROM
类里边 。
- MASK ROM
MASK(掩膜) ROM
就是正宗的Read Only Memory
,存储在它内部的数据是在出厂时使用特殊工艺固化的,生产后就不可修改,其主要优势是大批量生产时成本低。当前在生产量大,数据不需要修改的场合,还有应用。
- OTPROM
OTPROM(One Time Programable ROM)
是一次可编程存储器。这种存储器出厂时内部并没有资料,用户可以使用专用的编程器将自己的资料写入,但只能写入一次,被写入过后,它的内容也不可再修改。在 NXP 公司生产的控制器芯片中常使用 OTPROM
来存储密钥; STM32F429
系列的芯片内部也包含有一部分的 OTPROM
空间。
- EPROM
EPROM(Erasable Programmable ROM)
是可重复擦写的存储器,它解决了 PROM
芯片只能写入一次的问题。这种存储器使用紫外线照射芯片内部擦除数据,擦除和写入都要专用的设备。现在这种存储器基本淘汰,被 EEPROM
取代。
- EEPROM
EEPROM(Electrically Erasable Programmable ROM)
是电可擦除存储器。 EEPROM
可以重复擦写,它的擦除和写入都是直接使用电路控制,不需要再使用外部设备来擦写。而且可以按字节为单位修改数据,无需整个芯片擦除。现在主要使用的 ROM
芯片都是EEPROM
。
(2)FLASH 存储器
FLASH
存储器又称为闪存,它也是可重复擦写的储器,部分书籍会把 FLASH
存储器称为 FLASH ROM
,但它的容量一般比 EEPROM
大得多,且在擦除时,一般以多个字节为单位。
如有的 FLASH
存储器以 4096
个字节为扇区,最小的擦除单位为一个扇区。根据存储单元电路的不同, FLASH
存储器又分为 NOR FLASH
和 NAND FLASH
,如:
NOR
与 NAND
的共性是在数据写入前都需要有擦除操作,而擦除操作一般是以扇区/块
为单位的。而 NOR
与 NAND
特性的差别,主要是由于其内部地址/数据线
是否分开导致的。
由于 NOR
的地址线和数据线分开,它可以按字节
读写数据,符合 CPU
的指令译码执行要求,所以假如 NOR
上存储了代码指令, CPU
给 NOR
一个地址, NOR
就能向CPU
返回一个数据让 CPU
执行,中间不需要额外的处理操作。
而由于 NAND
的数据和地址线共用,只能按块
来读写数据,假如 NAND
上存储了代码指令, CPU
给 NAND
地址后,它无法直接返回该地址的数据,所以不符合指令译码要求。 这就是最后一项是否支持 XIP
描述的就是这种立即执行的特性(eXecute In Place)
。
若代码存储在 NAND
上,可以把它先加载到 RAM
存储器上,再由 CPU
执行。所以在功能上可以认为 NOR
是一种断电后数据不丢失的 RAM
,但它的擦除单位与 RAM
有区别,且读写速度比 RAM
要慢得多。
另外, FLASH
的擦除次数都是有限的(现在普遍是 10 万次左右),当它的使用接近寿命的时候,可能会出现写操作失败。由于 NAND
通常是整块擦写,块内有一位失效整个块就会失效,这被称为坏块
。
而且由于擦写过程复杂,从整体来说 NOR
块块更少,寿命更长。由于可能存在坏块,所以 FLASH 存储器需要探测/错误更正(EDC/ECC)算法
来确保数据的正确性。
由于两种 FLASH
存储器特性的差异, NOR FLASH
一般应用在代码存储的场合,如嵌入式控制器内部的程序存储空间。而 NAND FLASH
一般应用在大数据量存储的场合,包括 SD 卡、 U 盘以及固态硬盘等,都是 NAND FLASH
类型的 。
四、总结
1、一个工程可以创建多个target以区分不同模式(RAM模式、FLASH模式)的代码;也可以创建多个target用来适配不同的硬件方案,如有些项目既有有用到小屏幕,也有用到大屏幕,那么就可以创建一个针对大屏的target、一个针对小屏幕的target,方便代码维护。
2、存储器分两大类:一类是掉电易失的,另一类是掉电不易失的。