螃蟹不能和什么水果一起吃| 97年属什么的生肖| p2大于a2什么意思| 灰什么丧什么| 中性粒细胞低是什么原因| 男人地盘是什么生肖| 夏天能干什么| 咳嗽流鼻涕吃什么药| 为什么会得痔疮| 双肺纹理增多增粗是什么病| 焦虑挂什么科| 左眼上眼皮跳是什么预兆| 牙齿遇热就疼什么原因| 看得什么| qm医学上什么意思| 基围虾为什么叫基围虾| 飞机下降时耳朵疼是什么原因| 唐氏综合症是什么病| 云南白药有什么功效| 头顶一阵一阵疼是什么原因| 艾灰有什么作用和功效| 想改名字需要什么手续| 狗狗犬窝咳吃什么药| 若叶青汁有什么功效| 咽拭子是检查什么的| 吃榴莲补什么| 老日念什么| 代表友谊的花是什么花| 孩子鼻子出血什么原因造成的| 八路军为什么叫八路军| 带环了月经推迟不来什么原因| 陈皮是什么做的| bun是什么意思| 什么样的细雨| 觉的部首是什么偏旁| 六月二十一是什么日子| 黄芪的功效是什么| 速度是70迈心情是自由自在什么歌| 天蝎男喜欢什么样的女生| 继发性是什么意思| 中药天龙又叫什么| 眼睛充血用什么眼药水最好| 反酸吃什么药| 吃什么食物能长高| 吃什么能增强性功能| 镭射是什么意思| 萎缩性胃炎用什么药最好| 脑供血不足有什么症状| 窦性心律过缓什么意思| 脊柱炎吃什么药| 梗米是什么| 鼻子出油多是什么原因| 猫来家门口有什么预兆| 骨质增生吃什么药最好| 左侧上颌窦囊肿是什么意思| 刚字五行属什么| 为什么会长瘊子| 为什么很困却睡不着| 嘴唇麻木什么病兆| 无名指是什么经络| mm表示什么| 红烧鱼用什么鱼| 牡丹什么时候开| 身主天相是什么意思| 缺钾最忌讳吃什么| 公婆是什么意思| 验孕棒两条杠什么意思| 1945年属什么| 柯字五行属什么| 叛变是什么意思| 女人吃什么排卵最快| 白牡丹属于什么茶| 睑缘炎用什么药| 嘴紫是什么原因| 湿疹为什么一热就出来| 胚由什么发育而来| 右上腹是什么器官| 焖是什么意思| 男士阴囊痒用什么药膏| 梦见很多牛是什么兆头| 拍肺片挂什么科| 早孕有什么反应| 肝衰竭是什么原因引起的| 有什么聚会玩的游戏| honor是什么牌子手机| 7月14日什么节日| 什么黄河| 廉航是什么意思| 什么的寒风| anca是什么检查| 红蜘蛛是什么虫| 补肾吃什么食物| 孕吐反应强烈说明什么| 蓟类植物是什么| 4月19是什么星座| 蜂蜜有什么功效| 烦躁是什么原因| 膝盖怕冷是什么原因| 成都有什么| 肠易激综合征吃什么药| 什么是土象星座| 甘肃有什么好吃的| 刘备字什么| 什么叫生酮饮食| 精神恍惚是什么意思| 可燃冰属于什么能源| 消炎痛又叫什么| 碘缺乏会导致什么疾病| 得了阴虱用什么药能除根| cif是什么意思| 冬至吃什么馅的饺子| 五味子长什么样| 窝在沙发里是什么歌| 梦见钓到大鱼是什么意思| 夸父是一个什么样的人| 左金丸治什么病最好| 吃什么能补头发| 层出不穷什么意思| 苡米和薏米有什么区别| 为什么晚上不能扫地| 北极熊为什么不怕冷| 花开两朵各表一枝什么意思| 爱是什么偏旁| 汗毛重的女人意味着什么| 榴莲什么时候吃最好| 训练有素是什么意思| 是什么牌子的衣服| 红玫瑰花语是什么意思| 平板电脑与笔记本电脑有什么区别| 孩子拉肚子吃什么药| 石墨烯属于什么材料| 什么时候看到的月亮最大| 豆薯是什么| 吃什么能拉肚子| 客厅钟表挂在什么地方合适| 梦见和婆婆吵架是什么意思| 转念是什么意思| 一岁宝宝口臭是什么原因引起的| 11月8日是什么星座| 茧是什么意思| 喉咙一直有痰是什么原因| 什么是半月板损伤| 暂时无法接通是什么意思| 氢氧化钙是什么东西| 胃息肉吃什么药治疗| 生理期肚子疼吃什么药| 胖子从12楼掉下来会变什么| 餐中服用是什么意思| 双眸是什么意思| 慢性浅表性胃炎伴糜烂吃什么药| 碳酸钠是什么东西| 情绪波动大是什么原因| 胸口不舒服挂什么科| 迪拜为什么那么有钱| 黑茶色是什么颜色| 什么是电解水| 郭德纲什么学历| 沧海桑田什么意思| 仓鼠怀孕有什么特征| 石榴木是什么生肖| 什么叫腺样体肥大| 灿烂的近义词是什么| 女人什么血型最聪明| 艺伎什么意思| 麻薯粉是什么粉| 吃什么死的比较舒服| 微针是什么美容项目| 丹毒是什么原因引起的| 肺热会引起什么症状| 301医院院长什么级别| 丧尽天良什么意思| 脂肪肝浸润是什么意思| 一幅什么| 满血复活是什么意思| 胃胀是什么感觉| hpv45型阳性是什么意思| 年兽叫什么| 仙草是什么草| 口若悬河什么意思| 死猪不怕开水烫是什么意思| 双氧奶是什么| 欧莱雅属于什么档次| 湿气用什么药最好最快| 十月23日是什么星座| 应届毕业生是什么意思| 蛇缠腰是什么病| 玥字属于五行属什么| 拉红尿是什么原因| 压马路什么意思| 鹅肝为什么那么贵| 四个月宝宝可以吃什么辅食| 皮上长小肉疙瘩是什么| dg是什么牌子| pt是什么单位| 吃什么对胰腺有好处| 活色生香的意思是什么| 高血压什么意思| 爰是什么意思| 牙痛上火吃什么药| 中性粒细胞低说明什么| 三岁宝宝喝什么奶粉比较好| 胃酸过多吃什么食物好| 晚上猫叫有什么预兆| 瑞夫泰格手表什么档次| 缪斯什么意思| 100元人民币什么时候发行的| 偏光和非偏光有什么区别| 怀孕血压高对胎儿有什么影响| xl什么牌子| 纵欲过度是什么意思| 石榴什么时候开花| 1962年五行属什么| 尿酸高是为什么| 18岁属什么的生肖| 斑鸠和鸽子有什么区别| 打卡什么意思| 冒昧打扰是什么意思| 两个水念什么| 牙齿一吸就出血是什么原因| 艮五行属什么| 1976年是什么命| 也字少一竖念什么| rh血型鉴定阳性是什么意思| 头大脸大适合什么发型| 返现是什么意思| 2001年属什么生肖| 什么时候测试怀孕最准确的| 金光是什么生肖| 美国为什么帮以色列| 蛤读什么| 低血压有什么危害| 额头爱出汗是什么原因| 属马女和什么属相最配| 条条框框是什么意思| 牙膏什么牌子最好| 吃优甲乐不能吃什么| 宋美龄为什么没有孩子| 山药补什么| 一张张什么| 钛对人体有什么好处| 罗布麻是什么东西| 河南有什么特色美食| 女人喝胶原蛋白有什么好处| 手足口病吃什么药最好| 睡觉被憋醒是什么原因| 鱼露可以用什么代替| 总掉头发是什么原因| 什么是概念车| 为什么吃荔枝会上火| 豚是什么动物| 什么人容易得梦游症| 生理盐水敷脸有什么作用| 看望病人买什么东西好| 肾是干什么用的| 右手无名指戴戒指是什么意思| 最里面的牙齿叫什么牙| 肾结石吃什么好| tp是什么病毒| 湖北古代叫什么| 指甲表面凹凸不平是什么原因| 腿为什么肿| 什么人容易老年痴呆| idh是什么意思| 奎字五行属什么| 百度

