香油是什么油| 4岁打什么疫苗| 辟邪剑法为什么要自宫| 三焦不通吃什么中成药| 康复治疗学学什么| 心脏不好有什么症状| 怀孕养猫对胎儿有什么影响| 荷叶配什么减肥效果好| 颠覆三观是什么意思| 宫内妊娠是什么意思| 什么是宦官| 斗志昂扬是什么意思| 什么是低密度脂蛋白| smz是什么药| 螃蟹跟什么不能一起吃| 情花是什么花| 什么火热| 一日清闲一日仙是什么生肖| zoom 是什么意思| 什么是割包皮| 麦冬不能和什么一起吃| 心急吃不了热豆腐什么意思| 巨蟹是什么象星座| 组织委员的职责是什么| 腿困是什么原因引起的| 下颚长痘痘是什么原因| 长期喝豆浆有什么好处和坏处| 葛根长什么样子图片| 什么是氧化剂| 金字旁的字和什么有关| 27虚岁属什么生肖| 仰面朝天是什么生肖| 分开后我会笑着说是什么歌| 春秋鼎盛是什么意思| 马达是什么| 来月经喝酒有什么影响| 推迟月经吃什么药| 央企与国企有什么区别| 全麦是什么| 四物汤是什么| 双侧附睾头囊肿是什么意思| 子宫内膜脱落是什么原因| 病原体是什么| 宝宝吃益生菌有什么好处和坏处| olay是什么品牌| 女人吃什么疏肝理气| 女人脾虚吃什么药最好| 熊猫血有什么好处| 做梦梦到对象出轨是什么意思| 胃胀气吃什么药| 阿达子是什么| 镜面是什么意思| 为什么会长痤疮| 舌尖有点麻是什么原因| 奚字五行属什么| 睡眠障碍应该挂什么科室| 骨密度高是什么意思| 什么叫尊重| 多维元素片有什么作用| 割包皮应该挂什么科| 吃什么可以长头发| 肾结石可以吃什么水果| 槊是什么兵器| 什么人容易得血栓| ccu是什么病房| 做放疗的人吃什么好| 爸爸生日送什么礼物| 孕妇缺维生素D对胎儿有什么影响| 白化病是一种什么病| 9.10是什么星座| 中国女人裹脚是从什么时候开始| 胶原蛋白有什么作用| 鼻炎不能吃什么食物| 周星驰是什么星座| 此言差矣是什么意思| 9月13日是什么纪念日| 不孕为什么要查胰岛素| goldlion是什么牌子| 什么全什么美| 血红蛋白偏高是什么原因| 膝盖痛吃什么药好| 党参和丹参有什么区别| 缺钾有什么症状和危害| 澈字五行属什么| 三花鱼是什么鱼| 医者仁心什么意思| 飞蚊症用什么药物治疗最好| 吃刺猬有什么好处| 一什么荷叶| 胜肽的主要功能是什么| 婴儿的腿为什么是弯弯的| 79年属羊的是什么命| 阴虚便秘吃什么中成药| 森林里有什么| grp是什么意思| 骨化是什么意思| 边界感是什么意思| 体悟是什么意思| 白血球低是什么原因| 熟石灰是什么| 糖抗原125高什么意思| 小翅膀车标是什么车| 毛泽东什么时候逝世| 骨髓移植是什么意思| 257什么意思| 期许是什么意思| 化生是什么意思| 甲钴胺有什么作用| 三不伤害是指什么| 息肉样病变是什么意思| 什么夫妻百事哀| 垂直同步有什么用| wt什么意思| 看甲沟炎挂什么科| 例假提前来是什么原因| 梦见喝水是什么意思| 性格开朗是什么意思| 梦见自己孩子死了是什么意思| 苯磺酸氨氯地平片什么时候吃最好| 常吃阿司匹林有什么副作用| 细菌性痢疾症状是什么| 台湾什么时候回归的| 乳腺增生的前兆是什么| 尿是绿色的是什么原因| 蜈蚣最怕什么东西| 什么是杀青| 生米煮成熟饭是什么意思| 吃饭掉筷子有什么预兆| 偏头痛是什么原因| 高血脂吃什么食物最好| 丘疹性荨麻疹吃什么药| 总想睡觉是什么原因| 什么是阿尔兹海默症| 什么麻| 发低烧吃什么药| 嫐什么意思| 异卵双胞胎是什么意思| 三叉神经痛挂什么科就诊| 地壳是什么| 无花果为什么叫无花果| 霉菌性阴道炎用什么药好| 数不胜数是什么意思| 母仪天下是什么意思| 火眼金睛是什么生肖| ig是什么意思| 今年属于什么年| 宝宝头大是什么原因| 什么地问| 党的执政理念是什么| 长期便秘吃什么药| 什么是危险期| 梦见自己化妆是什么意思| 为什么会有颈纹| 1月25号什么星座| 幽门螺杆菌吃什么药最好| 扁的桃子叫什么名字| 78年属马的是什么命| 什么人不能吃茄子| 脖子上长癣是什么原因| 甲状腺素低吃什么能补| 半夜饿是什么原因| 手脱皮用什么药| 12月29号是什么星座| 天条是什么意思| 糖尿病是什么原因引起的| 病毒性肠炎吃什么药| 内分泌失调吃什么食物好| edm是什么意思| vte是什么意思| 淀粉酶是查什么的| 焗是什么意思| 脾肾亏虚的症状是什么| 总是困是什么原因| 睡久了头疼是什么原因| 大力丸是什么药| 小孩肺炎吃什么药| 经产妇是什么意思| 虎的贵人是什么生肖| ct是什么| 湿气重不能吃什么食物| 宝宝积食发烧吃什么药| 狗肉不能和什么一起吃| 尿急尿痛吃什么药| 经常打飞机有什么危害| visa是什么| 高血压适合吃什么食物| 空调管滴水是什么原因| 2010属什么生肖| 李小龙属什么生肖| 眼睛总是干涩是什么原因| cock什么意思| 月经期间能吃什么水果| 人中附近长痘痘什么原因| 透析是什么| 干白是什么酒| 来月经前有褐色分泌物是什么原因| 平步青云什么意思| 狗狗吃南瓜有什么好处| 糖尿病能吃什么主食| 什么是夫妻共同财产| diqua是什么牌子| 什么力竭| 月经期间吃什么好| 突然长胖是什么原因造成的| 检查肚子挂什么科| 干咳嗽喉咙痒是什么原因| 脾肾阳虚吃什么药最好| 急性荨麻疹不能吃什么食物| 一个至一个秦是什么字| 7月18日什么星座| 躯体症状是什么| 雌激素是什么| ifashion是什么意思| 寄居蟹用什么水养| 尿红细胞高是什么原因| pd-l1是什么| 沉香茶属于什么茶| 外阴瘙痒用什么药| 黄绿色是什么颜色| 蓝莓有什么好处| 草木灰是什么| 什么是低碳饮食| 猴子偷桃是什么意思| 北京有什么好吃的| 二椅子什么意思| 高血压不能吃什么食物| sm什么意思| 3月1号是什么星座| 上朝是什么意思| 癣用什么药膏| 率的部首是什么| 喝什么茶可以减肥| 素描是什么意思| 嘴唇周围长痘痘是什么原因导致| 三点水加尺念什么| 肺气肿用什么药| 梦到下雨是什么意思| 吃什么精力旺盛有精神| 外阴长什么样| 舌尖有裂纹是什么原因| mansory是什么车| 孕期脸上长痘痘是什么原因| 十玉九裂是什么意思| 晚上10点属于什么时辰| 10个油是什么意思| 补充公积金是什么意思| 舌头上有溃疡是什么原因| 玛瑙对人体有什么好处| 小腿麻木是什么原因引起的| 唵是什么意思| 举足轻重什么意思| 什么是手足口病| 包皮溃烂用什么药| 陶渊明是什么先生| 去痘印用什么药膏| 血小板下降是什么原因| 坐月子能吃什么菜| 女人代谢慢吃什么效果最快| 开救护车需要什么驾照| 红配什么颜色最好看| 熬夜眼睛红血丝用什么眼药水| 什么一惊| 消肿吃什么药| 卑微是什么意思| 百度

