04 DSP软件开发

上传人:仙*** 文档编号:243315168 上传时间:2024-09-20 格式:PPT 页数:79 大小:1,001KB
收藏 版权申诉 举报 下载
04 DSP软件开发_第1页
第1页 / 共79页
04 DSP软件开发_第2页
第2页 / 共79页
04 DSP软件开发_第3页
第3页 / 共79页
资源描述:

《04 DSP软件开发》由会员分享,可在线阅读,更多相关《04 DSP软件开发(79页珍藏版)》请在装配图网上搜索。

1、,,,,,,,,单击此处编辑母版标题样式,,单击此处编辑母版文本样式,,第二级,,第三级,,第四级,,第五级,,DSP,技术讲义,,2007,,陈军波,©,电子信息工程学院,Click to edit Master title style,,Click to edit Master text styles,,Second level,,Third level,,Fourth level,,Fifth level,,DSP,技术讲义,,2010,单击此处编辑母版标题样式,,单击此处编辑母版文本样式,,第二级,,第三级,,第四级,,第五级,,*,*,*,Cliquez pour modifier

2、le style du titre du masque,Cliquez pour modifier les styles du texte du masque,Deuxième niveau,Troisième niveau,Quatrième niveau,Cinquième niveau,单击此处编辑母版标题样式,,单击此处编辑母版文本样式,,第二级,,第三级,,第四级,,第五级,,DSP技术,*,*,,DSP,技术,04 TMS320C54x DSP,软件开发,DSP,技术,☆,DSP,汇编语言程序设计,,,☆,DSP,汇编程序开发工具,,,☆,DSP,高级,C,语言程序设计,DSP,程

3、序设计与开发,第一部分,,DSP,汇编语言程序设计,,汇编语言程序以,.,asm,为扩展名,可以用任意的编辑器编写源文件。一条语句占源程序的一行,汇编器每行最多读200个字符。因此,语句的执行部分必须限制在200个字符以内。,4.1.1,汇编语言源程序格式,,源文件格式,,助记符指令源语句的每一行通常包含,4,个部分:标号区、助记符区、操作数区和注释区。,,[,标号,][:],,助记符,,[,操作数,],,,[,; 注释,],助记符指令语法格式:,,,【例】,,助记符指令源语句举例。,,,,NANHU,,.set,,1,,;,符号,NANHU=1,,,Begin:,,LD,,#NANHUA,A

4、R1,,;,将,1,加载到,AR1,,标 号,助记符,操作数,注 释,,4,.,1,.,2,,汇编语言中的常数与字符串,,汇编器可支持7种类型的常数(常量)。,,数据类型,举 例,说 明,二进制,1110001,b,或1110001,B,,八进制,226,q,或572,Q,,十进制,1234或+1234或-11234,缺省型,十六进制,0,A40h,或0,A40H,或0,xA40,,浮点数,1.623,e-23,仅用于,C,语言,字符,‘,D’,,字符串,“,this is a string”,,4.2,,堆栈的使用方法,,1.,,堆栈的设置,,size .set

5、 120,,stack .,usect,,“,STACK,”,,size,,STM #,,stack,,+,,size,SP,,在数据,RAM,空间开辟一个堆栈区。,在,RAM,中定义一个,STACK,,的保留空间,共120个单元,,设置堆栈指针,,#,,stack,+,size→SP,。,保留区的高地址赋给,SP,,,作为堆栈的栈底,若程序中要使用堆栈,必须先进行设置,如:,,设置好堆栈后,就可以使用堆栈了,如:,,CALL,pmad,;(SP)-1→SP,(PC)+2→TOS,,,pmad→PC,,RET ;(TOS)→PC,(SP)+1→SP,,,4.3,汇编器

6、伪指令,,将代码和数据汇编进指定的段;,,,在存储器中为未初始化的变量保留空间;,,,初始化存储器;,,,声明全局变量;,,,为汇编器指定从中可以获得宏的库。,汇编伪指令功能,1,.,定义段的伪指令,,.,bss,,为未初始化的数据段保留空间(单位为字),,.data,指定,.data,后面的代码为数据段,,.sect,定义初始化的命名段,,.text,指定,.text,后面的代码为文本段,,.,usect,,为未初始化的命名段保留空间,,,2.,初始化常数的伪指令,,.,bes,,和,.space,在当前的段中保留指定的位数,,.byte,伪指令在当前段中放一个,8,位值进入连续的字;,,.