新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 如何用C语言开发DSP嵌入式系统

北京检方:依法批捕比特币被盗案犯罪嫌疑人

作者: 时间:2025-08-04 来源:网络 收藏
百度 11时,夏某某来到十里岗村委会在村委会大厅拍桌子随意吵闹辱骂故意将自己的茶杯摔碎在大厅门口要村里给其饭吃后又在院子里与村、镇工作人员发生冲突用头撞向工作人员的肚子。

  引言

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

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

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

  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系统的全过程。希望对读者会有所启发和帮助。

linux操作系统文章专题:linux操作系统详解(linux不再难懂)

c语言相关文章:c语言教程




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

评论


相关推荐

技术专区

关闭
维生素d什么时候吃 什么叫制动 山楂泡水有什么好处 当兵什么兵种最好 肾b超能检查出什么
羊肉和什么食物相克 一加是什么牌子 罚金属于什么处罚 肝在五行中属什么 hp什么意思
断念是什么意思 gc是什么意思 里正是什么官 牛皮癣是什么样的 99属什么生肖
love是什么词性 烧心吃什么药 头发汗多是什么原因 结婚九年是什么婚 多普勒超声检查是什么
不规则抗体筛查是什么意思hcv8jop0ns8r.cn 梦见自己头发长长了是什么意思hcv7jop6ns9r.cn 大云是什么中药beikeqingting.com 研讨会是什么意思hcv8jop3ns8r.cn 利妥昔单抗是什么药hcv9jop0ns7r.cn
男人前列腺在什么位置hcv7jop6ns2r.cn 五红汤什么时候喝最好hcv7jop7ns0r.cn 什么血型的人最多shenchushe.com 什么颜色加什么颜色是黄色hcv7jop6ns3r.cn 疗养是什么意思hcv8jop9ns2r.cn
beetle是什么车hcv8jop5ns7r.cn 唐氏宝宝是什么意思hcv7jop9ns5r.cn cns医学上是什么意思hcv7jop6ns9r.cn tp是什么hcv8jop1ns1r.cn 车厘子不能和什么一起吃clwhiglsz.com
血压压差小是什么原因hcv9jop6ns0r.cn 腹腔肠系膜淋巴结是什么病hcv9jop2ns9r.cn 脂肪垫是什么hcv8jop9ns3r.cn dna什么意思hcv9jop2ns9r.cn 心脏是由什么组织构成的hcv8jop9ns7r.cn
百度