当前位置:首页 > DSP28335—CMD文件解读(映射关系) - 图文
DSP28335—CMD解读(1)
在DSP28335工程文件里(不用BIOS产生CMD文件),手写CMD文件一般有两个,在RAM里调试时用的两个CMD文件分别为DSP2833x_Headers_nonBIOS.cmd和28335_RAM_lnk.cmd,烧写到flash里时用的两个CMD文件分别为DSP2833x_Headers_nonBIOS.cmd和F28335.cmd,其中
DSP2833x_Headers_nonBIOS.cmd文件可以在所有工程文件中通用,主要作用是把外设寄存器产生的数据段映射到对应的存储空间,可以跟DSP2833x_GlobalVariableDefs.c文件对照一下看看。下面通过一个简单例子,比如向CpuTimer0Regs. TIM.all写数据,来解读一下CMD文件是如何把寄存器里的值准确映射到所在存储器的位置的。
先在DSP2833x_GlobalVariableDefs.c文件里找到以下几行代码: #ifdef __cplusplus
#pragma DATA_SECTION(\#else
#pragma DATA_SECTION(CpuTimer0Regs,\#endif
volatile struct CPUTIMER_REGS CpuTimer0Regs;
由上可知CpuTimer0Regs是一个结构体变量名(其定义在DSP2833x_CpuTimers.c文件里),通过预处理命令#pragma 为这个结构体定义了一个名称为CpuTimer0RegsFile的数据段。 接着在DSP2833x_Headers_nonBIOS.cmd文件里找到如下代码: SECTIONS {
PieVectTableFile : > PIE_VECT, PAGE = 1
DevEmuRegsFile : > DEV_EMU, PAGE = 1 FlashRegsFile : > FLASH_REGS, PAGE = 1 CsmRegsFile : > CSM, PAGE = 1 AdcMirrorFile : > ADC_MIRROR, PAGE = 1 XintfRegsFile : > XINTF, PAGE = 1 CpuTimer0RegsFile : > CPU_TIMER0, PAGE = 1 ...... }
红字体代码的作用就是,通过SECTIONS伪指令把CpuTimer0RegsFile数据段装载到名称为CPU_TIMER0的存储空间。
同样在DSP2833x_Headers_nonBIOS.cmd文件里找到如下代码: MEMORY {
PAGE 0: PAGE 1:
DEV_EMU : origin = 0x000880, length = 0x000180 FLASH_REGS : origin = 0x000A80, length = 0x000060
CSM : origin = 0x000AE0, length = 0x000010
ADC_MIRROR : origin = 0x000B00, length = 0x000010 XINTF : origin = 0x000B20, length = 0x000020
CPU_TIMER0 : origin = 0x000C00, length = 0x000008 ...... }
CPU_TIMER0存储空间通过MEMORY伪指令指示了其起始地址和长度,也就等于间接确定了结构体CpuTimer0Regs的具体位置,所以通过以上几层映射关系,当向CpuTimer0Regs. TIM.all写数据时就可以准确的写入DSP内部寄存器所在的存储器的位置。由此看见,CMD的作用就是为程序代码和数据分配存储空间。本节先针对DSP2833x_Headers_nonBIOS.cmd文件做一下解读,后续再分别解读一下CMD用于调试和烧写时需要注意哪些问题。
另外有关volatile关键字的解读可参考http://blog.sina.com.cn/s/blog_762cf5f80101aosq.html
本文原创,与同样在努力学习DSP的你共享~
如有错,请指出~O(∩_∩)O谢谢
在nonBIOS情况下,CMD文件不外乎就三个:28335_RAM_lnk.cmd(用于仿真调
试) 、 DSP2833x_Headers_nonBIOS.cmd 、 F28335.cmd(用于flash烧写)。仿真调试时只用前两个,用于flash烧写时只用后两个,且不管在何种方式下28335_RAM_lnk.cmd和F28335.cmd不能同时用,也不能代替用。
在DSP28335—CMD文件解读(1)中,已经介绍过DSP2833x_Headers_nonBIOS.cmd 。
在用28335_RAM_lnk.cmd时,一般情况下直接用TI给的,不需要做修改即可满足调试用,模式较固定,当然你也可以做相应的修改用到哪块RAM存储空间,在CMD文件里做相应的分配即可。
MEMORY {
PAGE 0 :
BEGIN : origin = 0x000000, length = 0x000002
BOOT_RSVD : origin = 0x000002, length = 0x00004E RAMM0 : origin = 0x000050, length = 0x0003B0
RAML : origin = 0x008000, length = 0x004000
ZONE7A : origin = 0x200000, length = 0x00FC00
CSM_RSVD : origin = 0x33FF80, length = 0x000076 CSM_PWL : origin = 0x33FFF8, length = 0x000008 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 :
RAMM : origin = 0x000400, length = 0x000400
RAMH : origin = 0x00C000, length = 0x004000 ZONE6B : origin = 0x13FC00, length = 0x000400
ZONE7B : origin = 0x20FC00, length = 0x000400 }
SECTIONS {
codestart : > BEGIN, PAGE = 0 ramfuncs : > RAML, PAGE = 0 .text : > RAML, PAGE = 0 .cinit : > RAML, PAGE = 0 .pinit : > RAML, PAGE = 0 .switch : > RAML, PAGE = 0
.stack : > RAMM, PAGE = 1 .ebss : > RAMH, PAGE = 1 .econst : > RAMH, PAGE = 1 .esysmem : > RAMM, PAGE = 1
IQmath : > RAML, PAGE = 0
IQmathTables : > IQTABLES, PAGE = 0, TYPE = NOLOAD IQmathTables2 : > IQTABLES2, PAGE = 0, TYPE = NOLOAD FPUmathTables : > FPUTABLES, PAGE = 0, TYPE = NOLOAD
ZONE7DATA : > ZONE7B, PAGE = 1 ZONE6DATA : > ZONE6B, PAGE = 1
.reset : > RESET, PAGE = 0, TYPE = DSECT
csm_rsvd : > CSM_RSVD PAGE = 0, TYPE = DSECT csmpasswds : > CSM_PWL PAGE = 0, TYPE = DSECT
.adc_cal : load = ADC_CAL, PAGE = 0, TYPE = NOLOAD }
而编写用于flash烧写的F28335.cmd文件时相对来说较复杂些,根据不同的情况需要做一些修改。
1 不需要把部分代码copy到RAM里,一般情况不需要外扩RAM等时直接用TI的F28335.cmd即可。
2 需要把部分代码从flash 复制到RAM里,如延时函数DSP2833x_usDelay.asm等,这时CMD文件需要做相应的修改,具体参考博文:http://blog.sina.com.cn/s/blog_762cf5f80101asmq.html
3 从时间开销方面考虑,需要把整个程序从flash复制到RAM里,这时程序及CMD文件都要做相应的修改,具体参考博文http://blog.sina.com.cn/s/blog_762cf5f80101apfx.html
共分享92篇相关文档