7、field,将单个数放进当前字的指定位域,,.float,和,.,xfloat,计算单个单精度浮点数,并将其存储在当前段的,2,个连续的字中;,,.,int,, .word,将一个或多个,16,位的值放进当前段的连续字中,, .,int,,为无符号整型,, .word,为带符号整型。,,.long , .,xlong,,把,32,位数存放到当前段连续的两个字中。,,.,string,.pstring,把,8,位的字符从一个或多个字符串中传送到当前段中。,3.,输出列表格式伪指令,,.title,为汇编器提供一个打印在每一页顶部的标题。,,.list/,nolist,,重新启动,/,停止源程序清

8、单。,,,4.,引用其他文件的伪指令,,.copy/.include,从其他文件包括源语句;,,.def,识别定义在当前和用在其他模块中的一个或多个符号;,,.global,定义一个或多个全局符号,,,.,mlib,,定义宏库,,.ref,识别用在当前模块但定义在其他模块中的一个或多个符号。,5.,控制条件汇编的伪指令,,.if/.,elseif/.else/.endif,,条件汇编,,.loop/.break/.,endloop,,循环汇编,,,6.,其他伪指令,,.,equ,/.set,使一个符号等于一个值,,.end,结束程序,,,有关伪指令更详细的内容见,,TMS320C54x Ass

9、embly Language Tools User’s Guide. Texas Instruments Inc, June 2001,宏语言,,宏,:,用户,定义的能被用作指令的程序。,汇编器支持宏语言,使用户可以建立自己的,“,指令,”,。当程序要将特定的任务执行若干次时,尤其有用,。,宏的使用,DAT0 .set 60h,,DAT1 .set 61h,,DAT2 .set 62h,,DAT3 .set 63h,,.text,,ADD3,.macro,X1, X2, X3, X_SUM,,LD X1,A,,ADD

10、 X2,A,,ADD X3,A,,STL A, X_SUM,,,.,endm,… …,,ST #0020h, DAT0,,ST #0030h, DAT1,,ST #1140h, DAT2,,,ADD3 DAT0, DAT1, DAT2, DAT3,,NOP,,…,,.end,【,例】计算,y =,,程序:,,,********************************************,,*,example.asm,*,,********************************************,,,.title,“,example.asm,

11、”,,.,mmregs,,STACK .,usect,,“,STACK,”,,10h,,.,bss,a,4,,.,bss,x,4,,.,bss,y,1,,.def start,,.data,,;,为堆栈指定空间,,,;,为变量分配9个字的空间,,table:,,.word 1,2,3,4,,.,word 8,6,4,2,,.text,,start: STM #0,SWWSR,,,STM #STACK+10h,SP,,,STM #a,AR1,,RPT #7,,,MVPD table,*AR1+,,,CALL SUM,,end: B

12、 end,,,;,变量初始化,,,,,;,插入0个等待状态,,,;,设置堆栈指针,,,;,,AR1,指向,a,,,;,移动8个数据,,,;,程序存储器到数据存储器,,,;,调用,SUM,子程序,,,续上表,,SUM,:,STM #a, AR3,,STM #x, AR4,,RPTZ A, #3,,MAC *AR3+,*AR4+,A,,STL A, @y,,RET,,.end,,;,子程序执行,续上表,第二部分,,DSP,汇编程序开发工具,,TMS320C54x,提供,2,种编程语言:,汇编语言,和,C/C++,语言,。对于完成一般性功能的代码,这,2,种语言都可以

13、使用,但对于一些运算量很大的关键代码,最好采用手工编写的汇编语言来完成。,,TMS320C54x,提供有,2,种开发环境:,非集成,的开发环境和,集成,开发环境,Code Composer Studio,,简称,CCS,。,CCS,在,WINDOWS,操作环境下运行,集成了非集成开发环境的所有功能,并扩展了许多其他功能。,,C,源文件,C,编译器,汇编,,源文件,汇编器,汇编,,源文件,COFF,,目标,文件,链接器,可执行的,,COFF,文件,宏,源文件,存档,器,宏库,存档器,目标,,文件库,建库工具,运行时,,支持库,EPROM,,编程器,交叉引用,,列表器,调试工具,TMS320C54

14、x,绝对地址,,列表器,HEX,代码,,转换工具,汇编语言程序的编辑、汇编和链接过程,示意图,汇编器,调试程序,链接器,文本编辑器,.,asm,,源文件,.,obj,,目标文件,.,out,,输出文件,.,cmd,,链接命,,令文件,.,lst,,列表文件,.,map,,存储器,,映像文件,十六进制,,转换程序,,HEX500,-,,o,-,,m,-,,l,4.,4 COFF,的一般概念,,汇编器和链接器生成的目标文件,是一个可以由’,C54x,器件执行的文件。这些目标文件的格式称之为,公共目标文件格式(,COFF),。,,在编写汇编语言程序时,,COFF,采用代码段和数据段的形式,以便于模

