关于CCS烧写FLASH和烧写RAM的一些理解,如何修改CMD文件。

RAM、ROM、FLASH存储器

1、RAM和ROM的区别

RAM和ROM的区别,或者说ROM和RAM的区别是什么呢?ROM和RAM都是一种存储技术,只是两者原理不同,**RAM为随机存储,掉电不会保存数据,而ROM可以在掉电的情况下,依然保存原有的数据。ROM和RAM指的都是半导体存储器。**本来的含义是:ROM是Read Only Memory的意思,也就是说这种存储器只能读,不能写。而RAM是Random Access Memory的缩写。这个词的由来是因为早期的计算机曾经使用磁鼓作为内存,而磁鼓和磁带都是典型的顺序读写设备。RAM则可以随机读写。

内存RAM是指随机存取存储器(random access memory,RAM)又称作"随机存储器",是与CPU直接交换数据的内部存储器,也叫主存(内存)。 它可以随时读写,而且速度很快,通常作为操作系统或其他正在运行中的程序的短时间临时数据存储媒介。

通俗的说,比如在电脑中,大家都知道有内存和硬盘之说,其实内存就是一种RAM技术,而ROM则类似于硬盘技术,两者都是存储器,只是RAM的速度要远远高于ROM的速度,在电脑日常操作中,很多程序都将临时运行的程序命令,存放在内存中,但一旦关机或者停电,内存里原本临时存储的程序信息将全部被清空,也就是内存只能临时存储东西,不能长久保存,而ROM则可以存储,即使掉电后也可以找到之前存储的文件,这也就是硬盘了。

在手机中,RAM是指手机内存,属于手机内部存储器,属于随机存储,速度高于ROM,对于手机配置性能起着重要的决定性,另外掉电后,数据被清空,比如手机运行着QQ与其它软件,重启手机后,软件就没有处于登录状态。

而**ROM则属于外部存储,比如我们经常可以购买SD卡放入手机里面,则就是手机ROM,手机ROM就是我们通常说的存储卡,也可以简单的理解成手机硬盘吧。**用来存储手机系统文件、图片、电影等等,不会随着掉电而丢失数据,ROM越大存储的数据就越多。

**RAM可以反复擦写,内存的寿命和老化有关,而和读写次数无关。**这里举例DRAM(Dynamic Random Access Memory)是靠电容来存储电荷,用电荷存在与否来表示"0""1",这个过程可以说没有电子元件物理状态的改变,只是电荷是不是在电容中而已。

2、FLASH 存储器

**Flash 存储器(FLASH EEPROM)又称闪存,快闪。它是EEPROM的一种。它结合了ROM和RAM的长处。不仅具备电子可擦除可编辑(EEPROM)的性能,还不会断电丢失数据同时可以快速读取数据。**它于EEPROM的最大区别是,FLASH按扇区(block)操作,而EEPROM按照字节操作。FLASH的电路结构较简单,同样容量占芯片面积较小,成本自然比EEPROM低,因此适合用于做程序存储器。

3、ROM, FLASH和RAM的区别

对于RAM, ROM以及FLASH的区别,简单地说,在计算机中,RAM 、ROM都是数据存储器。RAM 是随机存取存储器,它的特点是易挥发性,即掉电失忆。ROM 通常指固化存储器(一次写入,反复读取),它的特点与RAM 相反。ROM又分一次性固化、光擦除和电擦除重写两种类型。

在应用中,常规上ROM是用来存储固化程序的,RAM是用来存放数据的。由于FLASH ROM比普通的ROM读写速度快,擦写方便,一般用来存储用户程序和需要永久保存的数据。譬如说,现在家用的电子式电度表,它的内核是一款单片机,该单片机的程序就是存放在ROM里的。电度表在工作过程中,是要运算数据的,要采集电压和电流,并根据电压和电流计算出电度来。电压和电流时一个适时的数据,用户不关心,它只是用来计算电度用,计算完后该次采集的数据就用完了,然后再采集下一次,因此这些值就没必要永久存储,就把它放在RAM里边。然而计算完的电度,是需要永久保存的,单片机会定时或者在停电的瞬间将电度数存入到FLASH里。

烧写FLASH和烧写RAM

