资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,DSP,技术讲义,,2007,,陈军波,电子信息工程学院,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,DSP,技术讲义,,2007,,陈军波,电子信息工程学院,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,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,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,精选课件ppt,*,*,Click to edit Master title style,Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,DSP,技术讲义,,2010,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,精选课件ppt,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,精选课件ppt,*,*,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种类型的常数(常量)。,数据类型,举 例,说 明,二进制,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,31,精选课件ppt,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,精选课件ppt,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,33,精选课件ppt,链接器主要完成以下功能,:,将程序中的各段按目标系统存储器配置表,(.cmd),进行分配,;,给符号和段安排最终地址,完成重定位操作,;,在输入文件之间辨认没有定义的外部符号引用。,链接器的使用,lnk500-option,例,:,lnk500 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=0 x0080 length=0 xFF00,PAGE1:DATA:origin=0 x0080 length=0 xFF80,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,command,告诉档案管理器如何处理库,option,告诉档案管理器如何运行,libname,归档库名,默认扩展名(,.lib),独立文件名(,.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,具体用法可参考,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,第三部分,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 BUFSIZE;,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*)0 x1d;,asm(“t SSBX INTM“);,/*INTM=1*/,asm(“t STM 0 x08C0 PMST”);,*pmst|=(unsigned int),asm(“t STM 0 x0100 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,此课件下载可自行编辑修改,供参考!,感谢您的支持,我们努力做得更好!,
展开阅读全文