15、块化的编程,使编程和管理变得更加方便。,,,这些代码段和数据段简称为,段,。汇编器和链接器提供一些伪指令来建立和管理各种各样的段。,4.4.1 COFF,文件的基本单元,,1.,段(,sections),,,,段是,COFF,文件中最重要的概念。每个目标文件都分成若干段。,,所谓,段,,是指存储器中占据相邻空间的代码或数据块。一个目标文件中的每个段都是分开的和各不相同的。,,COFF,目标文件都包含以下3种形式的段:,,,.,text,段(文本段),,通常包含可执行代码;,,.data,段(数据段),,通常包含初始化数据;,,,.,bss,,段(保留空间段),,通常为未初始化变量保留存储空间。

16、,2.,段的基本类型,,,,COFF,目标文件中的段有两种基本类型。,,,初始化段,,, 未,初始化段,(1) 初始化段,初始化段中包含有数据或程序代码。主要有:,,,.,text,段,——已初始化程序段;,,,.,data,段,——已初始化数据段;,,,.,sect,段,——已初始化段,由汇编器伪指令建立的自定义段。,(2),未初始化段,在存储空间中,为未初始化数据保留存储空间。,,它包括:,,.,bss,段,——未初始化段;,,,.,usect,段,——未初始化段,由汇编命令建立的命名段(自定义段)。,3.,段与目标存储器的对应关系,,,,汇编器的任务:,在汇编过程中,根据汇编命令用适

17、当的段将各部分程序代码和数据连在一起,构成目标文件。,,,链接器的任务,:,就是分配存储单元,将目标文件中的段重新定位到目标系统的不同存储器中,这一过程称为,定位,或,分配,。,目标文件中的段与目标存储器之间的关系,,,,,,,,目标文件,目标存储器,.,bss,.,data,.,text,RAM,E,2,PROM,ROM,4.4.2,汇编器对段的处理,汇编器对段的处理是通过段伪指令来区别各个段的,,,并将段名相同的语句汇编在一起。,,汇编器有5条伪指令可识别汇编语言程序的各个段:,● .,bss,,,● .,usect,,,● .,text,,,● .,data,,,● .,sect,——定

18、义未初始化段,,——定义未初始化段,,——定义已初始化段,,——定义已初始化段,,——定义已初始化段,经汇编后,得列表文件(部分):,2,*******************************,,3,,**,汇编一个初始化表到.,data,段,**,,4,,*******************************,,5,,0000,.data,,6,,0000,,0044,,coeff,.word 044h,055h,066h,,,0001,0055,,,0002,0066,,7,*******************************,,8,**,在,.,bss,段中

19、为变量保留空间,**,,9,*******************************,,10,,0000,.,bss,buffer,,,8,,11,*******************************,,12,**,仍然在,.,data,段中,**,,13,*******************************,,14,,0003,0456,,prt,,.,word 0456h,行号,目标代码,段名,,100,d,,f010,,0001,,f842,,0001,,110a,,f166,,000a,,F868,,0006,,,,,,0044,,0055,,0066,,

20、0456,,00,cc,,00dd,,00ee,,,,,,0044,,0088,,,,,,,,,,,,,没有数据,,保留,10,个字,,5,0000 .data,6 0000 0044,coeff,.word 044h,055h,066h,10 0000 .,bss,buffer,,,8,14 0003 0456,prt,,.,word 0456h,.,data,,6,,0044,6,,0055,6,,0066,10,,.,bss,,没有数据,,保留,8,个字,14,,0456,15,********************

21、************,,16,**,汇编代码到,.,text,段,**,,17,********************************,,18,,0000,.text,,19,,0000,,100d,add,:,LD 0Dh,,,A,,20,,0001,,f010,,aloop,:,SUB #1,,,A,,,0002,,0001,,,21,,0003,,f842,,BC,aloop,,,AGEQ,,,,0004,,0001,’,,,22,,**********************************,,23,,**,汇编另一个初始化表到,.,data,段

22、,**,,,24,**********************************,,25,,0004,,,.,data,,,26,,0004,,00cc,,ivals,,.,word 0CCh,,,0DDh,,,0EEh,,,0005,,00dd,,,0006,,00ee,,27,********************************,,28,,**,为更多的变量定义另一个段,**,,29,********************************,,30,,0000,var2,.,usect,,“,newvars,”,,,2,,31,,0001,,inbuf,,.,

23、usect,,“,newvars,”,,,8,,行号,目标代码,段名,,100,d,,f010,,0001,,f842,,0001,,110a,,f166,,000a,,F868,,0006,,,,,6,,6,,6,,14,0044,,0055,,0066,,0456,,00,cc,,00dd,,00ee,.,data,,,,,0044,,0088,,,,,,10,没有数据,,保留,8,个字,.,bss,,,,,没有数据,,保留,10,个字,,.,text,,18 0000 .text,19 0000 100d add,:,LD 0Dh,,,A,19

