1、第四章,汇编语言程序的开发工具,DSP应用系统的设计过程,根据需求写出任务说明书,根据任务书确定技术指标,DSP芯片及外围芯片,总体设计确定软硬件分工,软件设计说明书,硬件设计说明书,软件编程与调试,硬件(.sch / .pcb ),系统集成,硬件调试,系统测试、样机完成、中试、产品测试与生产,硬件系统设计框图,确定硬件方案,器件选型,原理图设计,PCB图设计,硬件调试,系统分析,系统综合,软件设计框图,DSP软件设计步骤,C54x两种编程语言: 汇编语言( *.asm ) C/C+语言(*.c ) 编写C或汇编源程序 经c编译器和汇编器,.c .asm .obj COFF目标文件 经汇编器,
2、.asm .obj COFF目标文件,经链接器,根据链接命令文件(.cmd),将多个.obj文件或库文件链接起来,分配各段地址,生成可执行文件(.out) 用模拟器/仿真器,分析验证.out文件 用格式转换工具,.out .hex文件,并写入EPROM/FLASH中 注:c编译器三个功能:编译,汇编,链接,DSP芯片的开发工具,代码生成工具:将DSP源文件编译汇编并链接成可执行的DSP程序 代码调试工具:对DSP程序及系统进行调试,以达到设计目标 汇编语言程序的编辑、汇编和链接过程(代码生成): 图4.2.1,DSP芯片的开发工具,DSP开发系统(代码调试) 集成开发环境CCS,Simulat
3、or软件仿真器,完成用户程序的非实时调试; 可扩展的开发系统,Emulator硬件仿真器,将PC中用户程序下载到目标系统的存储器中,完成用户程序的实时调试; 硬件开发模块(EVM) 固化用户程序:,说明,TI各类DSP芯片:指令集不同,但编程方式一致 链接命令文件写法一致 语言规则,伪指令,宏用法一致 汇编器,链接器,编译器用法和参数设置一致 硬件仿真器通用,4.3 COFF的一般概念,COFF:公共目标文件格式 编写汇编程序时,采用段sections(代码段,数据段等)的形式,模块化编程方便,程序可移植性大 汇编器和链接器提供一些伪指令来建立和管理各种段,段,段(sections) :指在存
4、储器中占据相邻空间的代码或数据块 每个COFF文件都被分成若干个段 每行汇编语句都从属一个段 一般,COFF文件都包含3种形式的段: .text段:代码段 .data段:已初始化数据段 .bss段:未初始化变量段,两种基本类型的段,三个已初始化段 .text段:存放程序代码 .data段:存放已初始化数据 .sect段:自定义段,存放初始化数据或程序代码 两个未初始化段 .bss段:为未初始化变量保留存储空间 .usect段:自定义段,保留存储空间,汇编器对段的处理,通过段伪指令区别各个段,并将段名相同的语句汇编在一起. 通过5条段定义伪指令:,段定义伪指令格式,P103,P104 格式.te
5、xt.data.sect “段名”.bss 符号,字数 符号 .usect “段名”,字数 符号:该段起始地址的变量名称,段定义举例:,.bss buffer1,10H inbuf .usect “var1”,8 .sect “vector1”LD #123H,A,段伪指令使用举例,段程序计数器:SPC.data coeff .word 044h, 055h, 066h.bss buffer,8 prt .word 0456h .text start: LD #0DH,A,段伪指令使用举例,aloop: SUB #1,ABC aloop,AGEQ .data ivals .word 0CCh,
6、0DDh,0EEh var2 .usect “newvars“,2 inbuf .usect “newvars“,8,段伪指令使用举例,.text LD #0AH,B mloop:MPY #02H,BBC mloop,BNOV.sect “vectors“.word 0044h,0088h,思考:,共定义了几个段?各自的段名是什么?5个段 每个段的长度分别是多少?已初始化段中内容是什么? 例4.3.1:,链接器对段的处理,链接器两个主要功能: P106 链接器有2条伪指令: MEMORY伪指令 SECTIONS伪指令 两个目标文件(*.obj)的链接过程: 图4.3.3,程序装入: 为了运行程
7、序,可执行文件必须传输或装入目标系统存储器中 CCS中LOAD命令 COFF文件中的几个常用符号: .def、.ref、.global 例4.3.3 C54x汇编器的汇编伪指令: P114,4.5 链接器的使用,链接器的输入、输出文件: 图4.5.1 常用链接器选项 -m /-o 文件名、-e 全局符号等 例:-o example.out-m example.map-e start,链接命令文件的编写与使用,链接命令文件的内容:P126 输入文件名 链接器选项 MEMORY和SECTIONS链接伪指令 例: a.obj b.obj -m prog.map -o prog.out,MEMORY链
8、接伪指令,定义存储器配置 存储器各部分命名 规定起始地址和长度 该命令的一般句法: PAGE 0: 程序存储器 PAGE 1: 数据存储器 例4.5.2,SECTIONS链接伪指令,将各输出段定位到所定义的存储器。 SECTIONS命令的任务: 该命令一般句法: Load allocation .text: PRAM PAGE 0 .text: PRAM PAGE 0 .text: load=PRAM PAGE 0 .bss: align=0x80 PAGE 1 例4.5.1,链接器命令文件举例,vectors.obj example.obj -o example.out -m example
9、.map -e start,o,MEMORY PAGE 0:PROG: origin=8000h length=0100hVECS: org=0ff80h len=0040hPAGE 1:DATA1: origin=0060h length=0020hDATA2: origin=0080h length=0100h ,SECTIONS .text: PROG PAGE 0 .data: PROG PAGE 0.vectors: VECS PAGE 0.bss: DATA1 PAGE 1.stack:DATA2 PAGE 1.heap:DATA2 PAGE 1 ,说明,PAGE 0: .text
10、,.data和.sect定义的段 PAGE 1: .bss和.usect定义的段; 以及.stack和.heap段; 或.data段,说明,存储器分配的原则 该DSP芯片的存储器结构组织 用户编写的汇编(或C)源程序:自定义的段,各段的大小 对同一DSP芯片,该命令文件的内容变化不大,其他常用伪指令,.mmregs:定义MMR的符号名 .word 数1,数2 .float 数1,数2 .def 符号名:当前文件中定义,可被其他文件使用,其他常用伪指令,.ref 符号名:其他文件中定义,在本文件中使用 .global 符号名(.def和.ref之和) .set 符号名:定义常量符号 .title
11、 “源程序名” .end:程序段结束,4.5.6 多个文件的链接实例,两个源文件 example和vectors 伪指令: 段定义: .usect, .bss, .data, .text, .sect 其他:.title, .mmregs, .def, .ref, .end 共定义了几个段?各自段名?是已初始化段或未初始化段?各段应定位在程序存储器还是数据存储器?,链接命令文件的编写: 例4.5.4 堆栈的使用方法:,堆栈的用法,支持软件堆栈:用户指定存储区作为堆栈存储器,由SP指向。 用法:size .set 64Hstk .usect “.stack”, sizeSTM #stk+size,SP ; SP指向栈底,本章重点,软件设计步骤 段伪指令的使用 链接命令文件的编写 堆栈的用法 本章作业: 2,3,5,8 将4.5.6节的例子在电脑上调试,