【文档说明】DSP_C语言程序设计课件.ppt,共(81)页,4.775 MB,由小橙橙上传
转载请保留链接:https://www.ichengzhen.cn/view-44616.html
以下为本文档部分文字说明:
第6章C/C++语言程序设计6.1C55XC/C++语言概述6.2C55XC/C++语言编程基础6.5C语言与汇编语言的混合编程6.5.1在C语言中直接嵌入汇编语言6.5.2C语言调用汇编模块的接口补充:TIDSP软件开发平台
汇编语言依赖于计算机硬件,程序的可读性和可移植性比较差。一般高级语言具有很好的可移植性,但是难以实现汇编语言的某些功能(如对内存地址的操作、位操作等)。C/C++语言作为一种高级语言,既可以访问物理地址又可以进行位操作,能直接对硬件进行操作,适合用作DSP开发语言。6.1.1C
/C++语言概况6.1C55XC/C++语言概述6.1.2C55xC/C++语言概况C55xC/C++编译器全面支持ANSIC/C++语言标准,能够把按照标准ANSIC/C++规范编写的源程序进行全面优化,编译成C55x汇编语言源程
序。C55xC/C++编译器工具拥有完整的实时运行库,所有的库函数均符合ANSI库标准。6.2.1C语言中的数据类型C55x支持下列数据类型包括字符、定点数、浮点数、指针等。6.2C55XC/C++语言编程基础类型长度内容最小值最大值signed
char(有符号字符)16位ASCII码-3276832767unsignedchar(无符号字符)16位ASCII码065535short,signedshort(短整型)16位二进制补码-3276832767unsignedsho
rt(无符号短整型)16位二进制数065535类型长度内容最小值最大值int,signedint(整型)16位二进制补码3276832767unsignedint(无符号整型)16位二进制数065535long,signedlong(长整型)32位二进制补码2147483
6482147483647unsignedlong(无符号长整型)32位二进制数04249967295longlong(40位长整型)40位二进制补码549755813888549755813887un
signedlonglong(40位无符号长整型)40位二进制数01099511627775emum(枚举型)16位二进制补码3276832767float(浮点型)32位32位浮点数1.175494e383.40282346e+38类型长度内容最小值最
大值double(双精度浮点数)32位32位浮点数1.175494e383.40282346e+38longdouble(长双精度浮点数)32位32位浮点数1.175494e383.40282346e
+38大存储器模式23位二进制数00x7FFFFFpointers(程序指针)24位二进制数00xFFFFFF6.2.1C语言中的数据类型6.2.2关键字1.constC55xC编译器支持标准C语言的const关键字。将这个关键字使用到对任意变量或数组的定义上可以确保它们的值不改变
。如果定义一个对象为const,那么const段就会为该对象分配存储空间。使用const关键字可以定义大常数表并将它们分配到系统ROM中。6.2C55XC/C++语言编程基础•例:6.2.2关键字int*constp=&x;co
nstint*q=&x;定义指向变量int的常量指针p定义指向常量int的变量指针q2.ioport关键字1.ioport关键字可以用在数组、结构、联合以及枚举类型当中。2.当用在数组中时,ioport限制的数组单元而非数组类型本身;3.ioport类型只能用来声明全局或静态变量,如果在
本地变量中使用ioport类型,则变量必须用指针声明。6.2.2关键字注意:例,ioport关键字的使用。ioportintkvoidfoo(void){ioportintiioportint*j}6.2.2关键字;
/*正确*/;/*错误*/;/*正确*/例:定时器初始化例程•voidTIMER_init(void)•{•ioportunsignedint*tim0;•ioportunsignedint*prd0;•ioportunsi
gnedint*tcr0;•ioportunsignedint*prsc0;•tim0=(unsignedint*)0x1000;•prd0=(unsignedint*)0x1001;•tcr0=(unsignedint*)0x1002;•prsc0=(unsignedi
nt*)0x1003;•*tcr0=0x04f0;•*tim0=0;•*prd0=0x0ffff;•*prsc0=2;•*tcr0=0x00e0;•}3.interrupt关键字关键字“interrupt”----定义中断函数注意:1.当C/C++代码被中断时,中
断程序必须保存所有与程序有关的寄存器。2.当使用“interrupt”关键字定义函数时,中断函数必须返回空并且没有参数传递。3.中断函数可以定义本地变量并且使用堆栈。4.c_int00是C/C++程序的入口点,这个函数名被系统复位中断保留,该中断服务程
序用来初始化系统并调用main函数。关于中断的几个要点:④中断服务程序不能被普通C代码调用。②关键字例:中断服务程序VoidINTR_init(void){IVPD=0xd0;IVPH=0xd0;IER0=0x10
;DBIER0=0x10;IFR0=0xffff;asm("BCLRINTM");}interruptvoidtimer(){...}③无参数①设置中断寄存器IER0⑤保存中断入口的现场信息(所用寄存器或全部寄存器)⑧通过.sect指令创建中断向量表。.s
ect".vectors".ref_c_int00.ref_timerrsv:B_c_int00NOP.align8nmi:.loop8nop.endloopint0:.loop8nop.endloopint2:B_timernop.align8tint:B_t
imernop.align8…⑥在汇编语言中,中断程序名前加下划线,如_timer。关于中断的几个要点:⑦中断处理程序可以处理单个中断或多个中断,c_int00除外⑨保存中断入口的现场信息(所用寄存器或全部寄存器)onchip关键字---定义的指针所指向的数据在片上内存
例:用onchip定义数组和指针onchipintx[100];/*arraydeclaration*/onchipint*p;/*pointerdeclaration*/4onchip关键字6.2.2关键字volatile----存储器访问定义格式:register变量类型变量名变量
类型:整型、浮点型和指针类型register6.2.4asm指令----插入一条汇编指令指令格式:asm(“assemblertext”);main(){inti;unsignedintuWork;while(
1){for(i=0;i<256;i++){ADCCTL=0x8000;asm("nop");}}}例:6.2.5pragma指令•#defineNX64•#defineNH64•#pragmaDATA_S
ECTION(db,".dbuffer")•DATAdb[NH+2];•#pragmaDATA_SECTION(x,".dbuffer")•#pragmaDATA_SECTION(r,".dbuffer"
)•DATAx[NX],r[NX];例:Pragma指令告诉编译器的预处理器如何处理函数。必须在函数体外确定pragma,且必须出现在任何声明、定义或对函数和符号引用之前。否则,编译器会输出警告。C55xC编译器支持如下pragma指
令:CODE_SECTIONC54X_CALLC54X_FAR_CALLDATA_ALIGNDATA_SECTIONFUNC_CANNOT_INLINEFUNC_EXT_CALLEDFUNC_IS_PUREFUNC_IS_SYSTEMFUNC_NEVER_RETURNSFUNC_NO_GLOBA
L_ASGFUNC_NO_IND_ASGMUST_ITERATEUNROLLCODE_SECTION指令及其用法语法:#pragmaCODE_SECTION(func_name,”section_n
ame”)作用:把C函数func_name的代码配置到由section_name定义的程序段中语法:#pragmaDATA_SECTION(var_name,”section_name”)作用:var
_name是包含在C函数内的变量名称,该指令将数据var_name配置到由section_name定义的数据段中DATA_SECTION指令及其用法例:#pragmaCODE_SECTION(funcA,“codeA”)intfuncA(inta){inti;return(i=a);}编
译后的结果如下:.sect“codeA”.global_funcA;*******************************************;*FUNCTIONNAME:_funcA*;**************************
******************_funcA:return;返回例:#pragmaDATA_SECTION(bufferB,“my_sect”)charbufferA[512];charbufferB[512];编译后的结果如下:.global_bufferA.bss_bu
fferA,512.global_bufferB_bufferB:.usect“my_sect”,5126.2.7存储器模式与分配编译器支持两种存储器模型:小存储模式大存储器模式链接器不允许同时存在大存储器模式和小存储器模式。下列
段必须在长度为64K字的同一个段内:.bss段和.data段(存放静态和全局变量).stack和.sysstack段(系统堆栈).system段(动态存储空间).const段长度和位置都不受限制的段:.text(代码段),.switch(状态转化段).cinit/.pin
it(变量初始化段);1.小存储器模式(默认模式)大存储器模式下可以更加方便地存放数据,而不必过多地考虑数据页的限制。在该模式下,数据指针为23位,而堆栈和系统堆栈必须放在同一页中;代码段可以跨越页边界以外;除代码段外的其他所有的段只能放在一页存储
器之中,但不同的段可以放在不同的页内。2.大存储器模式3.存储器分配1.C编译器生成的段C编译器生成的段:初始化段和未初始化段初始化段有:.cinit段,包含初始化数据表格和常数.pinit段,包含实时运行时调用的数据表格.const段,包含用const定义(不能同时被
volatile定义)的字符串常量和数据.switch段,包含switch语句所用表.text段,包含所有可执行代码¤汇编器生成了.data段,但C编译器并不使用这个段。未初始化段:.bss段,为全局和静态变量保留了空间。.stack段,为C系统堆栈分配存储地址。这个存储地址用来传递变
量和局部存储.sysstack段,为第二系统堆栈分配存储地址.sysmem段,为动态存储分配保留空间。这个空间被malloc、calloc和realloc函数调用。.cio段,支持CI/O。这个空间用来作为标签为_CIOBUF_缓冲区。.cio段必须放在链接器命令文件中
才能使用CI/O。3.存储器分配初始化段功能存储器类型未初始化段功能存储器类型.text可执行代码ROM/RAM.bss为全局和静态变量保留空间RAM.cinit初始化数据表和常数ROM/RAM.stack为C系统堆栈分配存储地址RAM.const用const
定义的常量ROM/RAM.sysstack为第二系统堆栈分配存储地址RAM.switchswitch语句所用表ROM/RAM.sysmem为动态存储分配保留空间RAM.dataC编译器并不使用ROM/RAM.cio支持CI
/ORAM.pinit实时运行时调用的数据表格ROM/RAM6.2.11.系统初始化_c_int00_c_int00函数执行如下工作来初始化C环境:①建立堆栈和第二系统堆栈②从.cinit段中复制数据到.bss段来初始化全局变量③调用main函数开
始执行C程序。七、系统初始化•.cinit段中的全局和静态变量的数据。•在标准ANSIC语言中,没有显式初始化的全局和静态变量必须在程序执行前设置为0。1.变量的自动初始化2.全局构建器(GlobalConstructors)链接器则将各输入文件中的
.pinit段链接成一个单一的.pinit段,启动程序将使用这个表来运行这些构建器。.pinit段构建器1地址构建器2地址构建器3地址构建器n地址3.初始化表(InitializationTables).cin
it段中的表中包含可变大小的初始化记录。每个必须被自动初始化的变量在.cinit段中都有一条记录。数据长度.bss段中的变量指针存储器空间指示初始化数据初始化记录.cinit段初始化记录1初始化记录2初始化记录3初始化记录n4.运行时间
变量初始化在运行时间自动初始化是自动初始化的默认模式。为使用这种模式,可采用链接器的-c选项。采用这种方法,.cinit段随着所有其它初始化段被装载到存储器(通常为ROM)中,全局变量在运行时间被初始化。链接器定义了一个叫做
cinit的特殊符号,用以指向存储器中初始化表的起始地址。当程序开始运行时,C启动程序从cinit指向的表中复制数据到.bss段中的特定变量中。这使得初始化数据能被存储到ROM中,并在每次程序开始执行时复制到RAM中。图6-3
运行时间变量自动初始化过程.cinit段初始化表(ROM)装载器.bss段引导程序存储器cinit目标文件(RAM)¤这种方法适用于应用程序烧入在ROM中的系统。5.装载时间变量初始化在装载时间自动初始化变量会减少
启动时间并节省被初始化表使用的存储器,从而改善了系统性能。用-cr链接器选项可以选择这种模式。当使用-cr选项时,链接器置位在.cinit段头的STYP_COPY位,这样装载器就不会把.cinit段
装载到存储器中(.cinit段不占用存储器空间)。链接器置cinit符号为–1(通常cinit指向初始化表的起始地址),告诉启动程序存储器中没有初始化表,因此在启动时不进行初始化。为在装载时间内实现自动初始化,装载器必须能够执行如下工作:检查目标文件中.cini
t段是否存在保证STYP_COPY在.cinit段头中被置位,这样就不会复制.cinit段到存储器中去理解初始化表格式.cinit段装载器.bss段存储器目标文件(RAM)图6-4装载时间变量自动初始化过程6.5C55xC和汇编语言混合编程•6.5.1概述•6.5.2C/C++中的寄存器规则
•6.5.3函数结构和调用规则•6.5.4C和汇编语言的接口6.5.2.寄存器规则寄存器保存者用途AC0,AC1,AC2,AC3父函数16,32或40位数据,或24位代码指针(X)AR0~(X)AR4父函数16或23位指针,或16位
数据(X)AR5~(X)AR7子函数16位数据T0,T1父函数T2,T3子函数ST0,ST1,ST2父函数ST3父函数RPTC父函数CSR父函数寄存器保存者用途BRC0、BRC1父函数BRS1父函数BSA0、
REA1父函数SPSSPPCRETA子函数CFCT子函数6.5.2.寄存器规则状态寄存器作为标志DSP运行状态的寄存器在运行中起着重要的作用,表4-3介绍了各状态寄存器各字段的作用、默认值以及是否可以修改。ST0-55字段名称默认值编译器是否修改ACOV[0~3]溢出标志是C
ARRY进位标志是TC[1~2]检验、控制标志是DP[7~15]数据页寄存器否6.5.2.寄存器规则6.5.2.寄存器规则ST1-55字段名称默认值编译器是否修改BRAF快重复标志否CPL编译标志1否XF外部标志否HM保持标志否INTM中断标志否M40运算模式0当为40位运算时
可修改SATD报和标志0是SXMD符号扩展模式1否C16双16位运算模式0否FRCT小数模式0是54CMC54x兼容模式0在调用C54x子函数可修改ASM累加器移位模式否6.5.2.寄存器规则ST2-55字段名称
默认值编译器是否修改ARMS辅助寄存器间接寻址模式1否DBGM调试模式否EALLOW仿真访问使能否RDM舍入模式0否CDPLCCDP指针线性/循环状态0否AR[0~7]LCAR[0~7]线性/循环状态0否6.5.2.寄存器规则ST3-55字段名称默认值编译器是否修改CAFRZ缓冲冻
结否CAEN缓冲使能否CACLR缓冲清零否HINT主机中断否CBERR总线错误标志否MPNMC微处理器/微机模式否SATA饱和模式(A单元)0是CLKOFFCLKOUT关闭否SMUL乘法饱和模式0是SST存储饱和模式否6.5.3函数结构和调用规则1.函数调用规则(1)将所要传
递到子函数的参数放入寄存器或堆栈。如果一个函数的变量用一个省略号声明(标志参数的数量是变化的),则剩余的参数跟着最后一个被声明的参数被传到堆栈,而堆栈的地址将作为访问其他未声明参数的索引。1.函数调用规则编译器对参量分类,有3类:•数据指针(int*,long*等)•1
6位数据(char,short,int)•32位数据(long,float,double,函数指针)(1)将所要传递到子函数的参数放入寄存器或堆栈。参数类型寄存器分配顺序对应的数据类型16或23位数据指针(X)AR0,(X)AR1,(X)AR2,(
X)AR3,(X)AR4数组,字符串,指针或占用空间超过2字节长的结构体16位数据T0,T1,AR0,AR1,AR2,AR3,AR4(无符号)字符,短整数,整数32位数据AC0,AC1,AC2长整数,浮
点数和长度不大于2个字节的结构体如果参数的数量超过可使用寄存器数量,多余的参数会被压入堆栈,子函数通过堆栈得到剩余参数。1.函数调用规则(1)将所要传递到子函数的参数放入寄存器或堆栈。(2)子函数保存所有的入口保存寄存器(T2、T3、AR5~AR7)。父函数必须通过压入堆栈来保存其它在调用
后会用到寄存器的值。(3)父函数对子函数进行调用。短数据T0长数据AC0数据指针(X)AR0结构体父函数在本地堆栈中分配相应大小的空间。父函数将该空间地址作为第一个隐含参量传送给子函数,这个参数被看成一个数据指针。(4)父函数收集返回值。1.函数调用规
则例,寄存器参量传递规则structbig{longx[10];};structsmall{intx;};T0T0AC0AR0intfn(inti1,longl2,int*p3);AC0AR0T0T1AR1longfn(int*p1,inti2,inti3,
inti4);AR0AR1structbigfn(int*p1);T0AR0AR1intfn(structbigb,int*p1);AC0AR0structsmallfn(int*p1);T0AC0AR0in
tfn(structsmallb,int*p1);T0stackstack...intprintf(char*fmt,...);AC0AC1AC2stackT0voidfn(longl1,longl2,longl3,longl4,inti5)
;AC0AC1AC2AR0AR1voidfn(longl1,longl2,longl3,int*p4,int*p5,AR2AR3AR4T0T1int*p6,int*p7,int*p8,inti9,inti10);子函数执行代码保护
入口寄存器(T2,T3,AR5-AR7)为局部变量等分配存储空间收集返回值函数参数传递恢复保护的寄存器(T2,T3,AR5-AR7)释放堆栈函数返回2.被调用函数(子函数)的响应6.5.4C和汇编语言的接口C代码和汇编语言代码混合使用方法:在C源代码中直接嵌入汇编语言。在C源
代码中使用汇编语言函数、变量和常数。使用几个独立的汇编代码模块,并将它们与编译了的C模块进行链接.1.嵌入汇编语言注意:千万注意不要破坏C语言操作环境。不要从内嵌asm汇编语句调转到C语言模块中。不要在内嵌asm汇编语句中
改变C语言模块中变量的值,但可以安全地读取它们的值。不要使用内嵌asm汇编语句插入汇编器指令来改变汇编环境。指令格式:asm(“assemblertext”);例:asm(“BCLRINTM”)2.在C代码中访问汇编语言函数(a)C
程序:externintasmfunc(int,int*);/*声明汇编函数*/intgvar;/*定义全局变量*/main(){inti;i=asmfunc(i,&gvar);/*调用函数*/}(b)汇编程序:.global_asmfunc_asmfunc:ADD*AR0,T0,T0;T0+g
var=>i,i=T0RET;•在定义汇编函数时,在函数名前加下划线“_”.•声明为外部函数3:在C代码中访问汇编语言变量①访问.bss段或.usect段中没有初始化的变量:使用.bss或.usect指令来定义变量使用.globa
l指令来定义为外部变量在汇编语言中的变量前加下划线“_”在C代码中声明变量为外部变量并正常地访问它(b)C程序:externintvar;/*外部变量*/var=1;/*使用变量*/(a)汇编语言程序:.bssvar,1;定义变量.gloabalvar;声明变量为外部变量
②非.bss段中变量访问-定义指向该变量的指针定义变量声明一个指向该变量起始地址的全局指针在C程序中,必须先声明该对象为extern型。3:在C代码中访问汇编语言变量(a)汇编程序:.global_sine.sect”sine_tab”
_sine:.float0.0.float0.015987.float0.022145(b)C程序:externfloatsine[];float*sine_p=sine;f=sine_p[2];4.在C语言中
访问汇编语言常数使用.set和.global指令定义汇编语言全局常数。使用&运算符来取值。(a)汇编语言程序:_table_size.set10000;定义常量.global_table_size;定义该常量为全局常量例:(b)C语言程序:externinttable_
size;#defineTABLE_SIZE((int)(&table_size))……For(i=0;i<TABLE_SIZE;++i)C和汇编语言的接口注意:(1)如果用汇编语言编写中断例程,则需要保存在中断例程中使用的所有寄存器。(2)如果在汇编程序中调用C/C++函
数,则只有特定的寄存器在C/C++中被保存,而其他寄存器则可能被C/C++函数改变。(3)编译器所默认的CPL值为1,即采用间接、绝对方式寻址,如果在汇编函数中CPL被设置为0,在函数返回时应当把这个值改为1。例:利于混合编程的方式实现y=a+
b,主程序用C实现,子函数asmf采用汇编语言,已知a,b,y均为整数。•主程序:Main(){}inta,intb;inty;a=3;b=5;y=asmf(a,b);externintasmf(inta,intb);•汇编源程序:.global_asmf.text_asmf
:addT1,T0,T0RET习题:•利于混合编程的方式实现已知主程序如下,请将汇编源程序补充完整。40iiixayMain(){}inta[nb]={2,3,4,5};intx[nb]={1,2,3,4};inty;
y=asmf(&a,&x,nb);externlongasmf(int*,int*,int);•主程序:•汇编源程序:.global_asmf.text_asmf:….…..RET#definenb5;P249作业•3,4,5,6,7,9,10小结:软件开发过程•第一步,分析任
务需求并用高级语言写出软件流程。–写流程可以采用编写“伪代码”的方式完成。可以清楚地定义信号的处理机制,并为今后程序的调试和扩展预先留好接口。在流程描述中,可以将每一个关键的处理环节用函数(或直接用语言描述)来表示,确定软件的框架。•第二步,根据第一步的工作写主流
程的C或者汇编程序。整个工作过程可以充分参照例子工程做。•第三步,细化主流程程序,按功能编写每一个函数。•第四步,完成中断服务程序的编写。•第五步,编写链接用cmd命令文件,确定汇编程序中各段代码和数据摆放的位置。通
常情况下,程序放置在SARAM内,而数据放置在DARAM。•注意程序的编制需强调程序的模块化、常量的符号化、变量名有意义等软件工程的基本要素。在汇编级编程的时候,需要做汇编语句级的优化。小结:软件开发过程•软件组成:由代码和数据组成•运行:要运行
的程序其代码和数据必须存放在CPU的存储空间•存放:以代码块和数据块的形式存放––代码块和数据块是程序的最小单元––一个代码块或数据块在存储空间中连续、顺序存放––不同的代码块或数据块,可以存放于不同的存储空间中•定位:–编译时定位:MCU系统采用编程时由ORG语句确定代码块和数据块的绝
对地址编译器以此地址为首地址,连续、顺序地存放该代码块或数据块–链接时定位:DSP系统采用编程时由“SECTION”伪指令,以区分不同的代码块或数据块编译器每遇到一个“SECTION”伪指令,从0地址重新开始一个代码块或数据块链接器将同名的“
SECTION”合并,并按.cmd文件中的“SECTION”命令进行实际的定位–加载时定位:PC机系统采用编程、编译和链接时均未对程序进行绝对定位程序运行前,由操作系统对程序进行重定位,并加载到存储空间中DSPC语言:C运行环境(1)•存储模型:C程序的
代码和数据如何定位•系统定义•–.cinit存放C程序中的变量初值和常量•–.const存放C程序中的字符常量、浮点常量和用const声明的常量•–.switch存放C程序中switch语句的跳针表•–.text存放C程序的代码•–.bss为C
程序中的全局和静态变量保留存储空间•–.far为C程序中用far声明的全局和静态变量保留空间•–.stack为C程序系统堆栈保留存储空间,用于保存返回地址、函数间的参数传递、存储局部变量和保存中间结果
•–.sysmem用于C程序中malloc、calloc和realloc函数动态分配存储空间•用户定义•–#pragmaCODE_SECTION(symbol,"sectionname")•–#p
ragmaDATA_SECTION(symbol,"sectionname")DSPC语言:C运行环境(2)•寄存器使用规则•–C编译器如何使用DSP的寄存器•–函数进入和返回前,寄存器的保护•函数调用规则•–函数间的参数传递通过寄存器和系统堆栈进行•–调用函数与被调用函数必须对各自的寄存器进
行保护•–从被调用函数返回前,被调用函数必须归还所有已占用的堆栈空间•C和ASM混合编程•–C和ASM混合编程时,必须遵循寄存器使用规则和函数调用规则•–被C调用的ASM函数,其函数名前应加“_”•中断服务程序•–ASM编写的
中断服务程序必须对所有用到寄存器进行保护,以免破坏C运行环境•–C编写的中断服务程序应用interrupt关键字声明DSPC语言:C运行环境(2)•系统初试化•在运行C程序前,必须建立C运行环境,此任务由C引导程序_c_int00完成;
c程序在连接的时候需要rst.lib库。•_c_int00包含在库函数中,build时自动将其链接进可执行程序中,程序的入口地址必须设为_c_int00起始地址。•_c_int00的源程序存放在由rts.src分
离出来的boot.asm中,用户可根据需要修改•–设置堆栈指针,•–初始化全局变量:将.cinit”段“中数据拷贝到.bss”段“中•–调用C程序的主函数main()•不同系列的DSP,其C编译器对C运行环境的处理略有不
同,具体参考各自的《OptimizingCCompilerUser’sGuide》DSPC语言:软件build流程•目标文件地址是浮动的,能被重定位链接器用.cmd文件对链接目标,进行重定位–列出目标文件、库文件和链接器选
项–用MEMORY命令描述目标系统存储空间配置–用SECTIONS命令描述“段”如何定位Hex转换程序也使用.cmd文件,配置转换选项CCS软件开发方法•传统软件开发方法用ASM或ASM和C混合编程,从零开始分配存储器空间
编写硬件资源头文件–DSP片内部分:描述片内寄存器地址描述片内寄存器控制/状态位域–DSP板上资源头文件描述片外外设寄存器地址描述片外外设寄存器控制/状态位域编写应用专用的外设驱动程序–片内/片外外设初试化程序–片内/片
外外设操作程序编写中断向量表和中断服务程序编写应用专用的算法编写主控程序顺序、死循环执行TI倡导的DSP软件架构TI免费提供的基础软件•CSL库:ChipSupportLibrary芯片支持库•–定义DSP片内外设资源,实现片内外设基本操作•DDK:DriverDev
elopmentKit设备驱动程序开发包•–设计标准的设备驱动程序模型,方便开发新的设备驱动程序•DSPLIB/IMGLIB:SignalProcessingLibrary•–数学运算、矩阵运算、FFT、滤
波、卷积、相关等信号处理函数•–压缩、分析、滤波和格式转换等图像/视频处理函数•DSP/BIOS:嵌入式实时、多任务操作系统•–实时、多任务内核•–实时分析•ReferenceFrameworks:程序参考架构•–C程序初试骨架,通过其可以迅速创建特定的应用程序•XDAIS:DS
PAlgorithmStandard,DSP算法标准•–规定一系列算法编程规则,遵循这些规则的算法,可以相互调用DSP/BIOS:功能•抢先型实时、多任务操作系统内核•–基于优先级的、抢先型实时调度程序•–支持多线程管理与调度•–支持4种线程类型:HWI、SWI、
TSK、IDL•–支持3种作业间的通信方式:Mailboxes、Semaphores、Queues•–支持周期函数,方便实现固定时间间隔的数据采集,简化多速率系统的设计•–提供存储器管理,实现动态存储器分配•实时分析模块•–分析信息实时获取、传输和显示,为早期的系统级排错提供帮助•–
DSP/BIOS模块中内含分析信息的实时获取功能•–分析信息的实时传输由RTDX(Real-TimeDataExchange)技术实现,完成目标DSP与主机之间的实时通信,C6000RTDX的带宽为20KByte,RTDX是在idle作业期间完成,所以对程序执行速度的影响最小•–主机可以
显示:事件记录、线程执行顺序、执行次数的最大值或平均值和总的CPU负载等信息DSP/BIOS:功能•为了方便使用,TI提供一个可视化的配置工具,用于配置实际系统中所需的DSP/BIOS模块;可以在CCS集成环境中调用之DSP/BIOS是可裁剪的,只有被
应用程序使用的模块才会被链接到应用程序中DSP/BIOS开销小:代码大小:1KWordsCPU占用:1MIPSDSP/BIOS采用标准的API,所以不同系列DSP之间的移植容易DSP/BIOS集成在CCS中,无需使用许可费CSL库•什么是CSL:ChipSupportLi
brary•–用于配置、控制和管理DSP片上外设•–已为C6000和C5000系列DSP设计了各自的CSL库•–CSL库函数大多数是用C语言编写的,并已对代码的大小和速度进行了优化•–CSL库是可裁剪的:即只有被使用的CSL模块才会包含进应用程序中•–CSL库是可扩展的:每
个片上外设的API相互独立,增加新的API,对其他片上外设没有影响•为什么要设计CSL•–DSP片上外设种类及其应用日趋复杂•–提供一组标准的方法用于访问和控制片上外设•–免除用户编写配置和控制片上外设所必需的定义和
代码CSL:特点•片上外设编程的标准协议:•–定义一组标准的APIs:函数、数据类型、宏•对硬件进行抽象,提取符号化的片上外设描述•–定义一组宏,用于访问和建立寄存器及其域值•基本的资源管理•–对多资源的片
上外设进行管理•已集成到DSP/BIOS中•–通过图形用户接口GUI对CSL进行配置•使片上外设容易使用•–缩短开发时间,增加可移植性CSL:片上外设DDK(DriverDevelopmentK
it)•TI提供DDK的目的•–标准的设备驱动程序模型,用户无需从零开始编写设备驱动程序•设备驱动程序模型(IOM)•–将设备驱动程序分为2个部分•与设备相关的:“迷你”驱动程序(mini-driver)•与设备无关的:“类”驱动程序(class-d
river)•–“类”驱动程序•设备驱动程序的上层抽象,使其与特定设备无关,为应用程序提供通用的接口•3大类“类”驱动程序:SIO、PIP和GIO•SIO:流I/O接口,由SIO和DIO组成,DIO负责缓冲器管理、信号同步以及底层“迷你”驱动程序接口•PIP:管
道接口,有PIP和PIO组成,PIO负责缓冲器管理、信号同步以及底层“迷你”驱动程序接口•GIO:通用I/O,允许进行块读块写,可以用其新的用户驱动程序•–“迷你”驱动程序•设备驱动程序的底层抽象,与特定设备有关,对设计硬件设备进行操作,DDK
规定一组•标准的API,函数体由用户根据实际硬件设备编写•DDK是在CSL基础上对外设I/O进行更高层次的抽象•TI免费提供DDK的源代码、库及相关文档,可从TI网站上免费下载SignalProcessingLibrary•C6000系列DSP基
本的信号处理库DSPLIB•–提供数学运算、矩阵运算、FFT、滤波、卷积等常用的信号处理函数•–TMS320C62xDSPLIB:专门为C62x系列DSP进行优化•–TMS320C67xDSPLIB:专门为C67x系列DSP进行优化•–T
MS320C64xDSPLIB:专门为C64x系列DSP进行优化•FastRTS:•–提供快速的单精度/双精度浮点数学运算和转换函数•–TMS320C62x/C64xFastRTS:专门为C62x/C64x系列DSP进行优化•–TMS320C67xFastRT
S:专门为C67x系列DSP进行优化•IMGLIB:提供压缩、分析、滤波和公司转换等常用的图像/视频处理函数•–TMS320C62xIMGLIB:专门为C62x系列DSP进行优化•–TMS320C6
4xIMGLIB:专门为C64x系列DSP进行优化•C5000系列DSP基本的信号处理库•–DSPLIB:提供数学运算、矩阵运算、FFT、滤波、卷积等常用的信号处理函数•–TMS320C54xDSPLIB:专门为C54x系列DSP进行优化•–TMS320C55xDSPLIB:专门为
C55x系列DSP进行优化•IMGLIB:提供压缩、分析、滤波和公司转换等常用的图像/视频处理函数•TMS320C55xIMGLIB:专门为C55x系列DSP进行优化ReferenceFramework•TI提供软件参
考架构,目的:•–DSP系统日趋复杂––包含多个算法(如:同时包含音频算法和视频算法)––同一个算法可能需要多道运行(如:对多个视频流进行处理)––不同算法或通道所需的数据或帧率可能不同(如:音频帧和视频帧帧率不同)––某些
DSP硬件系统的存储容量有限(如:C54x系统)––软件对象可能需要动态地创建和删除,导致存储器需要进行动态管理––硬件系统可能为由DSP和通用处理器构成的双处理器系统•–TI精选一些通用的模块,构成软件参考架构•–让你将精力集中于系统的特定应用方
面•TI根据系统的复杂程度已提供3个软件参考架构––RF1:小型系统,主要用于由C54x和C55x实现的低端系统––RF3:中型系统,主要用于由C54x和C55x实现的高端系统和C6x实现的低端系统––RF5:大型系统,主要
用于由C6x实现的高端系统软件开发:DSPAlgorithmStandard(XDAIS)•制定XDAIS的目的•–DSP软件系统日趋复杂,算法由专业公司、专业人员开发•–算法提供者和算法使用者分离•–为了是二者协调工作,必须定义一组通用的编程规则和指导方
针,以及一组编程接口•–即使算法使用者和提供者相同,但只要符合XDAIS算法标准,则这些算法可以用到不同的项目中,使算法具有良好的继承性•如何开发符合标准的算法•–TI提供一组工具•–Compon
entWizardControl:超级向导,帮助你快速、精确地将你的算法封装为符合XDAIS标准的算法•–QuaiTI:测试工具,用于快速、有效地测试算法是否符合XDAIS标准•–DOSA:自动优化工具,当算法用于静态环境时,删除算法中不必要的部分•–TI免费提供XDAIS开发套件,
可从TI网站上免费下载实验3:C与汇编混合编程•intx,y,z;•intadd(inta,intb);•main()•{x=3;y=17;•while(1)•{•z=add(x,y);•}•}_add:AADD#-3,SPMOVT
1,*SP(#1);MOVT0,*SP(#0);MOV*SP(#1),AR1;ADD*SP(#0),AR1,T0;AADD#3,SPRET实验3:C与汇编混合编程_add:•BCLRCPL•.CPL_OFF•MOVT1,AR1•ADDAR1,T0•BSETCPL•.CPL_ON•RET知
识回顾KnowledgeReview