24、,,100d,20 0001 f010,aloop,:,SUB #1,,,A,20,,f010,20,,0001,21,0003,f842 BC,aloop,,,AGEQ,21,,f842,21,,0001,25 0004,.,data,26 0004 00cc,ivals,,.,word 0CCh,,,0DDh,,,0EEh,.,data,,26,,00cc,26,,00dd,26,,00ee,30 0000 var2,.,usect,,“,newvars,”,,,2,newvars,,30,,保留,2,个字,31 0001,inbuf,,.,

25、usect,,“,newvars,”,,,8,31,,保留,8,个字,32,,,***********************,**********,,33,,**,汇编更多代码到,.,text,段,**,,34,*********************************,,35,,0005,,.,text,,,36,,0005,,110a,,mpy,:,LD 0Ah,,,B,,,37,0006,,f166,,mloop,MPY #0Ah,,,B,,,0007,,000a,,,38,,0008,,f868,BC,mloop,,,BNOV,,,,0009,,0006,’

26、,,,39,****************************************,,40,,,**,为中断向量,.,vectors,定义一个自定义段,**,,41,****************************************,,42,,0000,,.,sect,“,vectors,”,,,43,0000,,0044,,,.,word 044h,,,088h,,0001,,0088,,行号,目标代码,段名,19,,20,,20,,21,,21,100,d,,f010,,0001,,f842,,0001,,110a,,f166,,000a,,F868,,

27、0006,.,text,,,,6,,6,,6,,14,,26,,26,,26,0044,,0055,,0066,,0456,,00,cc,,00dd,,00ee,.,data,,,,,0044,,0088,,,,,,10,没有数据,,保留,8,个字,.,bss,,,,30,,31,没有数据,,保留,10,个字,newvars,35 0005,.,text,.,text,,36 0005 110a,mpy,:,LD 0Ah,,,B,36,,110a,37,0006 f166,mloop,MPY #0Ah,,,B,37,,f166,37,,000a,38 0008 f868

28、 BC,mloop,,,BNOV,38,,f868,38,,0006,42 0000,.,sect,“,vectors,”,vectors,,43 0000 0044,.,word 044h,,,088h,43,,0044,43,,0088,链接器主要完成以下功能,:,,,●,将程序中的各段按目标系统存储器配置表,(.,cmd,),进行分配,;,,,●,给符号和段安排最终地址,,,完成重定位操作,;,,,●,在输入文件之间辨认没有定义的外部符号引用。,,◆,链接器的使用,,,lnk500 [-option] filename…,filename,,例,:,,

29、lnk500 file1.obj file2.obj –o,link.out,TMS320C54x,链接器把由汇编器产生的,COFF,目标文件,作为输入,,,结合,链接器命令文件,(*.,cmd,),,输出可执行文件。,链接器命令文件,目标系统存储器配置和链接使用伪指令,MEMORY,和,SECTIONS,描述。,,MEMORY :,定义目标系统存储器配置,,SECTIONS :,控制段的构成与存储器分配,◆,链接器命令文件,含有链接时所需的信息。这些信息包括输入文件名、链接时的参数选项、目标系统存储器配置和链接信息、全局符号定义等。,C54x,用户自己设计的系统及存储器配置各不相同。,MEM

30、ORY,伪指令可使你充分描述各个用户系统的实际存储器配置,然后用,SECTIONS,伪指令去指定各个段与存储器配置的分配关系。,,,,MEMORY,伪指令语法格式如下:,,,MEMORY,,{,,PAGE0: name1[(attr)]:origin=constant, length=,constant;[fill,=constant];,,,.,,.,,.,,PAGEn,:,namen[(attr)]:origin,=constant, length=,constant;[fill,=constant];,,},如果没有使用,MEMORY,和,SECTIONS,定义存储器空间模型和配置,链接