CMD文件,又称链接命令文件,主要作用是分配ROM和RAM空间,它告诉链接程序怎样计算地址和分配空间。例如,应该把程序放在哪块地址内,把数据放在哪块地址内以及把程序中定义的某些变量放在哪块地址内。

使用F28335进行烧写.out文件时,如果使用的是28335_RAM_lnk.cmd文件,那么就是把.out文件烧写到RAM,用RAM可以一直烧写debug,但是最后固化程序之后再烧写到flash,就需要选择F28335.cmd文件,这样最后烧写就是直接烧写到flash,在CCS下找到该文件,右击28335_RAM_Ink.cmd,将Exclude from Build勾选,在F28335.cmd中取消Exclude from Build勾选,就可以将程序烧写到Flash中。反之,烧写到RAM 中。

程序烧入Flash和烧入RAM这两种烧写方式分别使用的是两个不同的 cmd 文件,所以请首先请确认你的工程使用的是flash烧写所对应的 cmd 文件。

如果使用的是RAM烧写所对应的cmd文件,则程序只能在仿真模式下运行,并没有写入flash,断电之后程序会被清除。在断开仿真器重新上电之后,所运行的仍然是之前flash中一直存在的程序。

程序过长如何修改CMD文件

我们如果.c文件的程序编写过长,就可能会超出存储器的范围,出现这样的报错:error #10099-D: program will not fit into available memory.

那么这个时候就需要修改CMD文件,打开CMD文件,找到.text:

cpp 复制代码
#endif    
   
   .text            : > RAML1,     PAGE = 0
   .cinit           : > RAML0,     PAGE = 0
   .pinit           : > RAML0,     PAGE = 0
   .switch          : > RAML0,     PAGE = 0

   .stack           : > RAMM1,     PAGE = 1
   .ebss            : > RAML4,     PAGE = 1
   .econst          : > RAML5,     PAGE = 1
   .esysmem         : > RAMM1,     PAGE = 1

   IQmath           : > RAML1,     PAGE = 0
   IQmathTables     : > IQTABLES,  PAGE = 0, TYPE = NOLOAD

说明.text对应的段,也就是我们编写的程序是在RAML1,PAGE =0的位置,我们找到RAML1:

发现PAGE 0 对应的RAML1的位置在0x009000,长度是0x001000,如果需要将此位置变大,则可以将PAGE 0 下的RAML2的行代码注释,把RAML1的长度改成length = 0x002000。这样就能实现编译。

cpp 复制代码
MEMORY
{
PAGE 0 :
   /* BEGIN is used for the "boot to SARAM" bootloader mode      */

   BEGIN      : origin = 0x000000, length = 0x000002     /* Boot to M0 will go here                      */
   RAMM0      : origin = 0x000050, length = 0x0003B0
   RAML0      : origin = 0x008000, length = 0x001000
   RAML1      : origin = 0x009000, length = 0x002000
//   RAML2      : origin = 0x00A000, length = 0x001000
   RAML3      : origin = 0x00B000, length = 0x001000
   ZONE7A     : origin = 0x200000, length = 0x00FC00    /* XINTF zone 7 - program space */
   CSM_RSVD   : origin = 0x33FF80, length = 0x000076     /* Part of FLASHA.  Program with all 0x0000 when CSM is in use. */
   CSM_PWL    : origin = 0x33FFF8, length = 0x000008     /* Part of FLASHA.  CSM password locations in FLASHA            */
   ADC_CAL    : origin = 0x380080, length = 0x000009
   RESET      : origin = 0x3FFFC0, length = 0x000002
   IQTABLES   : origin = 0x3FE000, length = 0x000b50
   IQTABLES2  : origin = 0x3FEB50, length = 0x00008c
   FPUTABLES  : origin = 0x3FEBDC, length = 0x0006A0
   BOOTROM    : origin = 0x3FF27C, length = 0x000D44

PAGE 1 :
   /* BOOT_RSVD is used by the boot ROM for stack.               */
   /* This section is only reserved to keep the BOOT ROM from    */
   /* corrupting this area during the debug process              */

   BOOT_RSVD  : origin = 0x000002, length = 0x00004E     /* Part of M0, BOOT rom will use this for stack */
   RAMM1      : origin = 0x000400, length = 0x000400     /* on-chip RAM block M1 */
   RAML4      : origin = 0x00C000, length = 0x001000
   RAML5      : origin = 0x00D000, length = 0x001000
   RAML6      : origin = 0x00E000, length = 0x001000
   RAML7      : origin = 0x00F000, length = 0x001000
   ZONE7B     : origin = 0x20FC00, length = 0x000400     /* XINTF zone 7 - data space */
}