如何用C语言开发DSP嵌入式系统

嵌入式系统 时间:2025-08-05来源:网络
百度 在消费者权益保护工作中,消费者是关键,如何才能提高消费者辨假识假等自我保护等能力?李军表示,一方面,工商部门要加强对大数据的深度利用,推进与消协组织、有关部门及大型企业、主要网络交易平台的数据共享和整合,深入研究分析,形成有指导作用的消费维权分析报告,及时向社会公布,让广大消费者周知。

  引言

  大家在开发嵌入式产品时首先会想到用控制器的汇编语言编写监控程序,主要原因是:①汇编语言生成的程序对应的二进制代码少,程序执行要比高级语言生成的程序快;②控制器刚问世时,没有相应的高级语言可供使用;③存储器的价格问题和寻址空间的限制。

  以上所述问题目前已基本解决,在这就不阐述了。实际情况是:在单片机的应用领域,开发者已开始使用C语言进行开发。大家发现用高级语言开发嵌入式产品是如此轻松,并且C语言程序编译后的二进制代码也非常短小精练。

  目前使用最多的数字信号处理器(DSP)是美国TI公司的TMS320家族,而工业控制上用得最多的又是TMS320F2XX系列。TI公司为每一个DSP芯片提供了汇编语言和C语言供开发者选用。本人一直使用C语言进行产品开发,而目前很少见到这方面的介绍、所以特撰此文,以TMS320F240为例,向各位同行推荐用C语言开发DSP嵌入式系统。

  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——保留编译生成的汇编文件(.ASM文件);

  MN——进行正常优化。

  其它参数请参考DSP编译器的手册。如果有多个源文件分别编译,每一个源文件经编译后产生一个OBJ文件和ASM文件。

  2.3 目标文件的链接

  2.3.1 TI公司的COFF文件格式

  TI公司新的汇编器和编译器创建的目标文件采用COFF(Common Object File Format)的目标文件格式。采用COFF格式有利于模块化编程,为管理代码段和目标系统存储器提供更加有力和灵活的方法。基于COFF格式编写汇编程序或C语言程序时,不必为程序代码和变量指定目标地址;为程序编写和程序移植提供了极大的方便。

  COFF格式的基本思想是:鼓励程序员在用汇编语言或C语言编程时运用代码块和数据块的概念。这种块称为SECTION,是目标文件中的最小单位。

  所有的块分为两大类:已初始化块和未初始化块。已初始化块包含程序代码和数据,未初始化块是为未初始化的数据在存储器中的保留块。C编译器对C程序编译后产生已初始化块和未初始化块,已初始化块如.text块、.const块、.cinit块;未初始化块如.bss块。

  举个例子,当程序员用C语句float data[100];定义一个数组时,不需要指定这100个数组元素的具体位置,编译器会在数据区预留所需空间。到链接时链接器会具体定位。

  2.3.2 链接器对块的处理

  链接器对块的处理有两个功能:其一,将COFF目标文件中的块用来建立程序块和数据块,并将这些块组合成可以被DSP芯片执行的COFF输出模块;其二,链接器为输出块指定存储位置。

  链接器提供两个命令实现上述功能:MEMORY和SECTIONS。MEMORY命令定义目标系统的存储器,程序员可以定义每一块存储器并指定起始地址和长度;SECTIONS命令用来定义输入块的组合和输出块在存储器中的存放位置。若不用MEMORY和SECTIONS命令,链接器采用缺省的分配算法。推荐使用这两个命令,但要注意这两个命令在CMD文件(链接器命令文件)中使用。

  下面分析一个TMS320F240芯片的典型CMD文件。(假设文件名 EX1.CMD。)

  (1)CMD文件的构成及其详细解释