31、器对,C54x,使用缺省的存储器模型和段分配方法。,,MEMORY /*MEMORY,伪指令*,/,,{,,PAGE0:PROG:origin=0x0080 length=0xFF00,,PAGE1:DATA:origin=0x0080 length=0xFF80,,},,,SECTIONS /*SECTIONS,伪指令*,/,,{,,.text: PAGE=0,,.data: PAGE=0,,.,cinit,: PAGE=0,,.,bss,: PAGE=1,,},有关链接命令文件更详细的内容见,,1,、,TMS320C54x A

32、ssembly Language Tools User’s Guide. Texas Instruments Inc, June 2001,,或参考,,2,、,TMS320C54x DSP,应用程序设计与开发,.,刘益成,北京航空航天大学出版社,,2002,链接命令文件的编写,/**********,链接命令文件**********,/,,/**********,example.cmd,**********/,,/*******************************/,,a.obj,,b.obj,,c.obj,/*,输入文件名*,/,,-o,prog.out,/*,输出,out,文件

33、*,/,,-m,prog.map,,,MEMORY /*MEMORY,伪指令*,/,,{,,,RAM:origin,=0100h length=0100h,,,ROM:origin,=0100h length=0100h,,},,,SECTIONS /*SECTIONS,伪指令*,/,,{,,.text:>ROM,,.data:>RAM,,.,bss,:>RAM,,},档案管理器(,Archiver,),档案管理器允许用户将一组文件归入一个单一文件中,这个单一文件就叫,库,或,归档文件,。,,,,,档案管理器的使用格式:,,ar500 -[command]

34、[option],libname,[filename1…,filenamen,],,command,告诉档案管理器如何处理库,,option,告诉档案管理器如何运行,,libname,,归档库名,默认扩展名(,.lib),,filename,独立文件名(,.,obj,),,,例,:,创建一个名为,function.lib,的库,它包括文件,sine.obj,、,cos.obj,、,flt.obj,,命令为:,,Ar500 –a function sine,cos,,flt,绝对列表器,绝对列表器是一个调试工具。它将链接后的目标文件作为输入文件,创建扩展名为,.abs,的文件作为输出。,.abs

35、,文件显示目标代码绝对地址的列表。,,,,,启动绝对列表器的命令:,,,abs500 [-option] input-file,,,具体用法可参考,,TMS320C54x Assembly Language Tools User’s Guide. Texas Instruments Inc, June 2001,交叉引用列表器,交叉引用列表器也是一种调试工具。链接后的可执行文件作为交叉引用列表器的输入文件,其输出文件为交叉引用列表文件,(.,xrf,),。此列表文件列出可执行文件中符号、符号的定义及它们的引用情况。,,,,启动交叉引用列表器的命令:,,,xref500 [-option] [

36、input file [output filename]],,,具体用法可参考,,TMS320C54x Assembly Language Tools User’s Guide. Texas Instruments Inc, June 2001,十六进制转换公用程序,C54x,汇编器、链接器产生,COFF,可执行文件。,COFF,文件是,TI,公司的二进制格式文件,,便于模块化编程和提供灵活、方便的代码管理及存储空间管理。,但是,,大多数,EPROM,编程器不接收,COFF,格式文件,因此,TI,公司提供了一个将,COFF,文件格式转化为,Intel,、,Tektronix,、,Motoro

37、la-S,、,ASCII-hex,等文件格式的公用程序。,,,,启动十六进制转换程序的命令:,,,hex500 [-option] filename,第三部分,DSP,高级,C,语言程序设计,TMS320C54x C/C++,编译器支持,ANSI(American,National Standards Institute),开发的,C/C++,语言标准。,C,语言开发的优点,1)便于阅读,维护,交流;,,2)编程更为,容易,,不是特别精通汇编语言的开发人员也可以编写;,,3)便于分工合作完成,子模块,的编写,以及由子模块到,大系统,的搭建 ;,,4)便于,移植,到,C55、C2000、C600

38、0,等,DSP,系统中;,TMS320C54x C,编译器支持的关键词,1,、,const,、,volatile,,关键词,,用来控制数据对象的存储分配,,const,定义的常数被分配在,ROM,中,关键词,volatile,定义的数据分配在,RAM,中。,,,例如定义,ROM,表,,,const,int,digits[ ]={0,1,2,3,4,5,6,7,8,9},,,例如定义,RAM,中的一个指向无符号整型的指针,,volatile unsigned,int,*ctrl,2,、,ioport,,关键词,,用来访问,TMS320C54x,器件的,I/O,端口空间,,,,格式:,,,iopo

39、rt,,type,,port,hex_num,,,,ioport,,指示这是一个端口变量的关键词。,,,type,(类型) 必须是,char,(字符)、,short,(短整数)、,int,(整数)或无符号的变量。,,,port,hex_num,,指端口编号。,hex_num,变量为十六进制数。,例:,声明,I/O,端口为无符号端口,10h,,将,a,写到端口,10h,,然后将端口,10h,读进,b,:,,ioport,unsigned port10; /*,访问,I/O,端口,10h,的变量*,/,,int,,func,(),,{,,…,,port10=a;

40、 /*,将,a,写到端口,10h*/,,…,,b=port10; /*,将端口,10h,读进,b*/,,…,,},,端口变量的使用对赋值没有限制。端口变量可像其他变量一样用在表达式中。,,a=port10+b;,/*,读端口,10h,,加上,b,,结果赋给,a*/,,prot10+=a;,/*,读端口,10h,,加上,a,,结果写到端口,10h*/,3,、,interrupt,关键词,,用来指定将函数作为中断函数处理。当,C,代码被中断时,中断程序必须保存所有寄存器的内容。,,中断函数的主体可具有局部变量并可自由使用堆栈。,,,,,interr

