【DSP笔记】TI官方例程中切换RAM、FLASH工程版本的方法

一、前言

我们用Visual Studio来开发程序时,可以选择编译Debug版本,也可以选择编译Release版本。Debug版本为调试版本,Release版本为对外发布版本。

同样,在我们嵌入式软件中,也有类似这样子的做法。在嵌入式中,我们可以编译输出RAM版本的可执行文件用于在线调试,也可以编译输出FLASH版本的可执行文件固化到FLASH中。

二、TI的DSP官方例程中RAM版本与FLASH版本怎么切换

1、切换方法

首先,看一下TIDSP例程工程,其工程默认是编译RAM版本的:

那么,怎么修改使其编译生成FLASH版本的可执行文件呢?我们可以看到系统控制初始化函数里的代码如下:

显然,根据我们的C语言知识,只要我们定义宏_FLASH就可以切换为FLASH版本了。那么,我们需要手动添加这一句宏代码吗。其实是不用的,我们可以在工程属性Properties里头添加:

Predefined Symbols里添加_FLASH宏:

然后,再修改ConfigurationCPU1_FLASH

可以看到,工程目录下多了一个CPU1_FLASH文件夹:

编译之后生成的就是FLASH版本.out后缀的可执行文件。如果我们想再切换为RAM版本,则只需把_FLASH 宏给删掉,再把Configuration改为CPU1_RAM即可,重新编译就可以生成RAM版本.out文件。

我们在工程属性里定义的预定义宏的作用范围是整个工程都有效的。这在我们在使用keil MDKSTM32开发时也是有类似操作的,如:

同样的,keil MDK也是可以设置多个target的,如:

2、为什么存在RAM模式和FLASH模式呢?

在开发调试阶段为了节省程序装载时间和延长Flash寿命,可以将代码空间定位到CPU内部RAM中进行调试,等到调试完毕,确定代码编写得没问题之后,就可以切换至FLASH模式进行编译,输出最终的可执行文件。这就是一个工程同时包含RAM版本与FLASH版本的意义。

除此之外,RAM是易失性存储器,即掉电数据会丢失;FLASH是非易失性存储器,即掉电之后数据还是存在的。所以,我们最终的程序都是要下载到FLASH中的,并且烧写到FLASH中的可执行文件(带调试信息)也是可以进行在线调试的。可以没有RAM版本代码,但不可没有FLASH版本的代码。

三、科普:常见存储器种类

下面,我们一起来归纳学习一下常见的存储器种类。以下内容摘抄于野火《零死角玩转STM32-F429挑战者V2.pdf》

存储器是计算机结构的重要组成部分。存储器是用来存储程序代码和数据的部件,有了存储器计算机才具有记忆功能。基本的存储器种类如:

存储器按其存储介质特性主要分为易失性存储器非易失性存储器两大类。其中的易失/非易失是指存储器断电后,它存储的数据内容是否会丢失的特性。由于一般易失性存储器存取速度快,而非易失性存储器可长期保存数据,它们都在计算机中占据着重要角色。在计算机中易失性存储器最典型的代表是内存,非易失性存储器的代表则是硬盘 。

1、RAM 存储器(易失性存储器)

RAMRandom 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 数据,在时钟频率同样的情况下,提高了一倍的速度。至于 DDRIIDDRIII,它们的通讯方式并没有区别,主要是通讯同步时钟的频率提高了。

当前个人计算机常用的内存条是 DDRIII SDRAM 存储器,在一个内存条上包含多个DDRIII SDRAM 芯片 。

(2)SRAM

静态随机存储器 SRAM 的存储单元以锁存器来存储数据,如:

这种电路结构不需要定时刷新充电,就能保持状态(当然,如果断电了,数据还是会丢失的),所以这种存储器被称为静态(Static)RAM

同样地, SRAM 根据其通讯方式也分为同步(SSRAM)和异步 SRAM

(3)DRAM 与 SRAM 的应用场合

对比 DRAMSRAM 的结构,可知 DRAM 的结构简单得多,所以生产相同容量的存储器, DRAM 的成本要更低,且集成度更高。而 DRAM 中的电容结构则决定了它的存取速度不如 SRAM ,特性对比 如:

所以在实际应用场合中, SRAM 一般只用于 CPU 内部的高速缓存(Cache),而外部扩展的内存一般使用 DRAM

2、非易失性存储器

非易失性存储器种类非常多,半导体类的有 ROMFLASH,而其它的则包括光盘、软盘及机械硬盘。

(1)ROM存储器

ROMRead 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 FLASHNAND FLASH,如:

NORNAND 的共性是在数据写入前都需要有擦除操作,而擦除操作一般是以扇区/块为单位的。而 NORNAND 特性的差别,主要是由于其内部地址/数据线是否分开导致的。

由于 NOR 的地址线和数据线分开,它可以按字节读写数据,符合 CPU 的指令译码执行要求,所以假如 NOR 上存储了代码指令, CPUNOR 一个地址, NOR 就能向CPU 返回一个数据让 CPU 执行,中间不需要额外的处理操作。

而由于 NAND 的数据和地址线共用,只能按来读写数据,假如 NAND 上存储了代码指令, CPUNAND 地址后,它无法直接返回该地址的数据,所以不符合指令译码要求。 这就是最后一项是否支持 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、存储器分两大类:一类是掉电易失的,另一类是掉电不易失的。


我的个人博客网站为:https://zhengnianli.github.io

我的微信公众号为:嵌入式大杂烩


 上一篇
【C语言笔记】联合体 【C语言笔记】联合体
一、什么是联合体?在C语言中,变量的定义是分配存储空间的过程。一般的,每个变量都具有其独有的存储空间,那么可不可以在同一个内存空间中存储不同的数据类型(不是同事存储)呢? 答案是可以的,使用联合体就可以达到这样的目的。联合体也叫共用体,在C
2019-08-01
下一篇 
【DSP笔记】下载程序遇到的问题及解决方法 【DSP笔记】下载程序遇到的问题及解决方法
一、前言最近拿到了一块TI官方的DSP开发板,芯片型号是:TMS320F280049C,板载调试器XDS110。但是下载程序时遇到了一点问题,现记录总结如下: TMS320F280049C特性: 二、下载程序时遇到的问题及解决方法之
2019-07-25
  目录