DSP(28035) CMD使用总结
1.程序空间
这种“数据”有两个特点:a、只要用户程序编写完成,这些“数据”就已经是可知的、可预期的,是由用户编写的程序代码和编译器共同决定的。b、在系统运行过程中,这些数据的内容不会发生任 何变化,只会被读取,不会被修改。(一般使用ROM类存储器)
2.数据空间
- 在运行过程中,动态变化的“量”,需要占用“数据空间”。这些数据在运行过程中,既要被读取,又会被改写,经常在变化。(一般使用RAM类存储器,不需要掉电保存,只需要保证动态数据的实时性即可)
3. 28035内存映射图
CMD文件主要用来对相应芯片型号的DSP进行内存的自定义分配和定义,如下图,用户对CMD文件重定义其实主要是对RAM和ROM空间的重新定义来分配自己程序的存储位置。对CMD文件重定义的需求大致有两方面:
1.FLASH空间重定义来规定以及程序代代码的存储位置(比如你的工程有BOOT程序和APP程序两套程序,你就需要FLash空间重新定义,确保两套程序存储位置相互独立)
2.RAM空间重新定义,对于有对实时性要求较高的代码片段,比如中断函数或者一些自定义的函数,可以为其分配RAM空间,将程序加载在FLASH中,上电运行时将这些函数复制到RAM中来运行(这应该也是DSP的特 {MOD}之一吧)。
- 存储空间的分配方法
例如:FLASHH : origin = 0x3E8000, length = 0x002000 /* on-chip FLASH */
FLASHH:表示该段存储空间的名字,可自定义
origin :存储空间的其实地址
length:存储空间的长度
注意:这里的分配只是对DSP存储空间的划分,并没有指定哪些代码片段应该存放在这段存储空间中。项目中用到的程序具体存放位置是在段(SECTIONS)中来定义的。(可以把DSP存储空间类比于一个图书馆,MEMORY关键 字中的内容相当于对图书馆的空间进行了重新划分,哪个地方放那种类型的书,而你的程序就相当于具体的书籍,这些书籍具体放到你定义的哪个空间中,要通过SECTIONS关键字来实际执行,实际上类似于映射,将你的书籍和你图书馆的空间关联起来)
- SECTIONS段的部分注释
- .text
就是编译后生成的二进制指令代码段,即我们的敲的程序代码。
- .vectors
表示“中断向量段”,也就是中断服务程序的入口地址段。
- 自定义段(section)
ramfuncs : LOAD = FLASHA, /*把存放在ramfuncs的代码或数据存放在FLASHA*/
RUN = RAML0, /*这段代码在RAML0中运行*/
LOAD_START(_RamfuncsLoadStart), /*存放代码的起始地址*/
LOAD_END(_RamfuncsLoadEnd), /*存放代码的结束地址*/
RUN_START(_RamfuncsRunStart_RamfuncsRunStart), /*运行的起始地址*/
PAGE = 0
//程序初始化阶段将自定义段的代码复制到RAML0中
MemCopy(&RamfuncsLoadStart,&RamfuncsLoadEnd,&RamfuncsRunStart);
//用法1:
//将epwm1_timer_isr函数(也可以是其它自定义的函数片段)存放到ramfuncs段(FLASHA)中
#pragma CODE_SECTION(epwm1_timer_isr, "ramfuncs");
//用法2:
//将自定义的数据存放到指定段中
#pragma DATA_SECTION(Buf,"ramdata");
Uint16 Buf[4];