如何防止烧写过程中加密FLASH

编译完工程之后,我们先不要急着将.out文件烧写到板子上,点开DEBUG文件夹下的.map文件,代码如下:

cpp 复制代码
******************************************************************************
             TMS320C2000 Linker PC v21.6.0                     
******************************************************************************
>> Linked Tue Aug 24 21:52:56 2021

OUTPUT FILE NAME:   <SVPWM_HZB_Active.out>
ENTRY POINT SYMBOL: "_c_int00"  address: 0000a2a0

MEMORY CONFIGURATION

         name            origin    length      used     unused   attr    fill
----------------------  --------  ---------  --------  --------  ----  --------
PAGE 0:
  BEGIN                 00000000   00000002  00000002  00000000  RWIX
  RAMM0                 00000050   000003b0  00000000  000003b0  RWIX
  RAML0                 00008000   00001000  0000004b  00000fb5  RWIX
  RAML1                 00009000   00002000  00001429  00000bd7  RWIX
  RAML3                 0000b000   00001000  00000000  00001000  RWIX
  ZONE7A                00200000   0000fc00  00000000  0000fc00  RWIX
**//只要这两行代码是这个就说明修改的CMD文件没有把FLASH加密可以放心地进行烧写** 
  **CSM_RSVD              0033ff80   00000076  00000000  00000076  RWIX
  CSM_PWL               0033fff8   00000008  00000000  00000008  RWIX**
  ADC_CAL               00380080   00000009  00000007  00000002  RWIX
  IQTABLES              003fe000   00000b50  00000000  00000b50  RWIX
  IQTABLES2             003feb50   0000008c  00000000  0000008c  RWIX
  FPUTABLES             003febdc   000006a0  00000000  000006a0  RWIX
  BOOTROM               003ff27c   00000d44  00000000  00000d44  RWIX
  RESET                 003fffc0   00000002  00000000  00000002  RWIX