BOOT.OBJ /*F240的中断矢量表,参见后面的说明*/
EX1.OBJ /*源程序编译后对应的目标文件*/
/*若程序有多个目标文件,一块写在这里*/
-STACK 0X400    /*设定系统堆栈*/
-C        /*ROM初始化*/
-O EX1.OUT   /*输出的文件名*/
-M EX1.MAP   /*输出映像文件名*/
-L RTS2XX.LIB  /*涟接RTS2XX.LIB库*/
MEMORY /*MEMORY命令规定系统的存储器配置*/

PAGEO:ROM0:origin=0000h,length=003fh
/*FLASH ROM*/
PAGE0:ROM1:origin=0040h,length=0200h
/*FLASH ROM*/
PAGEO:ROM2:origin=0240h,length=3000h
/*FLASH ROM*/
PAGE1:RAM_B2:origin=0060h,length=0020h
/*内部RAMB2*/
PAGE1:RAM_B1:origin=0300h,length=0100h
/*内部RAM B1*/
PAGE1:RAM_B0:origin=0100h,length=0100h
/*内部RAM B0*/
PAGE1:RAM_EX:origin=0d000h,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的目标文件在链接时要用到中断矢量表。中断矢量表用汇编语言编写,和具体的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 _c_int2 /*意义同上,下同*/
INT3 B _c_int3
INT4 B _c_int4
INT5 B _c_int5
INT6 B _c_int6

  用汇编器汇编该程序,命令形式:DSPABOOT.ASM-V2XX生成BOOT.OBJ文件供链接器使用。这样,就可以按如下形式在C源程序中编写中断函数:

  voidc_inx() /*x为1~8中之一*/

  {

  中断程序的C语句系列;

  }

  注意事项:c_int0()是系统入口函数,用户不能编写。

  经过上面对命令文件(CMD文件)和中断矢量表的介绍,接下来可以链接命令文件来生成所需要的OUT文件供DSP芯片执行或进行软仿真。

  命令形式:DSPLNK CMD文件名

  例如:DSPLNK EX1.CMD

  另一种情况是,不使用CMD文件,使用缺省配置,简单介绍如下:

  命令形式:DSPLNK OBJ文件名参数

  例如:DSPLNK EX1.OBJ BOOT.OBJ-O XX1.OUT-M XX1.MAP

  以上三步可以用图1描述。

  2.4程序的仿真

  用EMURST仿真器复位命令

  EMU2XXW EX1.OUT

  载入COFF格式的二进制代码仿真运行。有关调试器的使用略。

  2.5程序的固化

  程序仿真运行正确后,需要固化到Flash ROM中。TMS320F240内部有16K字的Flash ROM可以用来固化程序,而不需要外扩EPROM(程序不大于16K字的情况下)。

  TI公司提供有固化程序的软件,可以通过仿真器经JTAG口将程序写入芯片内、目前发展了一种新的固化技术,可以通过串口写入DSP芯片,特别适合于现场调试。下面介绍通过JTAG口的固化方法。

  首先用EMURST命令复位调试器,然后执行下面三个批处理文件。

  第一步,执行BCO.BAT批处理文件,将FlashROM清除(CLEAR),使全为0。

  第二步,执行BE0.BAT批处理文件,将FlashROM擦除(ERASE),使全为1。

  (以上两步不需要修改软件包中自带的这两个BAT文件。)

  第三步,执行BP16K.BAT批处理文件,将自己的OUT文件写入到DSP内部的Flash ROM中。执行这一步之前,要先修改BP16K,BAT,将待写入的OUT文件替换成自己的OUT文件。下面看一下这个批处理文件。假设软件包的安装目录为C:DSP,该目录下有一个子目录SRC。

  prg2xx-p240-m0x0006-w6srcc2xx_bpx.out要写入的OUT文件

  如果要将EX1.OUT写入到DSP的Flash中,则执行下面的命令:

  prg2xx-p240-m0x0006-w6srcc2xx_bpX.out c:dspEX1.out

  经过以上步骤即完成了程序固化,可以将系统放到现场实验了。

  注意:固化程序时,CPU一定要工作在20MHz的频率下。在SRC子目录下有一个配置文件C240_CFG.I,读者可以根据程序说明并结合自己系统的外部晶振频率将CPU的工作频率设为20MHz(写入时的频率)。

  本文以TMS320F240的开发为例,介绍了怎样用C语言开发DSP系统的全过程。希望对读者会有所启发和帮助。

