TMS320F28335 DSP— CMD 解读 在 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("CpuTimer0RegsFile") #else #pragma DATA_SECTION(CpuTimer0Regs,"CpuTimer0RegsFile"); #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 关键字的解读可参考 : 在 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 文件需要做相应的修改,具体参考博文: 3、 从时间开销方面考虑,需要把整个程序从 flash 复制到 RAM 里,这时程序及 CMD 文件都要做相应的修改,具体参考博文 ( 翻译自 TI 应用手册 SPRAAU8) 摘要 这个应用报告和相关的代码提供了一种把编译后的程序段从 TMS320F28xxx 的flash 复制到 ram 的功能,这样可以提高代码的运行速度这个解决方案在直接启动之后, 进入 c_int00 —— C 语言代码运行之前实现此功能 本应用报告中所讨论的项目内容和源代码可以从以下网址下载 : 1.引言: 在许多应用中,代码的执行速度是至关重要的例如在医疗,监控,电机控制等等一些对时间有严格要求的终端设备 许多应用使用 TMS320F28xxx DSCs 是因为它的内置 flash 储存器内置 flash 是 TMS320F28xxx 的一个优势,因为它使得设计者不需要外接 flash 来储存代码。