PAGE 1:
  BOOT_RSVD             00000002   0000004e  00000000  0000004e  RWIX
  RAMM1                 00000400   00000400  00000300  00000100  RWIX
  DEV_EMU               00000880   00000180  000000d0  000000b0  RWIX
  FLASH_REGS            00000a80   00000060  00000008  00000058  RWIX
  CSM                   00000ae0   00000010  00000010  00000000  RWIX
  ADC_MIRROR            00000b00   00000010  00000010  00000000  RWIX
  XINTF                 00000b20   00000020  0000001e  00000002  RWIX
  CPU_TIMER0            00000c00   00000008  00000008  00000000  RWIX
  CPU_TIMER1            00000c08   00000008  00000008  00000000  RWIX
  CPU_TIMER2            00000c10   00000008  00000008  00000000  RWIX
  PIE_CTRL              00000ce0   00000020  0000001a  00000006  RWIX
  PIE_VECT              00000d00   00000100  00000100  00000000  RWIX
  DMA                   00001000   00000200  000000e0  00000120  RWIX
  MCBSPA                00005000   00000040  00000025  0000001b  RWIX
  MCBSPB                00005040   00000040  00000025  0000001b  RWIX
  ECANA                 00006000   00000040  00000034  0000000c  RWIX
  ECANA_LAM             00006040   00000040  00000040  00000000  RWIX
  ECANA_MOTS            00006080   00000040  00000040  00000000  RWIX
  ECANA_MOTO            000060c0   00000040  00000040  00000000  RWIX
  ECANA_MBOX            00006100   00000100  00000100  00000000  RWIX
  ECANB                 00006200   00000040  00000034  0000000c  RWIX
  ECANB_LAM             00006240   00000040  00000040  00000000  RWIX
  ECANB_MOTS            00006280   00000040  00000040  00000000  RWIX
  ECANB_MOTO            000062c0   00000040  00000040  00000000  RWIX
  ECANB_MBOX            00006300   00000100  00000100  00000000  RWIX
  EPWM1                 00006800   00000022  00000022  00000000  RWIX
  EPWM2                 00006840   00000022  00000022  00000000  RWIX
  EPWM3                 00006880   00000022  00000022  00000000  RWIX
  EPWM4                 000068c0   00000022  00000022  00000000  RWIX
  EPWM5                 00006900   00000022  00000022  00000000  RWIX
  EPWM6                 00006940   00000022  00000022  00000000  RWIX
  ECAP1                 00006a00   00000020  00000020  00000000  RWIX
  ECAP2                 00006a20   00000020  00000020  00000000  RWIX
  ECAP3                 00006a40   00000020  00000020  00000000  RWIX
  ECAP4                 00006a60   00000020  00000020  00000000  RWIX
  ECAP5                 00006a80   00000020  00000020  00000000  RWIX
  ECAP6                 00006aa0   00000020  00000020  00000000  RWIX
  EQEP1                 00006b00   00000040  00000040  00000000  RWIX
  EQEP2                 00006b40   00000040  00000040  00000000  RWIX
  GPIOCTRL              00006f80   00000040  0000002e  00000012  RWIX
  GPIODAT               00006fc0   00000020  00000020  00000000  RWIX
  GPIOINT               00006fe0   00000020  0000000a  00000016  RWIX
  SYSTEM                00007010   00000020  00000020  00000000  RWIX
  SPIA                  00007040   00000010  00000010  00000000  RWIX
  SCIA                  00007050   00000010  00000010  00000000  RWIX
  XINTRUPT              00007070   00000010  00000010  00000000  RWIX
  ADC                   00007100   00000020  0000001e  00000002  RWIX
  SCIB                  00007750   00000010  00000010  00000000  RWIX
  SCIC                  00007770   00000010  00000010  00000000  RWIX
  I2CA                  00007900   00000040  00000022  0000001e  RWIX
  RAML4                 0000c000   00001000  00000844  000007bc  RWIX
  RAML5                 0000d000   00001000  00000100  00000f00  RWIX
  RAML6                 0000e000   00001000  00000000  00001000  RWIX
  RAML7                 0000f000   00001000  00000000  00001000  RWIX
  ZONE7B                0020fc00   00000400  00000000  00000400  RWIX
  CSM_PWL               0033fff8   00000008  00000008  00000000  RWIX
cpp 复制代码
//只要这两行代码是正确的
//就说明程序编译之后没有把FLASH加密可以放心地进行烧写!
  CSM_RSVD              0033ff80   00000076  00000000  00000076  RWIX
  CSM_PWL               0033fff8   00000008  00000000  00000008  RWIX

以上就是关于烧写FLASH和烧写RAM的一些理解。

相关推荐
nuoxin1147 天前
BL-M8812CU3 无线 WiFi 模块-富利威
人工智能·嵌入式硬件·fpga开发·硬件工程·dsp开发
Dr.kangder13 天前
嵌入式软件程序分析技术:原理、方法与实战
servlet·架构·嵌入式·dsp开发
nuoxin1141 个月前
HR4988替代A4988-富利威
网络·人工智能·嵌入式硬件·fpga开发·dsp开发
神奇元创2 个月前
商用级光路加速卡:大模型推理的极速落地方案
python·神经网络·fpga开发·dsp开发
nuoxin1142 个月前
WILX1200HC-5TG144I替代 LCMXO2-1200HC-5TG144I(富利威)
人工智能·嵌入式硬件·fpga开发·电脑·硬件工程·dsp开发
粉色挖掘机2 个月前
lib文件查看函数方法之—反汇编查看函数名称
嵌入式硬件·dsp开发·ccs
XINVRY-FPGA2 个月前
XC7Z035-2FFG900I Xilinx/AMD Zynq-7000 SoC FPGA
人工智能·嵌入式硬件·计算机视觉·fpga开发·硬件工程·dsp开发·fpga
jing.wang_20252 个月前
TI TMS320C6678芯片实现IP及端口在线修改并生效
网络·嵌入式硬件·tcp/ip·dsp开发
XINVRY-FPGA3 个月前
XC7Z010-2CLG400I Xilinx Zynq-7000 FPGA
arm开发·嵌入式硬件·算法·fpga开发·硬件工程·dsp开发·fpga