41、upt,void,int_handler,(),,{,,unsigned,int,flags;,,…,,},,C_int00,是,C/C++,的进入点,为系统复位中断保留,该中断程序初始化系统并调用函数,main,。,interrupt double,compute_area,(double radius) { double area = PI * radius *,radius,;,printf("\nArea,= %f", area); return area; },,,ISR,不能返回一个值。,,ISR,不能传递参数。,,C,编译器不允许在,ISR,中做浮点运算。,,,下面是一个错

42、误的程序:,面向,DSP,的,C,程序设计准则,面向,DSP,的,C,程序设计,基本原则,:,C,程序不但需要对数据流进行编程,也要对时序机制进行编程。,通用,PC,的,C,程序,,大量数据集中式处理,,数据流处理,,非实时,,直观的输入、输出设备,运行结果无需借助其他设备,,数据来源可由软件仿真产生,或通过计算机接口从外部获取,数据可集中处理。,面向,DSP,的,C,程序,,极少数据的实时处理,,数据流、时序处理,,实时性,,输入,/,输出为映射在存储空间的数据,结果显示需借助示波器、逻辑分析仪等设备,,数据从,A/D,获得,由于,DSP,存储容量的限制,数据需实时处理。,实例,,#incl

43、ude <,stdio.h,>,,#include ",hello.h,",,,#define BUFSIZE 30,,,struct,PARMS,str,=,,{,,2934,,,9432,,,213,,,9432,,,&,str,,};,,,/*,,* ======== main ========,,*/,,void main(),,{,,#,ifdef,FILEIO,,,int,i;,,char,scanStr[BUFSIZE,];,,char,fileStr[BUFSIZE,];,,,size_t,,readSize,;,,FILE *,fptr,;,,#,endif,,,

44、/* write a string to,stdout,*/,,,puts("hello,world!\n");,续上表,,#,ifdef,FILEIO,,,/* clear char arrays */,,for (i = 0; i < BUFSIZE; i++) {,,,scanStr[i,] = 0,/* deliberate syntax error */,,,fileStr[i,] = 0;,,},,/* read a string from,stdin,*/,,,scanf("%s,",,scanStr,);,,/* open a file on the host and writ

