DSP软件开发ppt课件.ppt_第1页
DSP软件开发ppt课件.ppt_第2页
DSP软件开发ppt课件.ppt_第3页
DSP软件开发ppt课件.ppt_第4页
DSP软件开发ppt课件.ppt_第5页
已阅读5页,还剩75页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

DSP技术 04TMS320C54xDSP软件开发 DSP技术 DSP汇编语言程序设计 DSP汇编程序开发工具 DSP高级C语言程序设计 DSP程序设计与开发 第一部分DSP汇编语言程序设计 汇编语言程序以 asm为扩展名 可以用任意的编辑器编写源文件 一条语句占源程序的一行 汇编器每行最多读200个字符 因此 语句的执行部分必须限制在200个字符以内 4 1 1汇编语言源程序格式 源文件格式 助记符指令源语句的每一行通常包含4个部分 标号区 助记符区 操作数区和注释区 标号 助记符 操作数 注释 助记符指令语法格式 例 助记符指令源语句举例 NANHU set1 符号NANHU 1Begin LD NANHUA AR1 将1加载到AR1 标号 助记符 操作数 注释 4 1 2汇编语言中的常数与字符串 汇编器可支持7种类型的常数 常量 4 2堆栈的使用方法 1 堆栈的设置 size set120stack usect STACK sizeSTM stack size SP 在数据RAM空间开辟一个堆栈区 在RAM中定义一个STACK的保留空间 共120个单元 设置堆栈指针 stack size SP 保留区的高地址赋给SP 作为堆栈的栈底 若程序中要使用堆栈 必须先进行设置 如 设置好堆栈后 就可以使用堆栈了 如 CALLpmad SP 1 SP PC 2 TOS pmad PCRET TOS PC SP 1 SP 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结束程序有关伪指令更详细的内容见TMS320C54xAssemblyLanguageToolsUser sGuide TexasInstrumentsInc June2001 宏语言 宏 用户定义的能被用作指令的程序 汇编器支持宏语言 使用户可以建立自己的 指令 当程序要将特定的任务执行若干次时 尤其有用 宏的使用 DAT0 set60hDAT1 set61hDAT2 set62hDAT3 set63h textADD3 macroX1 X2 X3 X SUMLDX1 AADDX2 AADDX3 ASTLA X SUM endm ST 0020h DAT0ST 0030h DAT1ST 1140h DAT2ADD3DAT0 DAT1 DAT2 DAT3NOP end 例 计算y 程序 example asm title example asm mmregsSTACK usect STACK 10h bssa 4 bssx 4 bssy 1 defstart data 为堆栈指定空间 为变量分配9个字的空间 table word1 2 3 4 word8 6 4 2 textstart STM 0 SWWSRSTM STACK 10h SPSTM a AR1RPT 7MVPDtable AR1 CALLSUMend Bend 变量初始化 插入0个等待状态 设置堆栈指针 AR1指向a 移动8个数据 程序存储器到数据存储器 调用SUM子程序 续上表 SUM STM a AR3STM x AR4RPTZA 3MAC AR3 AR4 ASTLA yRET end 子程序执行 续上表 第二部分DSP汇编程序开发工具 TMS320C54x提供2种编程语言 汇编语言和C C 语言 对于完成一般性功能的代码 这2种语言都可以使用 但对于一些运算量很大的关键代码 最好采用手工编写的汇编语言来完成 TMS320C54x提供有2种开发环境 非集成的开发环境和集成开发环境CodeComposerStudio 简称CCS CCS在WINDOWS操作环境下运行 集成了非集成开发环境的所有功能 并扩展了许多其他功能 汇编语言程序的编辑 汇编和链接过程 示意图 4 4COFF的一般概念 汇编器和链接器生成的目标文件 是一个可以由 C54x器件执行的文件 这些目标文件的格式称之为公共目标文件格式 COFF 在编写汇编语言程序时 COFF采用代码段和数据段的形式 以便于模块化的编程 使编程和管理变得更加方便 这些代码段和数据段简称为段 汇编器和链接器提供一些伪指令来建立和管理各种各样的段 4 4 1COFF文件的基本单元 1 段 sections 段是COFF文件中最重要的概念 每个目标文件都分成若干段 所谓段 是指存储器中占据相邻空间的代码或数据块 一个目标文件中的每个段都是分开的和各不相同的 COFF目标文件都包含以下3种形式的段 text段 文本段 通常包含可执行代码 data段 数据段 通常包含初始化数据 bss段 保留空间段 通常为未初始化变量保留存储空间 2 段的基本类型 COFF目标文件中的段有两种基本类型 初始化段 未初始化段 1 初始化段 初始化段中包含有数据或程序代码 主要有 text段 已初始化程序段 data段 已初始化数据段 sect段 已初始化段 由汇编器伪指令建立的自定义段 2 未初始化段 在存储空间中 为未初始化数据保留存储空间 它包括 bss段 未初始化段 usect段 未初始化段 由汇编命令建立的命名段 自定义段 3 段与目标存储器的对应关系 汇编器的任务 在汇编过程中 根据汇编命令用适当的段将各部分程序代码和数据连在一起 构成目标文件 链接器的任务 就是分配存储单元 将目标文件中的段重新定位到目标系统的不同存储器中 这一过程称为定位或分配 目标文件中的段与目标存储器之间的关系 bss data text RAM E2PROM ROM 4 4 2汇编器对段的处理 汇编器对段的处理是通过段伪指令来区别各个段的 并将段名相同的语句汇编在一起 汇编器有5条伪指令可识别汇编语言程序的各个段 bss usect text data sect 定义未初始化段 定义未初始化段 定义已初始化段 定义已初始化段 定义已初始化段 经汇编后 得列表文件 部分 2 3 汇编一个初始化表到 data段 4 50000 data600000044coeff word044h 055h 066h00010055000200667 8 在 bss段中为变量保留空间 9 100000 bssbuffer 811 12 仍然在 data段中 13 1400030456prt word0456h 50000 data 600000044coeff word044h 055h 066h 100000 bssbuffer 8 1400030456prt word0456h data 6 0044 6 0055 6 0066 10 bss 没有数据保留8个字 14 0456 15 16 汇编代码到 text段 17 180000 text190000100dadd LD0Dh A200001f010aloop SUB 1 A00020001210003f842BCaloop AGEQ00040001 22 23 汇编另一个初始化表到 data段 24 250004 data26000400ccivals word0CCh 0DDh 0EEh000500dd000600ee27 28 为更多的变量定义另一个段 29 300000var2 usect newvars 2310001inbuf usect newvars 8 text 180000 text 190000100dadd LD0Dh A 19 100d 200001f010aloop SUB 1 A 20 f010 20 0001 210003f842BCaloop AGEQ 21 f842 21 0001 250004 data 26000400ccivals word0CCh 0DDh 0EEh data 26 00cc 26 00dd 26 00ee 300000var2 usect newvars 2 newvars 30 保留2个字 310001inbuf usect newvars 8 31 保留8个字 32 33 汇编更多代码到 text段 34 350005 text360005110ampy LD0Ah B370006f166mloopMPY 0Ah B0007000a380008f868BCmloop BNOV00090006 39 40 为中断向量 vectors定义一个自定义段 41 420000 sect vectors 4300000044 word044h 088h00010088 350005 text text 360005110ampy LD0Ah B 36 110a 370006f166mloopMPY 0Ah B 37 f166 37 000a 380008f868BCmloop BNOV 38 f868 38 0006 420000 sect vectors vectors 4300000044 word044h 088h 43 0044 43 0088 链接器主要完成以下功能 将程序中的各段按目标系统存储器配置表 cmd 进行分配 给符号和段安排最终地址 完成重定位操作 在输入文件之间辨认没有定义的外部符号引用 链接器的使用lnk500 option 例 lnk500 olink 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 x0080length 0 xFF00PAGE1 DATA origin 0 x0080length 0 xFF80 SECTIONS SECTIONS伪指令 text PAGE 0 data PAGE 0 cinit PAGE 0 bss PAGE 1 有关链接命令文件更详细的内容见1 TMS320C54xAssemblyLanguageToolsUser sGuide TexasInstrumentsInc June2001或参考2 TMS320C54xDSP应用程序设计与开发 刘益成 北京航空航天大学出版社 2002 链接命令文件的编写 链接命令文件 example cmd a objb objc obj 输入文件名 oprog out 输出out文件 mprog mapMEMORY MEMORY伪指令 RAM origin 0100hlength 0100hROM origin 0100hlength 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 afunctionsinecosflt 绝对列表器 绝对列表器是一个调试工具 它将链接后的目标文件作为输入文件 创建扩展名为 abs的文件作为输出 abs文件显示目标代码绝对地址的列表 启动绝对列表器的命令 abs500 option input file具体用法可参考TMS320C54xAssemblyLanguageToolsUser sGuide TexasInstrumentsInc June2001 交叉引用列表器 交叉引用列表器也是一种调试工具 链接后的可执行文件作为交叉引用列表器的输入文件 其输出文件为交叉引用列表文件 xrf 此列表文件列出可执行文件中符号 符号的定义及它们的引用情况 启动交叉引用列表器的命令 xref500 option inputfile output 具体用法可参考TMS320C54xAssemblyLanguageToolsUser sGuide TexasInstrumentsInc June2001 十六进制转换公用程序 C54x汇编器 链接器产生COFF可执行文件 COFF文件是TI公司的二进制格式文件 便于模块化编程和提供灵活 方便的代码管理及存储空间管理 但是 大多数EPROM编程器不接收COFF格式文件 因此TI公司提供了一个将COFF文件格式转化为Intel Tektronix Motorola S ASCII hex等文件格式的公用程序 启动十六进制转换程序的命令 hex500 option 第三部分 DSP高级C语言程序设计 TMS320C54xC C 编译器支持ANSI AmericanNationalStandardsInstitute 开发的C C 语言标准 C语言开发的优点 1 便于阅读 维护 交流 2 编程更为容易 不是特别精通汇编语言的开发人员也可以编写 3 便于分工合作完成子模块的编写 以及由子模块到大系统的搭建 4 便于移植到C55 C2000 C6000等DSP系统中 TMS320C54xC编译器支持的关键词 1 const volatile关键词用来控制数据对象的存储分配 const定义的常数被分配在ROM中 关键词volatile定义的数据分配在RAM中 例如定义ROM表constintdigits 0 1 2 3 4 5 6 7 8 9 例如定义RAM中的一个指向无符号整型的指针volatileunsignedint ctrl 2 ioport关键词用来访问TMS320C54x器件的I O端口空间格式 ioporttypeporthex numioport指示这是一个端口变量的关键词 type 类型 必须是char 字符 short 短整数 int 整数 或无符号的变量 porthex num指端口编号 hex num变量为十六进制数 例 声明I O端口为无符号端口10h 将a写到端口10h 然后将端口10h读进b ioportunsignedport10 访问I O端口10h的变量 intfunc port10 a 将a写到端口10h b port10 将端口10h读进b 端口变量的使用对赋值没有限制 端口变量可像其他变量一样用在表达式中 a port10 b 读端口10h 加上b 结果赋给a prot10 a 读端口10h 加上a 结果写到端口10h 3 interrupt关键词用来指定将函数作为中断函数处理 当C代码被中断时 中断程序必须保存所有寄存器的内容 中断函数的主体可具有局部变量并可自由使用堆栈 interruptvoidint handler unsignedintflags C int00是C C 的进入点 为系统复位中断保留 该中断程序初始化系统并调用函数main interruptdoublecompute area doubleradius doublearea PI radius radius printf nArea f area returnarea ISR不能返回一个值 ISR不能传递参数 C编译器不允许在ISR中做浮点运算 下面是一个错误的程序 面向DSP的C程序设计准则 面向DSP的C程序设计基本原则 C程序不但需要对数据流进行编程 也要对时序机制进行编程 通用PC的C程序大量数据集中式处理数据流处理非实时直观的输入 输出设备 运行结果无需借助其他设备数据来源可由软件仿真产生 或通过计算机接口从外部获取 数据可集中处理 面向DSP的C程序极少数据的实时处理数据流 时序处理实时性输入 输出为映射在存储空间的数据 结果显示需借助示波器 逻辑分析仪等设备数据从A D获得 由于DSP存储容量的限制 数据需实时处理 实例 include include hello h defineBUFSIZE30structPARMSstr 2934 9432 213 9432 main voidmain ifdefFILEIOinti charscanStr BUFSIZE char BUFSIZE size treadSize FILE fptr endif writeastringtostdout puts helloworld n 续上表 ifdefFILEIO clearchararrays for i 0 i BUFSIZE i scanStr i 0 deliberatesyntaxerror i 0 readastringfromstdin scanf s scanStr openathehostandwritechararray fptr fopen w fprintf fptr s scanStr fclose fptr 续上 openathehostandreadchararray fptr fopen r fseek fptr 0L SEEK SET readSize fread sizeof char BUFSIZE fptr printf Reada dbytechararray s n readSize fclose fptr endif CCS下的运行结果 汇编语言与C C 混合编程 C语言开发DSP程序可读性和可移置性强 同时使用C编译器的优化功能可以增强编程的效率 而汇编程序比较精练 运行效率高 为了提高程序的开发效率 通常用到汇编语言与C C 混合编程的方法 特别是用C程序不能深入底层访问硬件寄存器时 可以调用汇编语句来完成一些硬件访问 独立的DSPC语言和汇编接口在DSPC程序中访问汇编变量和常量在DSPC程序中直接嵌套汇编语句利用DSPC编译器的内联 intrinsics 函数访问汇编语句 独立的DSPC语言和汇编接口 在DSPC和汇编程序相互访问过程中 为了在访问之后返回时程序不出错 需要保护一些特定的寄存器 因此 要求DSPC与汇编程序接口时必须遵循一定的寄存器规则 这些规则包括有 1 必须保护正在运行的函数所用到的几个特定的寄存器 例如AR1 AR6 AR7及SPPUSH AR7 将AR7压入堆栈 CALL c int3 调用C函数 AR7 POP 将AR7弹出堆栈 2 在中断服务子程序执行前 必须保存所有正在使用的寄存器 PUSH PMST 将PMST压入堆栈 CALLISR 调用中断服务程序 PMST POP 将PMST弹出堆栈 3 函数有值返回时 返回值在累加器A中 4 所有在DSPC中定义的变量 数组等表示符 在汇编程序引用时 都要在表示符的前面加上下划线 5 在汇编程序和C程序中同时使用的变量或函数 要在汇编程序和C程序中同时说明为外部的 这样链接器才能识别 C程序 mixc11 c externintasmfunction 说明外部的asm函数 externintgvar 说明外部变量 intresult main inti 200 i asmfunction 调用汇编函数 result gvar 5 10 汇编程序 mixasm11 asm global gvar 说明外部变量 global asmfunction data 为汇编变量分配地址 gvar word100 定义变量 text asmfunction LD 0 A A 0ADD gvar A gvar A ASTLA gvar A gvar RET end C程序调用汇编程序 DSPC程序中访问汇编变量和常数 有时要在C程序中访问汇编程序定义的变量和常数 汇编程序中变量和常量的定义有以下三种方法 在 bss段中定义的变量不在 bss段中定义的变量定义的常量 1 直接在 bss段或 usect段中定义的未初始化变量第一步 使用 bss或 usect段定义变量第二步 使用 global伪指令定义为外部变量第三步 在汇编程序中将下划线 放在变量名之前第四步 在C中将变量说明为外部变量 1 访问汇编程序定义的变量 C程序 mixc21 c externintasmfunction 说明外部的asm函数 externintvar 说明外部变量 intresult main inti 1000 var 1000 说明外部变量 i asmfunction 调用汇编函数 result var 2 100 wait gotowait 汇编程序 mixasm21 asm bss var 10 为变量var留出10个字的空间 global var 说明外部变量 global asmfunction text asmfunction LD 1000 A A 1000ADD var A var A ASTLA var A var RET end 2 不在 bss段中定义变量汇编变量可以在 bss中定义 也可以不在 bss中定义 C程序 mixc22 c externintdata 这是一个对象 int data p data 说明指针指向它 intnum main num data p 3 指针指向数组的第4个元素 wait gotowait 汇编程序 mixasm22 asm global data 说明外部变量 sect data data tab 在 data段产生一个名为 data tab 的数据段 data word10 word20 word30 word40 word50 C程序 mixc23 c externinttable size 说明为外部的 inta 10 b 10 main inti for i 0 i table size i 引用常量 a i 0 b i 0 for i 0 i table size i 引用常量 a i i 10 10 b i a i wait gotowait 2 访问汇编程序常数DSPC程序访问在汇编程序中定义的常数有两种方法 其一是利用 set和 global伪指令定义汇编程序外部常量 其二是利用连接器分配语句在链接命令文件中定义他们 汇编程序 mixasm23 asm table size set10 定义常量 global table size 定义为全局 链接命令文件 mix23 cmd table size 10 定义常量 或 3 在汇编程序中访问DSPC程序变量和常量 C程序 mixc25 c externintasmfunction 说明外部的asm函数 externintgvar 定义变量 main inti 0 gvar 100 i asmfunction 调用汇编函数 汇编程序 mixasm25 asm global asmfunction global gvar 说明外部变量 text asmfunction LD 1000 AADD gvar A gvar A ASTMA gvar A

温馨提示

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

评论

0/150

提交评论