关键词: DSP 嵌入式 C语言 优化

加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW

或用微信扫描左侧二维码

相关文章

查看电脑版
晚上吃什么有助于减肥 内瘘是什么意思 牛奶什么时候喝最好 眼睛经常充血是什么原因引起的 吃什么疏通血管最快
晚上睡觉流口水是什么病 川崎病是什么 减脂喝什么茶最有效 拉肚子挂什么科室 日本打工需要什么条件
房间朝向什么方向最好 77岁属什么生肖 舌头有点麻是什么病的前兆 属牛的守护神是什么菩萨 398是什么意思
经期可以喝什么茶 阴道里面长什么样 父母都是a型血孩子是什么血型 早搏吃什么药好 胃难受吃什么食物好
天丝棉是什么面料hcv8jop5ns6r.cn 黄色裤子配什么上衣好看xinjiangjialails.com 吃止痛药有什么副作用hcv8jop0ns7r.cn 阿西吧是什么意思hcv8jop0ns6r.cn hpv低危型是什么意思hcv8jop5ns1r.cn
查染色体挂什么科hcv7jop6ns6r.cn 兔肉和什么相克dayuxmw.com 碘伏是什么hcv8jop3ns6r.cn 食物中毒有什么症状hcv8jop9ns8r.cn 气结是什么意思hcv8jop8ns8r.cn
女性乳房痒是什么原因hcv8jop8ns3r.cn 贝的偏旁有什么字hcv8jop3ns4r.cn 颈椎病去医院挂什么科wzqsfys.com 满是什么结构hcv7jop7ns4r.cn 承蒙不弃什么意思hcv8jop6ns7r.cn
色调是什么意思hcv9jop6ns5r.cn 晚上失眠是什么原因hcv9jop6ns1r.cn 及什么意思hcv8jop7ns5r.cn 结晶果糖是什么hcv9jop2ns3r.cn 稳是什么意思hcv8jop1ns9r.cn
百度