资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,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 le style du titre du masque,Cliquez pour modifier les styles du texte du masque,Deuxime niveau,Troisime niveau,Quatrime niveau,Cinquime niveau,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,DSP技术,*,*,DSP,技术,04 TMS320C54x DSP,软件开发,DSP,技术,DSP,汇编语言程序设计,DSP,汇编程序开发工具,DSP,高级,C,语言程序设计,DSP,程序设计与开发,第一部分,DSP,汇编语言程序设计,汇编语言程序以,.,asm,为扩展名,可以用任意的编辑器编写源文件。一条语句占源程序的一行,汇编器每行最多读200个字符。因此,语句的执行部分必须限制在200个字符以内。,4.1.1,汇编语言源程序格式,源文件格式,助记符指令源语句的每一行通常包含,4,个部分:标号区、助记符区、操作数区和注释区。,标号,:,助记符,操作数,; 注释,助记符指令语法格式:,【例】,助记符指令源语句举例。,NANHU,.set,1,;,符号,NANHU1,Begin:,LD,#NANHUA,AR1,;,将,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 120,stack .,usect,“,STACK,”,,size,STM #,stack,+,size,SP,在数据,RAM,空间开辟一个堆栈区。,在,RAM,中定义一个,STACK,的保留空间,共120个单元,设置堆栈指针,,#,stack,+,sizeSP,。,保留区的高地址赋给,SP,,作为堆栈的栈底,若程序中要使用堆栈,必须先进行设置,如:,设置好堆栈后,就可以使用堆栈了,如:,CALL,pmad,;(SP)-1SP,(PC)+2TOS,,,pmadPC,RET ;(TOS)PC,(SP)+1SP,4.3,汇编器伪指令,将代码和数据汇编进指定的段;,在存储器中为未初始化的变量保留空间;,初始化存储器;,声明全局变量;,为汇编器指定从中可以获得宏的库。,汇编伪指令功能,1,.,定义段的伪指令,.,bss,为未初始化的数据段保留空间(单位为字),.data,指定,.data,后面的代码为数据段,.sect,定义初始化的命名段,.text,指定,.text,后面的代码为文本段,.,usect,为未初始化的命名段保留空间,2.,初始化常数的伪指令,.,bes,和,.space,在当前的段中保留指定的位数,.byte,伪指令在当前段中放一个,8,位值进入连续的字;,.field,将单个数放进当前字的指定位域,.float,和,.,xfloat,计算单个单精度浮点数,并将其存储在当前段的,2,个连续的字中;,.,int, .word,将一个或多个,16,位的值放进当前段的连续字中, .,int,为无符号整型, .word,为带符号整型。,.long , .,xlong,把,32,位数存放到当前段连续的两个字中。,.,string,.pstring,把,8,位的字符从一个或多个字符串中传送到当前段中。,3.,输出列表格式伪指令,.title,为汇编器提供一个打印在每一页顶部的标题。,.list/,nolist,重新启动,/,停止源程序清单。,4.,引用其他文件的伪指令,.copy/.include,从其他文件包括源语句;,.def,识别定义在当前和用在其他模块中的一个或多个符号;,.global,定义一个或多个全局符号,.,mlib,定义宏库,.ref,识别用在当前模块但定义在其他模块中的一个或多个符号。,5.,控制条件汇编的伪指令,.if/.,elseif/.else/.endif,条件汇编,.loop/.break/.,endloop,循环汇编,6.,其他伪指令,.,equ,/.set,使一个符号等于一个值,.end,结束程序,有关伪指令更详细的内容见,TMS320C54x Assembly Language Tools Users 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 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,”,.,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 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,种语言都可以使用,但对于一些运算量很大的关键代码,最好采用手工编写的汇编语言来完成。,TMS320C54x,提供有,2,种开发环境:,非集成,的开发环境和,集成,开发环境,Code Composer Studio,,简称,CCS,。,CCS,在,WINDOWS,操作环境下运行,集成了非集成开发环境的所有功能,并扩展了许多其他功能。,C,源文件,C,编译器,汇编,源文件,汇编器,汇编,源文件,COFF,目标,文件,链接器,可执行的,COFF,文件,宏,源文件,存档,器,宏库,存档器,目标,文件库,建库工具,运行时,支持库,EPROM,编程器,交叉引用,列表器,调试工具,TMS320C54x,绝对地址,列表器,HEX,代码,转换工具,汇编语言程序的编辑、汇编和链接过程,示意图,汇编器,调试程序,链接器,文本编辑器,.,asm,源文件,.,obj,目标文件,.,out,输出文件,.,cmd,链接命,令文件,.,lst,列表文件,.,map,存储器,映像文件,十六进制,转换程序,HEX500,-,o,-,m,-,l,4.,4 COFF,的一般概念,汇编器和链接器生成的目标文件,是一个可以由,C54x,器件执行的文件。这些目标文件的格式称之为,公共目标文件格式(,COFF),。,在编写汇编语言程序时,,COFF,采用代码段和数据段的形式,以便于模块化的编程,使编程和管理变得更加方便。,这些代码段和数据段简称为,段,。汇编器和链接器提供一些伪指令来建立和管理各种各样的段。,4.4.1 COFF,文件的基本单元,1.,段(,sections),段是,COFF,文件中最重要的概念。每个目标文件都分成若干段。,所谓,段,,是指存储器中占据相邻空间的代码或数据块。一个目标文件中的每个段都是分开的和各不相同的。,COFF,目标文件都包含以下3种形式的段:,.,text,段(文本段),,通常包含可执行代码;,.data,段(数据段),,通常包含初始化数据;,.,bss,段(保留空间段),,通常为未初始化变量保留存储空间。,2.,段的基本类型,COFF,目标文件中的段有两种基本类型。,初始化段, 未,初始化段,(1) 初始化段,初始化段中包含有数据或程序代码。主要有:,.,text,段,已初始化程序段;,.,data,段,已初始化数据段;,.,sect,段,已初始化段,由汇编器伪指令建立的自定义段。,(2),未初始化段,在存储空间中,为未初始化数据保留存储空间。,它包括:,.,bss,段,未初始化段;,.,usect,段,未初始化段,由汇编命令建立的命名段(自定义段)。,3.,段与目标存储器的对应关系,汇编器的任务:,在汇编过程中,根据汇编命令用适当的段将各部分程序代码和数据连在一起,构成目标文件。,链接器的任务,:,就是分配存储单元,将目标文件中的段重新定位到目标系统的不同存储器中,这一过程称为,定位,或,分配,。,目标文件中的段与目标存储器之间的关系,目标文件,目标存储器,.,bss,.,data,.,text,RAM,E,2,PROM,ROM,4.4.2,汇编器对段的处理,汇编器对段的处理是通过段伪指令来区别各个段的,,,并将段名相同的语句汇编在一起。,汇编器有5条伪指令可识别汇编语言程序的各个段:, .,bss, .,usect, .,text, .,data, .,sect,定义未初始化段,定义未初始化段,定义已初始化段,定义已初始化段,定义已初始化段,经汇编后,得列表文件(部分):,2,*,3,*,汇编一个初始化表到.,data,段,*,4,*,5,0000,.data,6,0000,0044,coeff,.word 044h,055h,066h,0001,0055,0002,0066,7,*,8,*,在,.,bss,段中为变量保留空间,*,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,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,*,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,段,*,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,.,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,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,.,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,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,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 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,例,:,lnk500 file1.obj file2.obj o,link.out,TMS320C54x,链接器把由汇编器产生的,COFF,目标文件,作为输入,结合,链接器命令文件,(*.,cmd,),输出可执行文件。,链接器命令文件,目标系统存储器配置和链接使用伪指令,MEMORY,和,SECTIONS,描述。,MEMORY :,定义目标系统存储器配置,SECTIONS :,控制段的构成与存储器分配,链接器命令文件,含有链接时所需的信息。这些信息包括输入文件名、链接时的参数选项、目标系统存储器配置和链接信息、全局符号定义等。,C54x,用户自己设计的系统及存储器配置各不相同。,MEMORY,伪指令可使你充分描述各个用户系统的实际存储器配置,然后用,SECTIONS,伪指令去指定各个段与存储器配置的分配关系。,MEMORY,伪指令语法格式如下:,MEMORY,PAGE0: name1(attr):origin=constant, length=,constant;fill,=constant;,.,.,.,PAGEn,:,namen(attr):origin,=constant, length=,constant;fill,=constant;,如果没有使用,MEMORY,和,SECTIONS,定义存储器空间模型和配置,链接器对,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 Assembly Language Tools Users Guide. Texas Instruments Inc, June 2001,或参考,2,、,TMS320C54x DSP,应用程序设计与开发,.,刘益成,北京航空航天大学出版社,,2002,链接命令文件的编写,/*,链接命令文件*,/,/*,example.cmd,*/,/*/,a.obj,b.obj,c.obj,/*,输入文件名*,/,-o,prog.out,/*,输出,out,文件*,/,-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 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,文件显示目标代码绝对地址的列表。,启动绝对列表器的命令:,abs500 -option input-file,具体用法可参考,TMS320C54x Assembly Language Tools Users Guide. Texas Instruments Inc, June 2001,交叉引用列表器,交叉引用列表器也是一种调试工具。链接后的可执行文件作为交叉引用列表器的输入文件,其输出文件为交叉引用列表文件,(.,xrf,),。此列表文件列出可执行文件中符号、符号的定义及它们的引用情况。,启动交叉引用列表器的命令:,xref500 -option input file output filename,具体用法可参考,TMS320C54x Assembly Language Tools Users Guide. Texas Instruments Inc, June 2001,十六进制转换公用程序,C54x,汇编器、链接器产生,COFF,可执行文件。,COFF,文件是,TI,公司的二进制格式文件,,便于模块化编程和提供灵活、方便的代码管理及存储空间管理。,但是,,大多数,EPROM,编程器不接收,COFF,格式文件,因此,TI,公司提供了一个将,COFF,文件格式转化为,Intel,、,Tektronix,、,Motorola-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、C6000,等,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,端口空间,格式:,ioport,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; /*,将,a,写到端口,10h*/,b=port10; /*,将端口,10h,读进,b*/,端口变量的使用对赋值没有限制。端口变量可像其他变量一样用在表达式中。,a=port10+b;,/*,读端口,10h,,加上,b,,结果赋给,a*/,prot10+=a;,/*,读端口,10h,,加上,a,,结果写到端口,10h*/,3,、,interrupt,关键词,用来指定将函数作为中断函数处理。当,C,代码被中断时,中断程序必须保存所有寄存器的内容。,中断函数的主体可具有局部变量并可自由使用堆栈。,interrupt,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,中做浮点运算。,下面是一个错误的程序:,面向,DSP,的,C,程序设计准则,面向,DSP,的,C,程序设计,基本原则,:,C,程序不但需要对数据流进行编程,也要对时序机制进行编程。,通用,PC,的,C,程序,大量数据集中式处理,数据流处理,非实时,直观的输入、输出设备,运行结果无需借助其他设备,数据来源可由软件仿真产生,或通过计算机接口从外部获取,数据可集中处理。,面向,DSP,的,C,程序,极少数据的实时处理,数据流、时序处理,实时性,输入,/,输出为映射在存储空间的数据,结果显示需借助示波器、逻辑分析仪等设备,数据从,A/D,获得,由于,DSP,存储容量的限制,数据需实时处理。,实例,#include ,#include ,hello.h,#define BUFSIZE 30,struct,PARMS,str,=,2934,9432,213,9432,&,str,;,/*,* = main =,*/,void main(),#,ifdef,FILEIO,int,i;,char,scanStrBUFSIZE,;,char,fileStrBUFSIZE,;,size_t,readSize,;,FILE *,fptr,;,#,endif,/* write a string to,stdout,*/,puts(hello,world!n);,续上表,#,ifdef,FILEIO,/* clear char arrays */,for (i = 0; i A,STL A, *(_,gvar,),;A =(,gvar,),RET,.end,C,程序调用汇编程序,DSP C,程序中访问汇编变量和常数,有时要在,C,程序中访问汇编程序定义的,变量,和,常数,,汇编程序中变量和常量的定义有以下三种方法:,在,.,bss,段中定义的变量,不在,.,bss,段中定义的变量,定义的常量,(1),直接在,.,bss,段或,.,usect,段中定义的未初始化变量,第一步:使用,.,bss,或,.,usect,段定义变量,第二步:使用,.global,伪指令定义为外部变量,第三步:在汇编程序中将下划线“,_”,放在变量名之前,第四步:在,C,中将变量说明为外部变量,1.,访问汇编程序定义的变量,C,程序(,mixc21.c,),extern,int,asmfunction,(),;,/*,说明外部的,asm,函数*,/,extern,int,var,;,/*,说明外部变量*,/,int,result;,main( ),int,i=1000;,var,=1000;,/*,说明外部变量*,/,i=,asmfunction,();,/*,调用汇编函数*,/,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,段中定义变量,汇编变量可以在,.,bss,中定义,也可以不在,.,bss,中定义。,C,程序(,mixc22.c,),extern,int,data ,;,/*,这是一个对象*,/,int,*,data_p,=data;,/*,说明指针指向它,*/,int,num;,main( ),num=data_p3;,/*,指针指向数组的第,4,个元素*,/,wait:,goto,wait;,汇编程序(,mixasm22.asm,),.global _data,;,说明外部变量,.sect “.,data:data,_tab”,;,在,.data,段产生一个名为”,data_tab,“,的数据段,_data,:,.word 10,.word 20,.word 30,.word 40,.word 50,C,程序(,mixc23.c,),extern,int,table_size,;,/*,说明为外部的*,/,int,a10,b10;,main( ),int,i;,for(i,=0;i,table_size,;i,+),/*,引用常量*,/,ai,=0;,bi,=0;,for(i,=0;iA,STM A, *(_,gvar,),;A =(,var,),RET,.end,该方法常常应用在,C,程序遇到无法实现的一些硬件控制问题的情况下。而在,C,程序中嵌入汇编语句不但能够有效的解决这些问题,而且在,C,程序的关键部分用汇编语句代替,C,语句可以优化这个程序。编译器将,DSP C,程序中嵌入的汇编语句插入到由编译器产生的汇编语言文件中。,格式:,在汇编语句前加”,t”,然后再加左右双引号,用小括号将语句括住,在括号前加上,asm,标识符。,asm(“t,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( ),int,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,函数都相对应一条汇编指令,并与汇编指令的功能相同。,intrinsics,函数放在头文件,intrindefs.h,中。,4.,利用,DSP C,编译器的内联(,intrinsics,),函数访问汇编语句,C,程序(,mixc41.c),#include,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,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 x5),int,sum;,int,i;,sum=x0;,for(i,=0;i5;i+),sum=,sum+xi,;,return(sum,);,void,main(void,),int,arr5=1,5,10,25,50;,y=sum5(arr);,例,4.16,试编一程序,计算,y=,的值,并找出,4,项乘积 中的最大值。,#include ,math.h,int,a4=1,5,3,4;,int,x4=8,6,7,2;,int,y1,y2;,void,main(void,),int,i,j,;,int,sum4=0,0,0,0;,y1=0;,for(i,=0;i4;i+),sumi,=,ai,*,xi,;/,计算乘积,y1=y1+sumi; /,求和,y2=sum0;,for(j,=0;jy2),y2=,sumj,;,例,4.19,
展开阅读全文