首先我们要知道什么是CMD文件,它是用来干什么的,然后再来看看它有些什么,怎么去编写一个CMD文件。
CMD即command命令,命令文件指定存储区域的分配。由于 DSP281X 系列的独特性(片内存在 SRAM 和 FLASH)所以必须创建一个用户链接命令文件,以便在运行程序时,每个块都能对号入座。2812中CMD 采用的是分页制,其中PAGE0用于存放程序空间, 而PAGE1用于存放数据空间。我们结合SRAM.cmd(附件1)文件来介绍下CMD文件的编写。
CMD的伪指令:MEMORY 和 SECTIONS 是命令文件中最常用的两伪指令。
MEMORY伪指令用来表示实际存在目标系统中的可以使用的存储器范围,在这里每个存储器都有自己的名字,起始地址和长度。 SECTIONS伪指令是用来描述输入端是如何组合到输出端内的。CMD 文件里有两个基本的段:初始化段和非初始化段。
初始化段包含代码和常数等必须在 DSP 上电之后有效的数。故初始化块必须保存在如片内 FLASH 等非遗失性存储器中。在SRAM.cmd文件中已初始化的段:.text,.cinit,.const,.econst,..pinit 和.switch..
每个小段里面存储的量说明如下:
.text:所有可以执行的代码和常量
.cinit:全局变量和静态变量的 C 初始化记录
.const:包含字符串常量和初始化的全局变量和静态变量(由 const)的初始化和说明
.econst:包含字符串常量和初始化的全局变量和静态变量(由 far const)的初始化和说明
.pinit:全局构造器( C++)程序列表
.switch:包含转换语气声明的列表
非初始化段中含有在程序运行过程中才像变量内写数据进去,所以非初始化段必须链接到易失性存储器中如 RAM。非初始化的段:.bss,.ebss,.stack,.sysmem,和 esysmem.(更好的理解就是,这些段就是存储空间而已)
每个小段里面存储的量说明如下:
.bss: 为全局变量和局部变量保留的空间,在程序上电时,cinit 空间中的数据复制出来并存储在.bss 空间中。
.ebss:为使用大寄存器模式时的全局变量和静态变量预留的空间,在程序上电时, cinit 空间中的数据复制出来并存储在.ebss 中。
.stack:为系统堆栈保留的空间,主要用于和函数传递变量或为局部变量分配空间。
.sysmem:为动态存储分配保留的空间。如果有宏函数,此空间被宏函数占用,如果没有的话,此空间保留为0
.esysmem:为动态存储分配保留的空间。如果有 far 函数,此空间被相应的占用,如果没有的化,此空间保留为0
F28x系列DS的CMD文件分析:根据 F28X 系列 DSP 存储器映射图可以知道:数据空间起始地址是 0x0000,程序空间的起始地址是 0x3D8000,在程序空间中, M0SRAM 和 M1SRAM 各有 1K*16 位所以:
RAMM0 起始地址: 0x0000 长度: 0x0400(2 的 10 次为 1K)RAMM1 起始地址: 0x0400(0x0000+0x0400) 长度: 0x0800(2 的 10 次方为 1K)
同理从 0x000800 到 0x000D00 这段地址里面装的是 2K*16 位的外围结构,映射表中很清楚的可以看出从 0x002000 到 0x006000 地址被保留,所以另一部分的外设地址定义是从 0x00700 开始。掌握一个机构的
起始来源,那么无论是 SRAM 还是 FLASH 里面的 CMD 文件我们参照存储器映射图我们都能看懂。
对于外扩256K的SRAM 来说,对照DSPF2812 的存储器映射来看,我们可以定义外扩存储器的地址在0X100000,那么链接的时候直接就链接到外部 SRAM 中,至于长度,设置小于 256K 或者等于 256K 就好了,一般设置为 0x011000.
对于程序在FLASH中运行时,需要注意的:1.关于初始化Flash的代码必须在RAM中运行;2.DSP在150M时钟频率下,FLASH中只能提供大约120M的时钟频率,所以有时候我们希望在RAM中运行时间敏感或计算量很大的子程序(比如 AD 采样)。由于我们所有代码都放在FLASH中,基于上述两种情况,这就必须在上电后将 FLASH 中的关于初始化Flash的程序以及时间敏感程序复制到RAM中运行,这时在.CMD 文件就必须划分一段用来设置 RAM 的载入和运行地址。
附件1:
1 MEMORY 2 { 3 PAGE 0 : 4 PRAMH0 : origin = 0x3f8000, length = 0x001000 5 6 PAGE 1 : 7 /* SARAM */ 8 RAMM0 : origin = 0x000000, length = 0x000400 9 RAMM1 : origin = 0x000400, length = 0x000400 10 11 /* Peripheral Frame 0: */ 12 DEV_EMU : origin = 0x000880, length = 0x000180 13 FLASH_REGS : origin = 0x000A80, length = 0x000060 14 CSM : origin = 0x000AE0, length = 0x000010 15 XINTF : origin = 0x000B20, length = 0x000020 16 CPU_TIMER0 : origin = 0x000C00, length = 0x000008 17 CPU_TIMER1 : origin = 0x000C08, length = 0x000008 18 CPU_TIMER2 : origin = 0x000C10, length = 0x000008 19 PIE_CTRL : origin = 0x000CE0, length = 0x000020 20 PIE_VECT : origin = 0x000D00, length = 0x000100 21 22 /* Peripheral Frame 1: */ 23 ECAN_A : origin = 0x006000, length = 0x000100 24 ECAN_AMBOX : origin = 0x006100, length = 0x000100 25 26 /* Peripheral Frame 2: */ 27 SYSTEM : origin = 0x007010, length = 0x000020 28 SPI_A : origin = 0x007040, length = 0x000010 29 SCI_A : origin = 0x007050, length = 0x000010 30 XINTRUPT : origin = 0x007070, length = 0x000010 31 GPIOMUX : origin = 0x0070C0, length = 0x000020 32 GPIODAT : origin = 0x0070E0, length = 0x000020 33 ADC : origin = 0x007100, length = 0x000020 34 EV_A : origin = 0x007400, length = 0x000040 35 EV_B : origin = 0x007500, length = 0x000040 36 SPI_B : origin = 0x007740, length = 0x000010 37 SCI_B : origin = 0x007750, length = 0x000010 38 MCBSP_A : origin = 0x007800, length = 0x000040 39 40 /* CSM Password Locations */ 41 CSM_PWL : origin = 0x3F7FF8, length = 0x000008 42 43 /* SARAM */ 44 DRAMH0 : origin = 0x3f9000, length = 0x001000 45 } 46 47 48 SECTIONS 49 { 50 /* Allocate program areas: */ 51 .reset : > PRAMH0, PAGE = 0 52 .text : > PRAMH0, PAGE = 0 53 .cinit : > PRAMH0, PAGE = 0 54 55 /* Allocate data areas: */ 56 .stack : > RAMM1, PAGE = 1 57 .bss : > DRAMH0, PAGE = 1 58 .ebss : > DRAMH0, PAGE = 1 59 .const : > DRAMH0, PAGE = 1 60 .econst : > DRAMH0, PAGE = 1 61 .sysmem : > DRAMH0, PAGE = 1 62 63 /* Allocate Peripheral Frame 0 Register Structures: */ 64 DevEmuRegsFile : > DEV_EMU, PAGE = 1 65 FlashRegsFile : > FLASH_REGS, PAGE = 1 66 CsmRegsFile : > CSM, PAGE = 1 67 XintfRegsFile : > XINTF, PAGE = 1 68 CpuTimer0RegsFile : > CPU_TIMER0, PAGE = 1 69 CpuTimer1RegsFile : > CPU_TIMER1, PAGE = 1 70 CpuTimer2RegsFile : > CPU_TIMER2, PAGE = 1 71 PieCtrlRegsFile : > PIE_CTRL, PAGE = 1 72 PieVectTable : > PIE_VECT, PAGE = 1 73 74 /* Allocate Peripheral Frame 2 Register Structures: */ 75 ECanaRegsFile : > ECAN_A, PAGE = 1 76 ECanaMboxesFile : > ECAN_AMBOX PAGE = 1 77 78 /* Allocate Peripheral Frame 1 Register Structures: */ 79 SysCtrlRegsFile : > SYSTEM, PAGE = 1 80 SpiaRegsFile : > SPI_A, PAGE = 1 81 SciaRegsFile : > SCI_A, PAGE = 1 82 XIntruptRegsFile : > XINTRUPT, PAGE = 1 83 GpioMuxRegsFile : > GPIOMUX, PAGE = 1 84 GpioDataRegsFile : > GPIODAT PAGE = 1 85 AdcRegsFile : > ADC, PAGE = 1 86 EvaRegsFile : > EV_A, PAGE = 1 87 EvbRegsFile : > EV_B, PAGE = 1 88 ScibRegsFile : > SCI_B, PAGE = 1 89 McbspaRegsFile : > MCBSP_A, PAGE = 1 90 91 /* CSM Password Locations */ 92 CsmPwlFile : > CSM_PWL, PAGE = 1 93 94 }
附件2: