用c语言开发dsp系统的全过程

上传人:第*** 文档编号:35900136 上传时间:2018-03-22 格式:DOC 页数:9 大小:49KB
返回 下载 相关 举报
用c语言开发dsp系统的全过程_第1页
第1页 / 共9页
用c语言开发dsp系统的全过程_第2页
第2页 / 共9页
用c语言开发dsp系统的全过程_第3页
第3页 / 共9页
用c语言开发dsp系统的全过程_第4页
第4页 / 共9页
用c语言开发dsp系统的全过程_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《用c语言开发dsp系统的全过程》由会员分享,可在线阅读,更多相关《用c语言开发dsp系统的全过程(9页珍藏版)》请在金锄头文库上搜索。

1、一个合格的硬件工程师,应该都学,我推荐你先学习 C 语言,因为汇编入手太慢,写程序要以 C 为主,需要高速的或者底层的操作用内嵌汇编的方式。汇编和 c 同样重要,相互配合,缺一不可!汇编的重要性:帮助你从根本上彻底和完全了解芯片的结构和性能,以及工作原理,如何使用。在小的芯片上实现小的系统。系统的调试。尽管你使用了高级语言,在调试中可以帮助你了解 C 代码的性能和特点,甚至找到使用开发平台本身的 BUG。编写时序要求严格的代码,实现一些高级语言不易实现的功能。从目前的技术和应用发展来看,对硬件工程师的要求越来越高。以我的观点,作为单片机和嵌入式系统开发真正的高手,应具备以下几个方面的综合能力:

2、硬件。模拟、数字电路的雄厚基础,了解跟踪现在市场上的各种元器件的应用和发展,能够进行可靠、完善的电路设计以及 PCB 的设计。软件。不仅需要精通汇编语言,也要精通 C 语言,要有好的单片机系统程序设计理念和能力,学校中学的那些分支结构、循环结构等基本原理远远不够!要有基本的数据结构的知识。否则你如何设计实现 USB HOST 读 U 盘的接口?如何实现嵌入式 WEB 系统?以及如何使用真正了解和使用 RTOS?具备计算机网络和数字通信的基础知识,从根本上熟悉和了解各种协议的构造和实现,如:UART、RS232、SPI、I2C、USB、IEEE802、TCP/IP 等。计算机应用的高手。熟练阅读

3、英文资料。热爱和喜欢电子技术,具备刻苦精神、踏踏实实,不弄虚作假,不浮躁。多动手,勤实践。有强烈的专业和钻研精神。最后一条最重要!摘要:目前很多嵌入式系统以 DSP 为核心构建,但是,采用汇编语言开发 DSP 系统存在开发难度大、开发周期长、维护性差等缺点,应用 C 语言开发 DSP 系统是广大嵌入式开发者的迫切要求。有关单片机的 C 语言开发有相当多的资料可以参考,而 DSP 系统的 C 语言开发却很少见。本文以 TI 公司的 DSP 器件 TMS320F24X 系列为例,讲述怎样用 C 语言开发一个完整的 DSP 嵌入式系统。大家在开发嵌入式产品时首先会想到用控制器的汇编语言编写*程序,主

4、要原因是:一、汇编语言生成的程序对应的二进制代码少,程序执行要比高级语言生成的程序快。二、控制器刚问世时,没有相应的高级语言可供使用。三、存储器的价格问题和寻址空间的限制。以上所述问题目前都基本上解决了,在这就不阐述了。实际情况是:在单片机的应用领域,开发者开始使用 C 语言进行开发了。大家发现用高级语言开发嵌入式产品是如此轻松,并且 C 语言程序编译后的二进制代码也非常短小精练。目前使用最多的数字信号处理器(DSP)是美国 TI 公司的 TMS320 家族,而工业控制上用的最多的又是 TMS320F2XX 系列,TI 公司为每一个 DSP 芯片提供了汇编语言和C 语言供开发者选用,本人一直使

5、用 C 语言进行产品开发,而目前很少见到这方面的介绍,所以特撰此文以 TMS320F240 为例,向各位同行推荐用 C 语言开发 DSP 嵌入式系统。1、DSP 的 C 语言的特殊性大家在使用 51 系列 C 语言时已经注意到,控制器的 C 语言和 PC 机上使用的 C 有一个显著的特点:经常要对硬件操作,程序中有大量针对控制器内部资源进行操作的语句。所以,开发者要明白怎样用 C 语言来操纵控制器的内部资源,既怎样用 C 语句操作寄存器和内部存储器等。举个例子,在 51 汇编中我们写 MOV A,#20H,汇编程序能够识别 A 是指累加器,而在51 C 程序中我们写 ACC=32;,编译器能够

6、识别 ACC 是指累加器而不是一般的变量。即每一个寄存器都有一个专有名字供开发者使用,它们定义在一个头文件 reg51.h 中,程序员只需在程序的开始部分用#include“reg51.h”语句将该文件包含进来即可。注意:这些寄存器的名字不能用做变量名。同样,在 TMS320F240 的 C 语言中也有一个头文件 C240.H 定义各个寄存器的名称,这里摘录几条语句进行介绍。比如:#define IMR (PORT)0x0004)#define XINT1_CR (PORT)0x07070)IMR 、XINT1_CR 就对应两个寄存器,实际是寄存器的地址,用高级语言的说法是指针。我们也在程序的

7、开始部分用#include“c240.h”语句将该文件包含进来。这样,在 DSP 的C 语言中使用它们只需在前面加一个星号(*) ,例如,*IMR=0X1010;/* 将 16 进制数 1010H 赋给 IMR 寄存器 */*XINT1_CR=0X0A0B0;/*将 16 进制数 A0B0H 赋给 XINT1_CR 寄存器 */开发者最好将 c240.h 这个文件打印出来,弄清楚各个寄存器的定义名称。至于不涉及硬件的语法和 ANSI 语法一样,需要注意的是,有些 ANSI 标准中的函数在 DSP 的编译器中不提供,读者可以参考 DSP 编译器的 C 语言手册。搞清楚了这些特殊性,由汇编语言转到

8、 C 语言开发是很容易的事,当然,没有汇编语言编程基础的人同样可以用 C 语言开发 DSP 应用系统。有关嵌入式系统的 C 语言编程可参考单片机与嵌入式系统应用2001 年 1 到 6期上马忠梅的“嵌入式 C 编程技术” ,本文不做讨论。下面只针对以 TMS320F240 芯片为处理器的嵌入式 C 语言编程进行阐述,希望能够指导读者进行具体操作。2、TMS320F240 芯片的 C 语言开发过程简单地说,整个过程包括以下五个步骤:编辑 C 语言源程序 编译源程序(注意编译参数) 链接目标文件(注意用 CMD 文件) 在线仿真 固化程序 下面分别进行阐述。一 源程序的编辑可以用任何一个编辑器书写

9、源程序,如 EDIT、NOTEPAD 等,最后以.C 为后缀存盘。源代码可以写在一个 C 文件中,也可写在多个 C 文件中,有些预定义变量和函数原型声明可以集中放在一个头文件中。注意事项:不要忘记在 C 程序的前面用 #include “c240.h”将寄存器定义文件包括进来。二 源程序的编译源程序编辑好后可以用 DSPCL 编译程序进行编译,生成 OBJ 文件。使用格式: DSPCL 源文件名 参数例如:DSPCL EX1.C V2XX GK MN常用参数的意义:V2XX:表示 C 编译器选择处理器 2XX 系列GK:保留编译生成的汇编文件(.ASM 文件)MN:进行正常优化其他参数请参考

10、DSP 编译器的手册。如果有多个源文件,分别编译。每一个源文件经编译后产生一个 OBJ 文件和 ASM 文件。三 目标文件的链接(一) TI 公司的 COFF 文件格式TI 公司新的汇编器和编译器创建的目标文件采用 COFF 的目标文件格式(Common Object File Format)采用 COFF 格式有利于模块化编程,为管理代码段和目标系统存储器提供更加强有力和灵活的方法。基于 COFF 格式编写汇编程序或 C 语言程序时,不必为程序代码和变量指定目标地址,为程序编写和程序移植提供了极大的方便。COFF 格式的基本思想是:鼓励程序员在用汇编语言或 C 语言编程时运用代码块和数据块的

