




已阅读5页,还剩94页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
DSP原理与应用TheTechnologyFilename:280 x.hIMR.set0004h;InterruptMaskRegisterIFR.set0006h;InterruptFlagRegister;SystemconfigurationandinterruptregistersSCSR1.set7018h;SystemControlPeripheralInterruptAcknowledgeregister2,;Filename:vector.h.sectvectorsRSVECTBSTART;ResetVectorINT1BGISR1;InterruptLevel1INT2BGISR2;InterruptLevel2INT3BGISR3;InterruptLevel3INT4BGISR4;InterruptLevel4INT5BGISR5;InterruptLevel5INT6BGISR6;InterruptLevel6RESERVEDBPHANTOM;ReservedSW_INT8BPHANTOM;SoftwareInterruptSW_INT9BPHANTOM;SoftwareInterruptSW_INT10BPHANTOM;SoftwareInterruptSW_INT11BPHANTOM;SoftwareInterruptSW_INT12BPHANTOM;SoftwareInterruptSW_INT13BPHANTOM;SoftwareInterruptSW_INT14BPHANTOM;SoftwareInterruptSW_INT15BPHANTOM;SoftwareInterruptSW_INT16BPHANTOM;SoftwareInterruptTRAPBPHANTOM;TrapvectorNMIBNMI;NonmaskableInterruptEMU_TRAPBPHANTOM;EmulatorTrapSW_INT20BPHANTOM;SoftwareInterruptSW_INT21BPHANTOM;SoftwareInterruptSW_INT22BPHANTOM;SoftwareInterruptSW_INT23BPHANTOM;SoftwareInterruptSW_INT24BPHANTOM;SoftwareInterrupt,第2.2.9汇编程序设计-示例文件,.asm文件:程序文件,*FileName:SPI.asm.include280 xA.h.includevector.h.bssGPR0,1;Generalpurposeregisters.bssGPR3,1KICK_DOG.macro;WatchdogresetmacroLDP#00E0hSPLK#05555h,WDKEYSPLK#0AAAAh,WDKEYLDP#0h.endm;MAINCODEstartshere.textSTART:LDP#0SETCINTMSPLK#0h,GPR3OUTGPR3,WSGRCLRCSXMCLRCOVMCLRCCNFLDP#WDCR7SPLK#006Fh,WDCRKICK_DOGLDP#SCSR17SPLK#0020h,SCSR1,第二章:DSP程序设计,第2.1节概述第2.2节DSP汇编语言概述及汇编程序设计第2.3节DSPC语言程序设计第2.4节DSPC与汇编混合编程第2.5节DSP程序烧写习题,第2.3节DSPC语言程序设计,支持ANSIC:提供相应的编译器和优化工具对ANSIC进行了限定和扩展运行库:字符串操作动态地址分配数据转换,第2.3节DSPC语言程序设计,变量和标识:变量和标识符长度100个字符,区分大小写变量和标识符的符号集为ASCII,不支持多字节符号(如汉字)。字符或字符串常量中的16进制ESC码(特殊字符,如0X07)可能会有32位的值。多字符的字符变量最后一个有效,如abc是c数据类型:Size_t(sizeof的结果)定义为unsignedintPtrdiff_t(指针加减结果)定义为int所有的整数类型(char,short,int,以及这些类型的无符号型)都是相同类型,并代表16位的二进制值.Long和unsignedlong代表32位二进制值.,第2.3节DSPC语言程序设计,数据类型:有符号数是用二进制补码表示.数据单元的基础是字(16位),BYTE和WORD一样char是有符号类型,等同于int枚举型(enum)用16位值表示,等同于int浮点类型(float,double)是相同的,遵循TMS320C2x/C2xx/C5x的32位浮点类型.Long和float的数据存储格式为低有效字存储在低地址的方式.Longlong和longdouble是64位的.,第2.3节DSPC语言程序设计,数据类型:,第2.3节DSPC语言程序设计,类型转换:浮点数转为整数为取整截断指针类型(pointer)和int可以自由转换farpointer为22位有效位表达式:有符号整数相除,商符号由两个数共同决定,余数符号同被除数10/-3=-3,余1;-10/3=-3余-1有符号数右移为算术右移,符号位不变,第2.3节DSPC语言程序设计,C访问16位乘法结果的高16位:intm1,m2;intresult;result=(long)m1*(long)m2)16;浮点数:32bitsFPU+,-,比较(,=,PMPAGE0.TEXT:PMPAGE0.BSS:BLK_B2PAGE1.DATA:BLK_B1PAGE1BufferB_sect:SARAM_DPAGE1,第2.3节DSPC语言程序设计,FAST_FUNC_CALL:指明某一函数调用时采用快速函数调用(FFC)机制,而不是使用普通函数调用流程:FFC进栈出栈及函数返回有所不同,调用更快速。#pragmaFAST_FUNC_CALL(func)这类函数返回时的asm代码必须是:LB*XAR7,第2.3节DSPC语言程序设计,FUNC_EXT_CALLED:指明某一未使用的函数,使其不会在C优化时被删除。#pragmaFUNC_EXT_CALLED(func),第2.3节DSPC语言程序设计,INTERRUPT:指明函数为中断处理函数(函数返回机制使用IRP)#pragmaINTERRUPT(func);#pragmaINTERRUPT;#pragmaINTERRUPT(func,HPI|LPI);#pragmaINTERRUPT(HPI|LPI);)FPU有高优先级中断(HPI)和低优先级中断(LPI)处理机制,通过此预编译实现。,第2.3节DSPC语言程序设计,MUST_ITERATE:指明循环必须被执行的次数,以防止循环被优化掉#pragmaMUST_ITERATE(min,max,mult);有时通过空循环建立必须的延时,单在程序优化时会被自动优化掉。例如:For(i=0;iFLASHPAGE0/*initialized*/*Sectionsdeclaredbytheuser*/vectors:VECSPAGE0/*initialized*/,第2.3节DSPC语言程序设计,中断服务函数:中断服务函数类型必须是void。中断服务函数要尽量短小,减少中断服务占用时间,以避免发生中断嵌套或丢中断。多个中断可以共用一个中断服务函数,除了int00。注意IMR、INTM等中断控制量的设置。中断服务函数可能和某些编译选项和优化冲突,需注意协调。,第2.3节DSPC语言程序设计,中断服务函数:中断服务函数可以像其他函数一样访问全局变量、分配局部变量和调用其它函数。进入中断服务函数,编译器自动保护与运行上下文相关的寄存器,并在中断服务函数结束时恢复运行环境。但并不保存所有寄存器中断服务程序可以任意修改不被保护的寄存器,如外设控制寄存器。中断服务函数也可以被其他c程序调用,但效率较差。c_int00是系统保留的复位中断函数,不会被调用,也不需要保护任何寄存器。中断服务函数入口地址放在相应的中断向量处。,第2.3节DSPC语言程序设计,第二章:DSP程序设计,第2.1节概述第2.2节DSP汇编语言概述及汇编程序设计第2.3节DSPC语言程序设计第2.4节DSPC与汇编混合编程第2.5节DSP程序烧写习题,第2.4节DSPC与汇编混合编程,C语言和汇编语言混合编程的四种方法(1)独立编写汇编程序和C程序,分开编译或汇编成各自的目标代码模块,再用链接器将二者链接起来。这种方法比较灵活,但是设计者必须自己维护各汇编模块的入口和出口代码,自己计算传递的参数在堆栈中的偏移量,工作量较大,但是能做到对程序的绝对控制。(2)在C程序中使用汇编程序中定义的变量和常数。(3)在C程序中内嵌汇编语句。这种方法可以实现C语言无法实现的一些硬件控制功能,如修改中断控制寄存器。(4)将C语言编译生成相应的汇编代码,手工修改和优化C编译器生成的汇编代码。采用这种方法可以控制C编译器,从而产生具有交叉列表的汇编程序,而设计者可以对其中的汇编语句进行修改,然后对汇编程序进行编译,产生目标文件。后3种方法由于在C中直接嵌入了汇编语言,易造成程序混乱,破坏C环境,甚至导致程序崩溃,而开发者又很难对不良结果进行预期和有效控制。而如果采用第一种方法,只要遵循有关C语言函数调用规则和寄存器规则,就能预见到程序运行的结果,保证程序正确。,第2.4节DSPC与汇编混合编程,DSPC编译器将存储空间分为两个线性空间:程序存储空间,存储可执行码数据存储空间,存储程序执行过程中的数据和堆栈编译器将存储空间以分段(section)的方式分配和管理。用户以不同的方式分配存储器,可以形成不同的系统配置,连接器将各个段连接在一起形成最终完整的存储器结构。*注意:是由连接器决定存储器影射而不是由编译器。,第2.4节DSPC与汇编混合编程,已初始化的段:,第2.4节DSPC与汇编混合编程,未初始化的段:,汇编自动生成.text,.bss和.data段。C编译器不使用.data段。,第2.4节DSPC与汇编混合编程,用户定义的段:用户使用CODE_SECTION,DATA_SECTION定义的段,如上面的my_sect,BufferB_sect,第2.4节DSPC与汇编混合编程,/*/Linkercommandfilelink.cmd/*/-c/*ROMautoinitializationmodel*/-mexample.map/*Createamapfile*/-oexample.out/*Outputfilename*/main.obj/*FirstCmodule*/sub.obj/*SecondCmodule*/asm.obj/*Assemblylanguagemodule*/lrts25.lib/*Runtimesupportlibrary*/lmatrix.lib/*Objectlibrary*/,MEMORYPAGE0:PROG:origin=30h,length=0EFD0hPAGE1:DATA:origin=800hlength0E800hSECTIONS.textPROGPAGE0.cinitPROGPAGE0.switchPROGPAGE0.bssDATAPAGE1.constDATAPAGE1.sysmemDATAPAGE1.stackDATAPAGE1,第2.4节DSPC与汇编混合编程,系统堆栈:DSP硬堆栈:8级,用于保存函数调用、中断服务函数等的返回地址,也可以用PUSH等保存其他变量C编译器可以生成一定大小的软堆栈:分配局部变量传递函数参数保存处理器状态保存函数返回地址保存临时结果保存寄存器内容,第2.4节DSPC与汇编混合编程,系统堆栈:编译器利用两个辅助寄存器来管理堆栈:SP堆栈指针(StackPointer),指向当前堆栈顶。XAR2帧指针(FP,FramePointer),指向当前帧的起始点,每个函数都会在堆栈顶部建立一个新的帧,用来保存局部或临时变量。C语言环境自动操作这两个寄存器。如果编写用到堆栈的汇编语言程序,一定要注意正确使用这两个寄存器。默认堆栈大小是1k。用-stack连接选项可以指定软件堆栈的大小,用C编写DSP程序一定注意保留足够的堆栈空间!注意:编译器不会检查堆栈溢出情况,堆栈溢出会破坏DSP运行环境,导致程序失败。编写DSP程序和配置DSP存储器资源要注意防止堆栈溢出的发生。,第2.4节DSPC与汇编混合编程,动态内存分配:TMS320C2x/C2xx/C5xC语言可调用malloc、calloc或realloc函数动态申请内存,申请的内存将分配在.sysmem块。动态分配的内存只能通过指针进行访问,动态分配使用后可以释放,这样可以用于其它目的。将大数组通过这种方式来分配可以节省.bss块的空间。通过连接器的-heap选项可以定义.sysmem块。unsignedintdata100;unsignedint*data;data=(unsignedint*)malloc(100*sizeof(unsignedint);,第2.4节DSPC与汇编混合编程,寄存器使用规则:TMS320C2x/C2xx/C5x运行环境对寄存器的使用有严格的要求,编写涉及到寄存器的汇编程序,必须严格遵守这些规则,否则可能造成系统工作异常。寄存器规则规定了编译器如何使用寄存器,和寄存器在函数调用的过程中如何进行保护。寄存器按照保护方式分为两种:调用保存(saveoncall),调用其它函数的函数负责保存这些寄存器的内容。入口保存(saveonentry),被调用的函数负责保存这些寄存器的内容。注:无论是否使用优化编译,都必须遵守这些寄存器规则。,第2.4节DSPC与汇编混合编程,寄存器使用规则:,第2.4节DSPC与汇编混合编程,寄存器使用规则:,第2.4节DSPC与汇编混合编程,状态寄存器使用:,第2.4节DSPC与汇编混合编程,函数调用规则:TMS320C2x/C2xx/C5x运行环境对函数调用有严格的要求,要调用C函数或要被C程序调用的汇编语言程序必须遵守这些规则,否则可能破坏C运行环境,造成程序失败。当进行函数调用时,调用者要将传递参数压入系统堆栈传给被调用的函数,并将函数返回地址压栈。被调用的函数要在函数运行结束时将返回值放在累加器里返回给调用者函数。函数参数及返回地址等都是通过堆栈传递的,要编写汇编函数,必须明确函数调用的过程中堆栈的变化和应该进行的处理,函数调用过程中堆栈情况:,第2.4节DSPC与汇编混合编程,C语言调用函数时的工作:将参数反向压入堆栈(最右端的参数最先压栈,最左端的参数最后压栈),这样,当函数被调用时,最左端的参数会在堆栈的最顶部。使用被调用函数。被调用函数返回前处理各寄存器。当被调用函数运行结束时,调用者函数要将压入堆栈的参数弹出以恢复堆栈状态。注:如果用C程序调用汇编语言程序,C编译器会自动产生代码完成这些工作。,第2.4节DSPC与汇编混合编程,C语言函数被调用时的工作:将返回地址从硬件堆栈弹出,压入软件堆栈。将FP(SP)压入软件堆栈。分配局部帧(Frame)。如果函数中要修改AR6、AR7,将它们压入堆栈,其它寄存器不用进行保护就可以进行修改。实现函数功能。如果函数返回标量数据,将它放入累加器。如果保护了AR6、AR7,恢复这两个寄存器。删除局部帧。恢复FP(SP)。将返回地址从软件堆栈中弹出,压入硬件堆栈。返回。,第2.4节DSPC与汇编混合编程,POPD*+;返回地址从硬堆栈中弹出,压入软堆栈(由AR1指示)SARAR0,*+;AR0(FP)入软堆栈SARAR1,*;AR1(SP)入软堆栈LARKAR0,SIZE;FP=局部帧大小LARAR0,*0+;FP=SP,SP+=SIZE:分配局部帧SARAR6,*+;保存AR6SARAR7,*+;保存AR7.;函数功能部分MAR*,AR1;设置当前AR为AR1MAR*-;LARAR7,*-;恢复AR7LARAR6,*-;恢复AR6SBRKSIZE+1;释放局部帧(恢复AR1(SP)LARAR0,*-;恢复AR0(FP)PSHD*;返回地址压入硬堆栈RET;返回,第2.4节DSPC与汇编混合编程,一些特殊的情况:返回一个结构:当函数的返回值为一个结构时,调用者负责分配存储空间,并将存储空间地址作为最后一个输入参数传递给被调用函数。被调用函数将要返回的结构拷贝到这个参数所指向的内存空间。不将返回地址移动到软件堆栈:当被调用函数不再调用其它函数,或者确定调用深度不会超过8级,可以不用将返回地址移动到软件堆栈。不分配局部帧:如果函数没有输入参数,不使用局部变量,就不需要修改XAR2(FP),因此也不需要对其进行保护。,第2.4节DSPC与汇编混合编程,C与汇编混合:C程序调用汇编函数必须要满足前面介绍的调用规则和寄存器规则,C程序可以访问汇编语言定义的变量或调用汇编语言函数,同样汇编语言也可以访问C程序定义的变量或调用C函数。用C程序调用汇编函数有以下注意事项:所有的函数(不论用C编写还是用汇编语言编写)都必须满足前面介绍的寄存器规则。对于一些寄存器,如果函数要修改其内容,则必须事先对其进行保护。这些寄存器包括:XAR2(FP),SP,AR6,AR7。其它的寄存器可以不用保护自由使用。,第2.4节DSPC与汇编混合编程,注意事项:如果函数改变了状态寄存器某些有假定值的位,则必须在函数结束前恢复其原有值。尤其要注意ARP必须为AR1。中断服务程序必须保护所有其用到的寄存器。long型和float型变量在存储器中的存储方式为低有效位在低端地址。函数返回值要通过累加器进行传递。编译器会在所有对象的名称前面加下横线“_”,因此汇编语言模块定义对象名称时也要以下横线为前缀,才能使定义的对象可以被C代码访问。例如C语言对象x在汇编语言中就是_x。汇编语言可以使用任何不带下横线前缀的变量而不会和C语言对象冲突。任何汇编语言定义的对象,如果要被C程序访问,则必须用.global修饰。同样任何C语言定义的对象,如果要被汇编语言访问,也必须以.global修饰。C和汇编互相调用函数时,需保证参数压栈和出栈的一致性。,第2.4节DSPC与汇编混合编程,第2.4节DSPC与汇编混合编程,C中访问汇编变量:通常有两种方式。1.访问.bss块中的变量:将要访问的变量定义在.bss块中。用.golbal修饰要访问的变量。在汇编语言中以下横线“_”为前缀声明要访问的变量。在C语言中将变量声明为外部变量(extern),就可以进行正常访问。C:externintvar;var=1;asm:.bss_var,a1,a2.global_var,第2.4节DSPC与汇编混合编程,2.访问非.bss块中的变量:一般使用指针查表获得首先定义变量,而且最好放在独立的初始化块中。定义一个全局的标识指向对象的起始点,这样对象可以分配在存储器空间的任何位置。在C程序中将这个对象定义为外部对象(extern),并且对象名称不带下横线“_”前缀,就可以对其进行正常访问。C:externfloatsine;f=sine2;asm:.global_sine_sine:.float0.0.float0.015987.float0.022145,第2.4节DSPC与汇编混合编程,修改C编译器输出的汇编程序程序设计者可以检查和修改C编译器输出的汇编语言程序,然后再对其进行汇编编译和连接。在C语言可以使用内嵌汇编语句在编译输出结果中添加注释,以改善编译器输出汇编程序的可读性。asm(“;thiswillstartADC”);,第2.4节DSPC与汇编混合编程,系统初始化C程序开始运行时,必须首先初始化C运行环境,这是通过c_int00函数完成的,这个函数在运行支持库(rts,runtime-supportlibrary)中。连接器会将这个函数的入口地址放置在复位中断向量处,使其可以在初始化时被调用。c_int00函数进行以下工作以建立C运行环境:为系统堆栈产生.stack块,并初始化堆栈指针。从.cinit块将初始化数据拷贝到.bss块中相应的变量。调用main函数,开始运行C程序。用户可以对c_int00函数进行修改,但
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年教育行业投资并购趋势与教育产业投资策略报告
- 2025年电动汽车电池热管理技术热管理系统创新与新能源汽车市场拓展策略报告
- 2025年工业互联网平台安全多方计算技术在工业互联网安全领域的国际合作与竞争态势报告
- 2025年建筑保温材料行业环保技术创新与应用研究报告
- 转让出租推车合同范本
- 道路维修协议合同范本
- 酒店拖鞋买卖合同范本
- 软件职工劳务合同范本
- 退役军人合法合同范本
- 游泳馆入股合同协议书
- 碳足迹研究-洞察分析
- 空间叙事身体性思考
- 呼吸困难患者的急救与护理
- 燃气热水器安全教育
- 五年(2020-2024)高考地理真题分类汇编专题02(地球运动)+原卷版
- 2024年山东省济南市中考语文试题卷(含答案)
- 【蚂蚁保】2024中国商业医疗险发展研究蓝皮书
- 工作生活平衡总结
- 装配式建筑装饰装修技术 课件 模块五 装配式隔墙
- 药事管理工作制度及操作规程
- JT-T-883-2014营运车辆行驶危险预警系统技术要求和试验方法
评论
0/150
提交评论