45、e char array */,,,fptr,=,fopen("file.txt,", "w");,,,fprintf(fptr,, "%s",,scanStr,);,,,fclose(fptr,);,,续上,,,,/* open a file on the host and read char array */,,,,fptr,=,fopen("file.txt,", "r");,,,fseek(fptr,, 0L, SEEK_SET);,,,readSize,=,fread(fileStr,,,sizeof(char,), BUFSIZE,,fptr,);,,,printf("Read,a

46、 %d byte char array: %s \n",,readSize,,,fileStr,);,,,fclose(fptr,);,,#,endif,,,},,,CCS,下的运行结果,,汇编语言与,C/C++,混合编程,C,语言开发,DSP,程序,可读性,和,可移置性,强,同时使用,C,编译器的优化功能可以增强编程的效率。而汇编程序比较,精练,,运行,效率高,。为了提高程序的开发效率,通常用到汇编语言与,C/C++,混合编程,的方法。特别是用,C,程序不能深入底层访问硬件寄存器时,可以调用汇编语句来完成一些硬件访问。,独立的,DSP C,语言和汇编接口,,在,DSP C,程序中访问汇编变量

47、和常量,,在,DSP C,程序中直接嵌套汇编语句,,利用,DSP C,编译器的内联(,intrinsics,),函数访问汇编语句,独立的,DSP C,语言和汇编接口,在,DSP C,和汇编程序相互访问过程中,为了在访问之后返回时程序不出错,需要保护一些特定的寄存器。因此,要求,DSP C,与汇编程序接口时必须遵循一定的,寄存器规则,。,,这些规则包括有,:,(1),必须保护正在运行的函数所用到的几个特定的寄存器,例如,AR1,、,AR6,、,AR7,及,SP,,,PUSH(AR7),/*,将,AR7,压入堆栈*,/,,,CALL _c_int3,/*,调用,C,函数*,/,,,AR7=POP(

48、),/*,将,AR7,弹出堆栈*,/,,(2),在中断服务子程序执行前,必须保存所有正在使用的寄存器。,,PUSH(PMST),/*,将,PMST,压入堆栈*,/,,,CALL ISR,/*,调用中断服务程序*,/,,,PMST=POP(),/*,将,PMST,弹出堆栈*,/,(3),函数有值返回时,返回值在累加器,A,中。,,(4),所有在,DSP C,中定义的变量、数组等表示符,在汇编程序引用时,都要在表示符的前面加上下划线,”_”.,,(5),在汇编程序和,C,程序中同时使用的变量或函数,要在汇编程序和,C,程序中同时说明为外部的,这样链接器才能识别。,C,程序(,mixc11.c,),

49、,extern,int,,asmfunction,(),;,,,/*,说明外部的,asm,函数*,/,,extern,int,,gvar,;,,,/*,说明外部变量*,/,,int,result;,,main(),,{,,,int,i=200;,,i=,asmfunction,();,,,/*,调用汇编函数*,/,,result=,gvar,*5+10;,,},,,汇编程序(,mixasm11.asm,),,.global _,gvar,,;,说明外部变量,,.global _,asmfunction,,.data,;,为汇编变量分配地址,,_,gvar,.word 100,;,定义变量,,,

50、.text,,_,asmfunction,:,,LD #0,A,; A=0,,ADD *(_,gvar),A,,;(,gvar)+A,=>A,,STL A, *(_,gvar,),;A =>(,gvar,),,RET,,.end,,C,程序调用汇编程序,DSP C,程序中访问汇编变量和常数,有时要在,C,程序中访问汇编程序定义的,变量,和,常数,,汇编程序中变量和常量的定义有以下三种方法:,,在,.,bss,段中定义的变量,,不在,.,bss,段中定义的变量,,定义的常量,(1),直接在,.,bss,段或,.,usect,段中定义的未初始化变量,,第一步:使用,.,bss,或,.,usect,

51、段定义变量,,第二步:使用,.global,伪指令定义为外部变量,,第三步:在汇编程序中将下划线“,_”,放在变量名之前,,第四步:在,C,中将变量说明为外部变量,1.,访问汇编程序定义的变量,C,程序(,mixc21.c,),,extern,int,,asmfunction,(),;,,,/*,说明外部的,asm,函数*,/,,extern,int,,var,;,,,/*,说明外部变量*,/,,int,result;,,main( ),,{,,,int,i=1000;,,,var,=1000;,/*,说明外部变量*,/,,i=,asmfunction,();,,,/*,调用汇编函数*,/,,

52、result=,var,*2+100;,,wait:,,,goto,wait;,,},汇编程序(,mixasm21.asm,),,.,bss,_var,10,,,;,为变量,var,留出,10,个字的空间,,.global _,var,,;,说明外部变量,,.global _,asmfunction,,.text,,_,asmfunction,:,,LD #1000,A;,; A=1000,,ADD *(_,var),A,,;(,var,),+A =>A,,STL A, *(_,var,),;A =>(,var,),,RET,,.end,(2),不在,.,bss,段中定义变量,,汇编变量可以在

53、,.,bss,中定义,也可以不在,.,bss,中定义。,C,程序(,mixc22.c,),,extern,int,data[ ],;,,,/*,这是一个对象*,/,,int,*,data_p,=data;,,,/*,说明指针指向它,*/,,int,num;,,main( ),,{,,num=data_p[3];,,/*,指针指向数组的第,4,个元素*,/,,wait:,,,goto,wait;,,},汇编程序(,mixasm22.asm,),,.global _data,;,说明外部变量,,.sect “.,data:data,_tab”,,,;,在,.data,段产生一个名为”,data

54、_tab,“,的数据段,,_data,:,,.word 10,,,.word 20,,.word 30,,.word 40,,.word 50,,,,C,程序(,mixc23.c,),,extern,int,,table_size,;,/*,说明为外部的*,/,,int,a[10],b[10];,,main( ),,{,,,int,i;,,,for(i,=0;i<,table_size,;i,++),/*,引用常量*,/,,{,a[i,]=0;,,,b[i,]=0;,,},,,for(i,=0;i<,table_size,;i,++),/*,引用常量*,/,,{,a[i,]

55、=i*10+10;,,,b[i,]=,a[i,];,,},,wait:,,,goto,wait;,,},,2.,访问汇编程序常数,,,DSP C,程序访问在汇编程序中定义的常数有两种方法,其一是利用,.set,和,.global,伪指令定义汇编程序外部常量;其二是利用连接器分配语句在链接命令文件中定义他们。,汇编程序(,mixasm23.asm,),,,_,table_size,.set 10,,,;,定义常量,,.global _,table_size,,,;,定义为全局,链接命令文件(,mix23.cmd,),,,_,table_size,=10;,,/*,定义常量*,/,,.,,,.,

56、,.,或:,3.,在汇编程序中访问,DSP C,程序变量和常量,,,C,程序(,mixc25.c,),,extern,int,,asmfunction,(),;,,,/*,说明外部的,asm,函数*,/,,extern,,int,,gvar,;,,,/*,定义变量*,/,,main( ),,{,,,int,i=0;,,,gvar,=100;,,i=,asmfunction,();,,,/*,调用汇编函数*,/,,},,,汇编程序(,mixasm25.asm,),,.global _,asmfunction,,,.global _,gvar,,;,说明外部变量,,.text,,_,asmfunc

57、tion,:,,LD #1000,A,,ADD *(_,gvar),A,,;(,gvar,),+A =>A,,STM A, *(_,gvar,),;A =>(,var,),,RET,,.end,该方法常常应用在,C,程序遇到无法实现的一些硬件控制问题的情况下。而在,C,程序中嵌入汇编语句不但能够有效的解决这些问题,而且在,C,程序的关键部分用汇编语句代替,C,语句可以优化这个程序。编译器将,DSP C,程序中嵌入的汇编语句插入到由编译器产生的汇编语言文件中。,,,格式:,,在汇编语句前加”,\t”,,然后再加左右双引号,用小括号将语句括住,在括号前加上,asm,标识符。,,,,,asm(“\t

58、,RSBX INTM”);,/*,使,INTM,=,1*/,DSP C,程序中直接嵌套汇编语句,在,DSP C,中嵌入汇编语句时,要注意以下几点:,,要非常小心,不要干扰,C,环境。编译器不能检验或分析插入的,asm,指令的正确性;,,将条件转移或标号插入到,C,代码会产生无法预测的结果,这是由于混淆了代码产生器使用的寄存器跟踪算法;,,当使用,asm,语句时,不能改变,C,变量的值;,,不能利用,asm,语句插入汇编伪指令来改变汇编环境。,C,程序,(mixc31.c),,,extern unsigned,int,*,vecTable,;,,extern void c_int3( ),,in

59、t,a, b;,,main( ),,{,,unsigned,int,*,pmst,=(unsigned,int,*)0x1d;,,,asm(“\t,SSBX INTM “);,/*INTM=1*/,,,asm(“\t,STM 0x08C0 PMST”);,,*,pmst,|=(unsigned,int)&vecTable,;,,,asm(“\t,STM 0x0100 IMR”);,,,wait:,,,asm(“\t,RSBX INTM “);,/*INTM=0*/,,,goto,wait;,,},DSP C,编译器提供的内联函数与一般的函数一样使用,每一条,intrinsics,函数都相对应一

60、条汇编指令,并与汇编指令的功能相同。,intrinsics,函数放在头文件,intrindefs.h,中。,4.,利用,DSP C,编译器的内联(,intrinsics,),函数访问汇编语句,C,程序(,mixc41.c),,#include<,intrindefs.h,>,,int,x1, x2,result;,,main( ),,{,,x1=-1000;,,x2=-2000;,,x1=_abss(x1);,,x2=_abss(x2);,,result=_sadd(x1,x2);,,,wait:,,,goto,wait;,,},程序设计范例,例,4.12,计算,y=,主要程序,,,.,bss

61、,x, 5,,.,bss,y, 1,,STM #x, AR1,,STM #4, AR2,,LD #0, A,,loop: ADD *AR1+, A,,BANZ loop, AR2-,,STL A, @y,C,程序设计:,,int,sum5(int x[5]),,{,,,int,sum;,,,int,i;,,sum=x[0];,,,for(i,=0;i<5;i++),,sum=,sum+x[i,];,,,return(sum,);,,},,,void,main(void,),,{,,,,int,arr[5]={1,5,10,25,50};

62、,,,,y=sum5(arr);,,},例,4.16,试编一程序,计算,y=,的值,并找出,4,项乘积 中的最大值。,#include ",math.h,",,,,int,a[4]={1,5,3,4};,,int,x[4]={8,6,7,2};,,,int,y1,y2;,,,void,main(void,),,{,,,int,,i,j,;,,,,,int,sum[4]={0,0,0,0};,,,y1=0;,,,for(i,=0;i<4;i++),,{,,,sum[i,]=,a[i,]*,x[i,];//,计算乘积,,,y1=y1+sum[i]; //,求和,,,},,,,y2=sum[0];,,,,,for(j,=0;j<4;j++) //,比较乘积项的大小,,,if(sum[j,]>y2),,{,,y2=,sum[j,];,,},,},,,,,例,4.19,,,,

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

相关资源

更多
正为您匹配相似的精品文档
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!