DSP教案4(编程基础)讲课用.ppt

上传人:xin****828 文档编号:19957006 上传时间:2021-01-18 格式:PPT 页数:48 大小:347.51KB
返回 下载 相关 举报
DSP教案4(编程基础)讲课用.ppt_第1页
第1页 / 共48页
DSP教案4(编程基础)讲课用.ppt_第2页
第2页 / 共48页
DSP教案4(编程基础)讲课用.ppt_第3页
第3页 / 共48页
点击查看更多>>
资源描述
第四章 DSP编程基础 主要内容 TMS320C54x软件开发过程 汇编语言程序的编写 COFF的一般概念 汇编语言程序的编辑、汇编和链接 汇编语言程序设计举例 一、 软 件 开 发 流 程 图 二、汇编语言程序的编写 在文本编辑器( Editor)中编写满足 C54x汇 编器( Assembler)格式要求的汇编源程序。 用汇编器汇编该源文件,如果源文件中调用 了宏,汇编器还会到宏库中搜索该宏。 汇编之后生成格式为公共目标文件格式 ( COFF, Common Object File Format)的 目标文件( .obj),称为 COFF目标文件。 用链接器( Linker)链接目标文件,如果包 含可运行支持库和目标文件库,链接器还会 到所保护的库中搜索所需要的成员。 汇编语言程序的编写(续) 链接之后生成可执行的 COFF执行文件 ( .out) 。 COFF执行文件下载到 C54xDSP中执行 , 同时也可借助调试工具 ( Debugging Tool) 对程序进行跟踪调试或优化 , 也 可利用交叉参考列表器 ( Cross-reference Lister) 和绝对列表器 ( Absolute Lister) 生成一些包含调试信息的表 。 1、汇编语言源程序句法 汇编语言源程序的每一行都可以由四部分组 成,句法如下: 标号 : 助记符 操作数 ;注释 2、例子: * * lab1.asm y= a1*x1+a2*x2+a3*x3+a4*x4 * * .title lab1.asm .mmregs STACK .usect STACK,10h ;分配堆栈空间 .bss a,4 ;给变量分配空间 .bss x,4 .bss y,1 .def start .data table: .word 1,2,3,4 ;数据流 .word 8,6,4,2 .text ;以下为程序码流 start: STM #0,SWWSR ;adds no wait states STM #STACK+10h,SP ;设置堆栈指针 STM #a,AR1 ;AR1 指向 a RPT #7 ;重复 8次 MVPD table,*AR1+ ;从程序存储器到数据 CALL SUM ;调用 SUM 子程序 end: B end SUM: STM #a,AR3 ;子程序进行重复加法 STM #x,AR4 ; RPTZ A,#3 MAC *AR3+,*AR4+,A STL A,y RET .end 3、句法解释 标号 : 供本程序的其他部分或其他程序调用 。 标号是 任选项 , 标号后面可以加也可以不加冒号 “ : ” 。 标 号必须从第一列写起 , 但第一个字母不能以数字开头 。 引用标号时 , 标号的大小写必须一致 。 助记符 :助记符指令 、 汇编指令 、 宏指令和宏调用 。 作为助记符指令 , 一般用大写;汇编命令和宏命令 , 以 句号 “ .”开始 , 且为小写 。 操作数 :指令中的操作数或汇编命令中定义的内容 。 操作数之间必须用逗号 “ , ” 分开 。 注释 :注释从 “ ; ” 开始 , 可以放在单独的一行或数 行 。 注释是任选项 。 ( 如果注释是从第一列开始 , 也 可以用 “ *” 号 。 ) 4、常用的汇编命令伪指令 汇编命令 作 用 举例 .title 紧跟其后的是用双引号 括起的源程序名 .title example.asm .end 结束汇编命令 放在汇编语言程序的最后 .text 紧随其后的是汇编语言 程序正文 例子中 .text 段是源程序正 文 。 经汇编后 , 紧随 .text后 的是可执行程序代码 .data 紧随其后的是已初始化 数据 有两种数据形式 .int 和 .word 常用的汇编命令伪指令(续) .int .int 用来设置 16 位无符号整形量 常数 .word .word 用来设置 16位带符号整形 量常数 table: .int 1,2,3,4 .word 8,6,4,2 表示在程序存储器标号为 table 开始 的 8个单元中存放初始化数据 1,2,3,4,8,6,4和 2 . bss 为初始化变量保 留存储空间的自 定义段 .bss x,4 表示在数据存储器中空出 4 个存储单元存放变量 x1, x2, x3和 x4 常用的汇编命令伪指令(续) .sect 建立包含代码和 数据的自定义段 .sect vectors定义向量表 。 紧随其后的是复位向量和中断 向量 , 名为 vectors .usect 为初始化变量保 留存储空间的自 定义段 STACK .usect STACK ,10h 在数据存储器中留出 16个单元 作为堆栈区 , 名为 STACK 5、 COFF 数据型式 型 式 举 例 二进制 1110001b 或 1111001B 八进制 226q 或 572Q 十进制 1234 或 +1234或 -1234 (缺省型) 十六进制 0A40h 或 0A40H 或 0 xA40 浮点数 1.623e-23仅 C语言程序中能用,汇编 语言中不能用) 字符 D 字符串 this is a string 三、 COFF的一般概念 TMS320C54x的汇编器和链接器都会生成 公共 目标文件格式 ( COFF, Common Object File Format) 的目标文件 。 在本章中 , 将汇编 器生成的文件称为 COFF的目标文件 , 将链接 器生成的文件称为 COFF执行文件 。 目前 , COFF目标文件格式已被广泛使用 , 因为它支 持模块化 ( 段 ) 编程 , 能够提供有效灵活的管 理代码段和目标系统 ( Target System) 存储空 间的方法 。 1、 COFF文件中的段 段 ( section) , 就是在存储器图中占据相 邻空间的代码或数据块 。 每个目标文件都分成 若干个段 , 一个目标文件中的每一个段都是分 开的和各不相同的 。 COFF目标文件都包含以 下三种形式的段: .text 段 ( 此段通常包含可执行代码 ) .data段 ( 此段通常包含初始化数据 ) .bss 段 ( 此段通常为未初始化变量保留存储空间 ) 已初始化段: 已初始化段中包含有数据或程序代 码 。 .text段和 .data段都是已初始化段 。 用 .sect命令建立 的段也是已初始化段 。 未初始化段: ( .bss和 .usect) 仅仅是用于在存储空 间中保留空间 , 并没有代码或数据 , 所以未初始化段只 有段头 , 而没有原始数据 、 重定位信息和行号等 。 另外 , 如果程序中没有使用缺省的段 ( .text, .data和 .bss) , 那么它们在 COFF文件中也没有原始数据 、 重定位信息 和行号等 , 因为它们的原始数据长度为零 。 汇编器在汇编过程中 , 根据汇编命令用适当的段将各部 分程序代码和数据连在一起 , 构成目标文件 。 2、段的分类 3、段的顺序 汇编器在将汇编源程序汇编成 COFF目标文件时 , 将按 “ .text、 .data、 用户自定义初始化段 、 .bss、 用户自定 义的未初始化段 ” 的顺序将各段放入生成的 COFF文件 中 。 因为未初始化段 ( .bss和 .usect) 仅仅是用于在存储空间 中保留空间 , 并没有代码或数据 , 所以未初始化段只有 段头 , 而没有原始数据 、 重定位信息和行号等 。 另外 , 如果程序中没有使用缺省的段 ( .text, .data和 .bss) , 那么它们在 COFF文件中也没有原始数据 、 重定位信息 和行号等 , 因为它们的原始数据长度为零 。 如果源程序不止一个 , 汇编器在汇编时 , 会将每个程序 的段按如下方式放置: .text1, .text2, .text3, .data1, .data2, .data3, .bss1, .bss2, .bss3等 。 C54X汇编工具的使用 C54X的源程序可以使用汇编或 C语言 编写。使用汇编语言是可以使用助 记符指令集( Mnemonic Instruction Set) 或代数指令集 ( Algebraic Instruction Set), 但两 种不能混用。 汇编语言的编辑、汇编和链接 目标文件中段与存储器之间的关系 上例中的目标代码图 输入段组合成可执行的目标文件 默认的存储器分配过程: File1.obj .text1 .data1 .bss1 table_1 (初始化的命名段 ) u_vars1 (未初始化的命名段 ) File2.obj .text2 .data2 .bss2 table_2 (初始化的命名段 ) u_vars2 (未初始化的命名段 ) FFT (初始化的命名段 ) 程序存储器 数据存储器 .text .text1 .text2 .data .data1 .data2 .bss .bss1 .bss2 table table_1 table_2 u_vars1 u_vars1 u_vars2 FFT FFT 没有使用 没有配置 没有配置 没有使用 输入段组合成可执行的目标文件 文件之间的链接 两种指令的汇编语言比较 low_pass_mac: push(st1) ; pshm st1 push(st0) ; pshm st0 push(ar0) ; pshm ar0 push(bk) ; pshm bk ar2 = data(#t_ar2) ; mvdm #t_ar2,ar2 ar3= data(#t_ar3) ; mvdm #t_ar3,ar3 ar0 = #1 ; stm #1,ar0 bk = #N ; stm #N,bk *ar3+% = a ; stl a,*ar3+% repeat(#(N-1),a=0 ; rptz a,#(N-1) a+= *ar2+0% * *ar3+0% ; mac *ar2+0%,*ar3+0%,a ASM500命令格式如下: asm500 input file object file listing file -options input file: 汇编源文件名,缺省后缀为 .asm object file: 编译输出的 OBJ文件名 ,缺省后缀 为 .obj listing file: 产生的列表文件名 ,缺省后缀 为 .lst options: 编译器使用的各种选择。常用选项 有: -c: 若使用该选项,编译器忽略字母的大小写。例 如 abc与 ABC是一样的。系统缺省为区分大小写。 -i: 设置搜索路径。通知编译器在指定的搜索 路径中去查找 .copy,.include中的文件。 用法举 例: -ic:c54x。 -l: (小写的 L)在编译时产生列表文件,缺省 后缀为 .lst -mg: 汇编源程序使用代数指令集 或在源代码 中使用 . Algebraic -s: 将所有的符号都放入符号表。若不使用该 选项,编译器仅将全局变量放入符号表。 -v: 指定版本。特别是需要使用 BOOTLOADER时,应加 -v548开关 。 先看两个汇编源程序: file1.asm .global test loop: call test bc loop,ageq .end file2.asm file3.asm .global test .global test test : test: mar *ar3+ mar(*ar3+) add #1,a a=a+#1 ret return .end .end 汇编工具 ASM500的使用举例 asm500 file1.asm asm500 file2 -l asm500 file3 -mg -l TMS320C54x COFF Assembler Version 1.20 Sun Jul 30 12:11:25 2000 Copyright (c) 1997 Texas Instruments Incorporated file2.asm PAGE 1 1 .global test 2 3 000000 test: 4 000000 6D93 mar *ar3+ 5 000001 F000 add #1,a 000002 0001 6 000003 FC00 ret 7 8 .end No Errors, No Warnings TMS320C54x COFF Assembler Version 1.20 Sun Jul 30 12:21:26 2000 Copyright (c) 1997 Texas Instruments Incorporated file3.asm PAGE 1 1 .global test 2 3 000000 test: 4 000000 6D93 mar(*ar3+) 5 000001 F000 a=a+#1 000002 0001 6 000003 FC00 return 7 8 .end No Errors, No Warnings C54X汇编语言书写规范 语法: label: 指令 操作数 ;注释 #前缀表示立即数或直接地址 后缀 B或 b表示二进制常数 例如: LD #1000B, A 后缀 Q或 q表示八进制常数 例如: LD #10Q, A 十进制常数 例如: LD #1000, A C54X汇编语言书写规范 后缀 H或 h表示十六进制常数 例如: LD #1000H, A 使用 .set定义一个符号的值 例如 addr .set 1000h stm #addr, ar0 标号的使用 例如 b loop loop: ssbx intm 使用 .global 定义全局标号 C54X汇编语言书写规范 使用符号 $表示当前 PC值 例如 B $ 可以使用结构 例如 item .struct .int value .int deltat _len .endstruct . array .tag item .bss array, i_len C54X汇编语言书写规范 可以定义宏 例如 mypush .macro pshm ah pshm al pshm bh pshm bl endm 二 .C54X连接工具的使用 使用 LNK500命令可以将一个或多个 OBJ 文件连接为一个 .OUT文件。在连接时, 可以通过段定位控制命令将不同的代码、 数据写入不同的内存单元。 注意: LNK500生成的 OUT文件不是纯 二进制代码文件,而是包含代码、符号 表、代码定位信息的复合文件。 LNK500的使用格式: lnk500 -options filename 1 . . filename n 使用举例: lnk500 file1.obj file2.obj -o file.out LNK500命令常用的选项有: -e global_symbol: 定义程序的进入点。 global_symbol必须在源程序中使用 .global命 令说明。 -c: 使用 C编译器的 ROM初始化模式。 -cr: 使用 C编译器的 RAM初始化模式 。 -i dir : 指定库文件的路径。 -l filename: 指定连接时使用的库文件名。 -m filename: 生成 MAP文件 。 -o filename: 指定生成的 OUT文件名。系统缺省为 a.out。 将文件 file1.asm和 file2.asm连接成 OUT文 件: lnk500 file1 file2 -m file.map -o file.out 通过查看 MAP文件可以获得变量、子程 序等符号的具体地址。注意: MAP文件 只列出全局变量的地址。(用 .global说 明的符号) 三 .汇编链接工具对段的处理 为了灵活使用 C54X的内存,可以将不同的代 码段放入不同的内存中。在汇编源程序中可以 使用下列指令 : .bss 该指令表示在 .bss段中保留空间。 用 法: .bss symbol,size .usect 该指令表示在指定的段中保留空间。用 法: symbol .usect “section name”,size .text 将代码或数据放入 .text段中 .data 将数据放入 .data段中 .sect 将代码或数据放入指定的段中。 用法: symbol .sect “section name”,size 在链接时使用相应的控制命令以确定具 体的内存地址。下面给出其中一种方法: 其中, .bss, .text, .data 三个段是标准定 义,而 .vect, .buffer是自定义的。 (t.cmd) MEMORY PAGE 0: PROG: origin = 1800h, length = 800h PAGE 4: PROG: origin = 0200h, length = 100h PAGE 1: DATA: origin = 0c00h, length = 100h PAGE 2: DATA: origin = 0d00h, length = 200h PAGE 3: DATA: origin = 0f00h, length = 100h SECTIONS .text PROG PAGE 0 .vect PROG PAGE 4 .bss DATA PAGE 1 .data DATA PAGE 2 .buffer DATA PAGE 3 链接命令文件 .cmd lab1.obj -o lab1.out -m lab1.map -e start MEMORY PAGE 0: EPROM: org = 0E000h, len =100h PAGE 1: SPRAM: org = 0060h, len =0020h DARAM: org = 0080h, len = 100h SECTIONS .text : EPROM PAGE 0 .vect : EPROM PAGE 0 .bss : SPRAM PAGE 1 STACK : DARAM PAGE 1 lab.map TMS 320 C54x COFF Linker Version 1.10 Fri May 28 09: 48: 59 2002 OUTPUT FILE NAME: ENTRY POINT SYMBOL: start address:0000e000 MEMORY CONFIGURATION name origin length attributes fill PAGE 0: EPROM 0000e000 000000100 RWlX PAGE 1: SPRAM 00000060 00000O020 RWlX DARAM 00000080 000000100 RWlX SECTION ALLOCATION MAP output attributes/ section page origin length input sections .text 0 0000e000 00000016 0000e000 00000016 lab.obj(.text) .data 1 0000e016 00000008 00000080 00000008 lab.obi(.data) .bss 1 00000060 00000009 UNINITIALIZED 00000060 00000009 lab.obj (.bss) STACK 1 00000080 00000010 UNINITIALIZED 00000080 00000010 lab.obi (STACK) .xref 0 00000000 00000074 COPY SECTION 00000000 00000074 lab.obj(. xref) GLOBAL SYMBOLS address name address name 00000060 .bss 00000060 .bss 0000e016 .data 00000069 end 0000e000 .text 0000e000 start 0000e01e edata 0000e000 .text 00000069 end 0000e016 etext 0000e016 etext 0000e016 .data 0000e000 start 0000e0le edata 7 symbols 下面是例子程序 t.asm的一部分,其中红色部分为段的定义 .bss temp,1 buf .usect .buffer,10 .sect .vect start: b mainstart nop nop b $ .text mainstart: ssbx intm ; disable all interrupt ! 编译连接程序 exer.asm,通过 MAP文件 检查各个段是否装入指定的内存地址。 LNK500的选项可以放入内存定位文件中。 如 user.cmd,这时使用连接命令可以简 化为: lnk500 user.cmd
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


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

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


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