摘要 目前很多嵌入式系统以DSP为核心构建,但是CONTROL ENGINEERING China版权所有,采用汇编语言开发DSP系统存在开发难度大、开发周期长、维护性差等缺点,应用C语言开发DSP系统是广大嵌入式开发者的迫切要求。有关单片机的C语言开发有相当多的资料可以参考,而DSP系统的C语言开发却很少见。本文以TI公司的DSP器件TMS320F24X系列为例,讲述怎样用C语言开发一个完整的DSP嵌入式系统。
关键词:嵌入式系统; DSP系统; C语言开发; TMS320F24X系列
引言
大家在开发嵌入式产品时首先会想到用控制器的汇编语言编写监控程序,主要原因是:①汇编语言生成的程序对应的二进制代码少,程序执行要比高级语言生成的程序快;②控制器刚问世时,没有相应的高级语言可供使用;③存储器的价格问题和寻址空间的限制。
以上所述问题目前已基本解决,在这就不阐述了。实际情况是:在单片机的应用领域控制工程网版权所有,开发者已开始使用C语言进行开发。大家发现用高级语言开发嵌入式产品是如此轻松,并且C语言程序编译后的二进制代码也非常短小精练。
目前使用最多的数字信号处理器(DSP)是美国TI公司的TMS32
1 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 XINTI_CR((PORT) 0x07070)
IMR、XINT1_CR就对应两个寄存器,实际是寄存器的地址,用高级语言的说法是指针。我们也在程序的开始部分用#include“c240.h”语句将该文件包含进来。这样,在DSP的C语言中使用它们只需在前面加一个星号(*),例如,
*IMR=0X1010;/*将十六进制数1010H赋给IMR寄存器*/
*XINT1_CR=0X0A0B0;/*将十六进制数A0B0H赋给XINT1_CR寄存器*/
开发者最好将c240.h这个文件打印出来,弄清楚各个寄存器的定义名称。至于不涉及硬件的语法和ANSI语法一样。需要注意的是,有些ANSI标准中的函数在DSP的编译器中不提供,读者可以参考DSP编译器的C语言手册。搞清楚了这些特殊性,由汇编语言转到C语言开发是很容易的事。当然,没有汇编语言编程基础的人同样可以用C语言开发DSP应用系统。
有关嵌入式系统的C语言编程可参考《单片机与嵌入式系统应用》2001年1~6期《嵌入式C编程技术》,本文不作讨论。下面只针对以TMS320F240芯片为处理器的嵌入式C语言编程进行阐述控制工程网版权所有,希望能够指导读者进行具体操作。
2 TMS320F240芯片的C语言开发过程
简单地说,整个过程包括以下5个步骤:
①编辑C语言源程序;
②编译源程序(注意编译参数);
③链接目标文件(注意用CMD文件);
④在线仿真;
⑤固化程序。
2.1源程序的编辑
可以用任何一个编辑器书写源程序,如EDIT。NOTEPAD等,最后以.C为后缀存盘。源代码可以写在一个C文件中,也可写在多个C文件中;有些预定义变量和函数原型声明可以集中放在一个头文件中。
注意事项:不要忘记在C程序的前面用 #in-clude “c240.h”将寄存器定义文件包括进来。
2.2源程序的编译
源程序编辑好后可以用DSPCL编译程序进行编译,生成OBJ文件。
使用格式:DSPCL源文件名 参数
例如: DSPCL EX1.C-V2XX-GK-MN
常用参数的意义:
V2XX——表示C编译器选择处理器2XX系列;
GK——保留编译生成的汇编文件