11、概念。这种块称为 SECTION,是目标文件中的最小单位。所有的块分为两大类:已初始化块和未初始化块,已初始化块包含程序代码和数据,未初始化块是为未初始化的数据在存储器中的保留块。C 编译器对 C 程序编译后产生已初始化块和未初始化块,已初始化块如 .text 块、 .const 块、.cinit 块 ;未初始化块如.bss 块。举个例子,当程序员用 C 语句 float data100;定义一个数组时不需要指定这 100 个数组元素的具体位置,编译器会在数据区预留所需空间,到链接时链接器会具体定位。(二) 链接器对块的处理链接器对块的处理有两个功能:其一,将 COFF 目标文件中的块用来建立

12、程序块和数据块,并将这些块组合成可以被 DSP 芯片执行的 COFF 输出模块;其二,链接器为输出块指定存储位置。链接器提供两个命令实现上述功能:MEMORY 和 SECTIONS。MEMORY 命令定义目标系统的存储器,程序员可以定义每一块存储器并指定起始地址和长度;SECTIONS 命令用来定义输入块的组合和输出块在存储器中的存放位置。若不用 MEMORY 和SECTIONS 命令,链接器采用缺省的分配算法;推荐使用这两个命令,但要注意这两个命令在 CMD 文件(链接器命令文件)中使用。下面分析一个 TMS320F240 芯片的典型 CMD 文件。 (假设文件名 EX1.CMD)1、 CM

13、D 文件的构成及其详细解释BOOT.OBJ /* F240 的中断矢量表,参见后面的说明 */EX1.OBJ /* 源程序编译后对应的目标文件 */* 若程序有多个目标文件,一块写在这里 */-STACK 0X400 /* 设定系统堆栈 */-C /* ROM 初始化 */-O EX1.OUT /* 输出的文件名 */-M EX1.MAP /* 输出映像文件名 */-L RTS2XX.LIB /* 链入 RTS2XX.LIB 库 */MEMORY /*MEMORY 命令规定系统的存储器配置 */PAGE 0:ROM0: origin=0000h,length=003fh /* FLASH RO

14、M */PAGE 0:ROM1: origin=0040h,length=0200h /*FLASH ROM */PAGE 0:ROM2: origin=0240h,length=3000h /* FLASH ROM */PAGE 1:RAM_B2:origin=0060h,length=0020h /* 内部 RAM B2 */PAGE 1:RAM_B1:origin=0300h,length=0100h /* 内部 RAM B1 */PAGE 1:RAM_B0:origin=0100h,length=0100h /* 内部 RAM B0 */PAGE 1:RAM_EX:origin=0d0

15、00h,length=2800h /* 外部扩展 RAM */SECTIONS /* SECTIONS 命令规定了程序中块的具体分配方法 */.vectors:load=ROM0 /* 规定矢量表的存放位置 */.cinit: load=ROM1 /* C 初始化表的存放位置 */.text: load=ROM2 /* 系统程序的存放位置 */.bss load=RAM_B0 /*未初始化数据的存放位置 */.const load=RAM_B1 /* 已初始化数据的存放位置 */2、TMS320F240 链接时所需的中断矢量表文件TMS320F240 的目标文件在链接时要用到中断矢量表,中断矢

16、量表用汇编语言编写,和具体的 DSP 芯片有关,假设 TMS320F240 的中断矢量表对应的汇编程序为 BOOT.ASM,汇编后的文件名为 BOOT.OBJ。下面是一个典型的矢量表文件(假设程序名为 BOOT.ASM) 。.port /* 定义中断函数的名字 */.globl _c_int0 /* 中断 0 对应的函数名 */.globl _c_int1 /* 中断 1 对应的函数名 ,以下语句的意义相同*/.globl _c_int2 /* 可以将中断函数名看作中断入口地址 */.globl _c_int3 /* 矢量表的存放不需程序员干预 */.globl _c_int4.globl _c_int5.globl _c_int6.globl _c_int7.globl _c_int8.sect “.vectors”/*用.sect 命令自定义一个块,用于存放中断矢量表 */RSVECT B _c_int0 /* 中断 0 发生后,程序的跳转目的地址 */INT1 B _c_int1 /* 中断 1 发生后,则跳到 c_int1()函数处 */INT2 B

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号