DSP的C语言学习 | |
CMD文件的作用: 在DSP里,程序执行过程中也有好多地方需要跳转,所以需要跳转的目标地址。如果你在编程序时知道你所要跳转的地址,那就更好的,但实际上,这是很不好控制的。所以就产生了.CMD。它有一个最大的好处,可以把每个段分配地址,所以比如你想从一个段跳到另一个段的时候,就很方便的知道这个段的起始地址。
CMD 它是用来分配rom和ram空间用的,告诉链接程序怎样计算地址和分配空间.所以不同的芯片就有不同大小的rom和ram.放用户程序的地方也不尽相同.所以要根据你的芯片进行修改.cmd文件分两部分.MEMORY和SECTIONS. MEMORY { PAGE 0 .......... PAGE 1......... } SECTIONS {SECTIONS { .vectors ................. .reset ................. ................ } MEMORY是用来指定芯片的rom和ram的大小和划分出几个区间. PAGE 0 对应rom;PAGE 1对应ram PAGE 里包含的区间名字与其后面的参数反映了该区间的起始地址和长度. 如: PAGE 0 : VECS(区间名字): origin(起始地址) = 0h , length (长度)=040h /*VECTORS*/ SECTIONS:(在程序里添加下面的段名如.vectors.用来指定该段名以下,另一个段名以上的程序(属于PAGE0)或数据(属于PAGE1)放到“>”符号后的空间名字所在的地方。 如引用字段名“.vectors ”的程序或数据将被放到VECS ,VECS是PAGE0即是ROM空间 00H至40H的地方 SECTIONS { .vectors : { } > VECS PAGE 0 /* Interrupt vector table */ .reset : { } > VECS PAGE 0 /* Reset code */ ............ } .vectors,.reset都是段名。 加不加“.”随你便,即.vectors表示名为 “.vectors”的段。 {}表示段的全部,{}> VECS PAGE 0表示将段的全部放入名为 VECS PAGE 0的内存区。 example: /****************************************************************************/ /******** Specify the memory configuration **********************************/ /****************************************************************************/ MEMORY { PAGE 0: VECS: origin = 00000h, length = 00040h LOW: origin = 00040h, length = 03FC0h SARAM: origin = 04000h, length = 00800h B0: origin = 0FF00h, length = 00100h PAGE 1: B0: origin = 00200h, length = 00100h B1: origin = 00300h, length = 00100h B2: origin = 00060h, length = 00020h SARAM: origin = 08000h, length = 00800h } /*--------------------------------------------------------------------------*/ /* SECTIONS ALLOCATION */ /*--------------------------------------------------------------------------*/ SECTIONS { .text : { } > LOW PAGE 0 .cinit : { } > LOW PAGE 0 .switch : { } > LOW PAGE 0 .const : { } > SARAM PAGE 1 .data : { } > SARAM PAGE 1 .bss : { } > SARAM PAGE 1 .stack : { } > SARAM PAGE 1 .sysmem : { } > SARAM PAGE 1 } 1,系统定义: .cinit 存放C程序中的变量初值和常量; .const 存放C程序中的字符常量、浮点常量和用const声明的常量; .switch 存放C程序中switch语句的跳针表; .text 存放C程序的代码; .bss 为C程序中的全局和静态变量保留存储空间; .far 为C程序中用far声明的全局和静态变量保留空间; .stack 为C程序系统堆栈保留存储空间,用于保存返回地址、函数间的参数传递、存储局部变量和保存中间结果; .sysmem 用于C程序中malloc、calloc和realloc函数动态分配存储空间 2,用户定义: #pragma CODE_SECTION (symbol, "section name"; #pragma DATA_SECTION (symbol, "section name" DSP的C语言的特殊性 大家在使用51系列C语言时已经注意到,控制器的C语言和PC机上使用的C有一个显著的特点:经常要对硬件操作,程序中有大量针对控制器内部资源进行操作的语句。所以,开发者要明白怎样用C语言来操纵控制器的内部资源,既怎样用C语句操作寄存器和内部存储器等。 举个例子,在51汇编中我们写 MOV A,#20H,汇编程序能够识别A是指累加器,而在51 C程序中我们写 ACC=32;,编译器能够识别ACC是指累加器而不是一般的变量。即每一个寄存器都有一个专有名字供开发者使用,它们定义在一个头文件reg51.h 中,程序员只需在程序的开始部分用#include“reg51.h”语句将该文件包含进来即可。注意:这些寄存器的名字不能用做变量名。 同样,在TMS320F240的C语言中也有一个头文件C240.H定义各个寄存器的名称,这里摘录几条语句进行介绍。 比如:#define IMR ((PORT)0x0004) #define XINT1_CR ((PORT)0x07070) IMR 、XINT1_CR就对应两个寄存器,实际是寄存器的地址,用高级语言的说法是指针。我们也在程序的开始部分用#include“c240.h”语句将该文件包含进来。这样,在DSP的C语言中使用它们只需在前面加一个星号(*),例如, *IMR=0X1010;/* 将16进制数1010H赋给IMR寄存器 */ *XINT1_CR=0X0A0B0;/*将16进制数A0B0H赋给XINT1_CR寄存器 */ 最好将c240.h这个文件打印出来,弄清楚各个寄存器的定义名称。 TMS320F240芯片的C语言开发过程 简单地说,整个过程包括以下五个步骤: 1、编辑C语言源程序 2、编译源程序(注意编译参数) 3、链接目标文件(注意用CMD文件) 4、在线仿真 5、固化程序 |