第三章软件开发基础工信部十二五规划教材《DSP控制器原理与应用技术》编写组第3章软件开发基础3.1软件开发流程3.2汇编程序开发基础3.3C/C++程序开发基础3.4C/C++和汇编混合编程3.5集成开发环境及其应用3.6基于示例模版的驱动程序开发一、软件开发流程图3.1软件开发流程二、软件开发步骤3.1软件开发流程1.编制源程序(1)汇编语言:速度快,效率高,直接控制硬件底层资源。(2)C语言:通用性、可移植性好(3)混合编程2.产生可执行代码C工具:C编译器(C→汇编)汇编工具:汇编器(Assembler):汇编文件→COFF目标文件连接器(Linker):COFF文件→可执行模块;3.调试代码4.固化代码3.2.1寻址方式与指令系统一、寻址方式(1)直接寻址——访问数据空间的低4M字C28x模式:16位DP+6位偏移量=22位有效物理地址C2xLP模式:9位DP+7位偏移量=16位有效物理地址。(a)AMODE=0(C28x寻址模式)MOVWDP,#VarA;VarA所在页面装载DPADDAL,@VarA;将VarA的值加至AL3.2汇编程序开发基础(2)堆栈寻址——可访问数据空间的低64K低64K字作为软件堆栈,由堆栈指针SP给出。三种方式:*-SP[6bit]、*SP++和*SP--ADDAL,*-SP[5];将(SP-5)堆栈单元的16位内容加到AL中MOV*SP++,AL;将16位AL的内容压入堆栈,且SP=SP+1ADDAL,*SP--;将16位内容弹出并加至AL中,且SP=SP-1一、寻址方式(3)间接寻址——可访问4G字的数据空间操作数地址指定:32位辅助寄存器XAR0~XAR7工作寄存器指定:C28x:直接在指令中给出;C2xLP:由辅助寄存器指针ARP指定。五种方式:*XARn++、*--XARn、*+XARn[AR0]、*+XARn[AR1]和*+XARn[3bit]。一、寻址方式(3)间接寻址——可以访问整个4G字的数据空间MOVLACC,*XAR2++;将XAR2所指向存储单元的内容装入ACC,之后XAR2+2MOVLACC,*--XAR2;将XAR2-2,然后将XAR2所指向存储单元的内容装入ACCMOVLACC,*+XAR2[AR0];将(XAR2+AR0)所指向存储单元的内容装入ACCMOVLACC,*+XAR2[AR1];将(XAR2+AR1)所指向存储单元的内容装入ACCMOVLACC,*+XAR2[5];将(XAR2+5)所指向存储单元的内容装入ACC一、寻址方式(4)寄存器寻址:直接访问寄存器的内容32位寻址:ACC、P、XT、XARn等16位寻址:AL、AH、PL、PH、TH、T和ARn等MOVL@ACC,XT;32位寄存器寻址,将XT寄存器的内容装入ACCADD@AH,AL;16位寄存器寻址,AH=AH+AL(5)数据/地址/IO空间立即寻址方式(6)程序空间间接寻址方式。一、寻址方式3.2.1寻址方式与指令系统语法:操作码目的操作数,源操作数操作码:指示处理器所要执行的操作;操作数:指示指令执行过程中所需数据(或其地址)。例如:ADDACC,#16位常数{0-16};将16位常数移位后加至ACCADDBACC,#8位常数;将8位常数加至ACCADDLACC,loc32;将“loc32”指定单元的32位数加至ACC二、指令系统三、混合编程时常用汇编指令总结一、段(Section)三个默认段:.text,.data,.bss段分为两大类:初始化段,未初始化段。1.初始化段(包含程序代码和数据).text段:包含可执行代码.data段:包含已初始化的数据.sect段:.sect伪指令创建的自定义段2.未初始化段.bss段:为未初始化的变量保留空间.usect段:.usect伪指令创建的自定义段3.2.2公共目标文件格式CommonObjectFileFormat简称COFF3.2.2公共目标文件格式二、汇编器对段的处理汇编器根据伪指令识别程序各部分。将汇编程序内容分门别类归入各个段。三、连接器对段的处理(1)建立可执行的COFF输出模块(2)为输出模块选择存储器地址(定位)。MEMORY伪指令:定义目标存储器映像(分块,块起始地址及长度);SECTIONS伪指令:组合输入段以及定位输出段。1.MEMORY伪指令语法MEMORY{PAGEn:name[attr]:origin=const,length=const}PAGE——存储空间。0:程序存储器,1:数据存储器。name——存储区名称。origin——起始地址。length——长度,。2.SECTIONS伪指令语法SECTIONS{name:[property,property,…]}运行的位置。语法:run=allocation或runallocation加载的位置。语法:load=allocation或loadallocation或allocation3.连接器命令文件连接时可编写一个通用的连接器命令文件模板:MEMORY:定义存储器及其地址;SECTIONS:将各输出段定位到相应存储区。MEMEORY{PAGE0:/*程序空间*/ZONE0:origin=0x004000,length=0x001000/*XINTFzone0*/RAML0:origin=0x008000,length=0x001000/*on-chipRAMblockL0*/……}SECTIONS{/*分配程序区域:*/.cinit:FLASHAPAGE=0.pinit:FLASHA,PAGE=0.text:FLASHAPAGE=0……}3.2.4汇编程序设计一、汇编伪指令1.定义段的伪指令伪指令语法功能描述.text.text将其后的源语句汇编至.text(代码)段.data.data将其后的源语句汇编至.data(数据)段.sect.sect“段名”将其后源语句汇编至“段名”规定的段内.bss.bss符号,字长在.bss段内保留字长(字数).usect符号.usect“段名”,字长在未初始化自定义段“段名”中保留字长2.初始化常数的伪指令.space位长(在当前段内保留位长,并填0).word数值列表(将一个或者多个16位初始化数值存放在当前段内连续个存储单元中。)(1)语法:.include“文件名”功能:通知汇编器从指定文件读取源语句。(2)语法:.def/.ref/.global符号名列表.def(定义):在当前模块定义而在其它模块中引用.ref(引用):在当前模块引用而在其它模块中定义.global(全局):可以是以上2种情况3.引用其它文件的伪指令二、示例文件例3.2(10+2)的汇编语言程序代码*.global_main.text_main:MOVACC,#10MOVT,#2ADDACC,T3.3.1TMS320x28xxC/C++优化编译器1、C/C++编译器支持ANSIC和ISO/IET14882-1998C++:能将标准ANSIC/C++程序转换成相应的汇编程序。3.3C/C++程序开发基础C编译器中包含了运行支持库(.lib)。2、代码的优化优化目的:提高程序执行速度,缩减程序代码。优化操作:简化循环、软件流水线操作、重组语句或简化表达式,变量重定位等优化等级:0、1、2、3、4数字越大,优化等级越高。一、C语言数据类型1.变量和标识符:3.3.2C/C++编程基础2.数据类型二、C语言关键词1.interrupt关键字作用:定义中断服务程序(中断函数)。voidinterrupt函数名(){}2.ioport关键字作用:定义C中访问IO端口空间的端口变量。ioport类型标示符端口编号端口编号为16进制表示的I/O端口的绝对地址。C28xI/O空间与存储空间统一,故不使用该关键字。3.volatile关键字作用:避免变量被优化。通知编译器每次访问被声明变量时均需从其地址读取。4.register关键字作用:定义寄存器变量,以加快访问速度。二、C语言关键词5.cregister关键字作用:在C中直接访问IER和IFR。例如:externcregistervolatileunsignedintIER;IER|=0x0100;volume=4.0/3.0*PI*radius*radius*radius6.inline关键字作用:定义可直接插入被调用处的短小函数。inlineintvolume_sphere(floatr){retrurn4.0/3.0*PI*r*r*r;}volume=volume_sphere(radius);7.const关键字作用:保护变量或数组的值不被改变。8.far关键字作用:指定22位长度的指针。intfarsym;/*声明sym位于远内存,为far类型的变量*/#pragma告诉预处理器怎样对待函数三、#pragma预编译器指令1.CODE_ALIGN作用:为某一段程序指定特定的代码存储边界,以保证某函数代码存于特定位置。#pragmaCODE_ALIGN(func,constant)#pragmaCODE_ALIGN(constant)constant必须是2的幂次,以保证内存边界2.CODE_SECTION:作用:为某一段程序指定特定的代码存储段,以便单独分配存储空间作用:为某一段数据指定特定的数据存储段,以便单独分配存储空间。#pragmaDATA_SECTION(symbol,“section_name”)为变量symbol在“section_name”段内分配空间,可将其定位至.bss以外的空间例:#pragmaDATA_SECTION(bufferB,“BufferB_sect”)charbufferB[512];3.DATA_SECTIONSECTIONS{BufferB_sect:{}RAML4PAGE1}4.INTERRUPT作用:指明函数为中断处理函数5.FAST_FUNC_CALL作用:允许在C/C++中直接调用汇编编写的函数。调用时采用快速函数调用(FFC)机制。调用更快速。函数返回时的asm代码是:LB*XAR76.FUNC_EXT_CALLED作用:保证程序执行期间未调用的函数不被优化掉。混合编程中,可用于防止汇编调用的函数被优化掉。7.MUST_ITERATE作用:指明循环必须执行的次数,以防止循环被优化掉。语法:四、中断处理方法中断处理方法:使用中断服务函数。中断函数定义方法:以c_intd(d为数字)为名称定义(c_int00保留)利用关键字interrupt定义利用#pragma指令INTERRUPT定义中断服务程序使用规则:①中断服务程序无参数。②调用效率极低。③某中断提供中断服务程序时,必须将其地址赋给相应中断向量。3.4.1C/C++编译器运行环境一、C系统堆栈作用:存放局部变量,传递函数参数,保存处理器状态、函数返回地址、中间结果和寄存器值。管理:硬件堆栈指针SP、辅助寄存器XAR2。SP:堆栈指针,指向当前栈顶XAR2:帧指针,指向当前帧的起始地址。局部帧:每调用一次函数,在当前栈顶产生一个新的帧,用来存放局部变量和中间值。二、寄存器使用规则两种寄存器变量:保护调用环境,保护入口环境。3.4C/C++和汇编混合编程三、函数调用规则(1)传递参数;①优先通过寄存器传递;②剩余参数进栈(2)返回地址(原RPC)进栈(3)分配局部帧:为被调用函数分配存储空间1.父函数执行操作①通过寄存器传递参数规则。(a)头4个浮点参数存放于寄存器R0H~R3H;(b)64位参数第一个放ACC和P;(c)32位参数第一个放ACC;(d)指针型参数存放于XAR4和XAR5;(e)16位参数的存放顺序为:AL、AH、XAR4、XAR5。②其它参数以逆序压入堆栈。32位参数在堆栈中从偶地址开始存放。结构体变量仅传递地址。③父函数使用LCR指令调用子函数。2.子函数的响应①返回值的处理:16位整型数存放于AL,32位整型数存放于ACC,②子函数使用LRET