DSP_C语言程序设计课件.ppt
第6章 C/C+语言程序设计,6.1 C55X C/C+语言概述6.2 C55X C/C+语言编程基础6.5 C语言与汇编语言的混合编程 6.5.1 在C语言中直接嵌入汇编语言 6.5.2 C语言调用汇编模块的接口补充: TI DSP软件开发平台,第6章 C/C+语言程序设计6.1 C55X C/C+语,汇编语言依赖于计算机硬件,程序的可读性和可移植性比较差。一般高级语言具有很好的可移植性,但是难以实现汇编语言的某些功能(如对内存地址的操作、位操作等)。C/C+语言作为一种高级语言,既可以访问物理地址又可以进行位操作,能直接对硬件进行操作,适合用作DSP开发语言。,6.1.1 C/C+语言概况,6.1 C55X C/C+语言概述,汇编语言依赖于计算机硬件,程序的可读性和可移植性比较差。一般,6.1.2 C55x C/C+语言概况,C55x C/C+编译器全面支持ANSI C/C+语言标准,能够把按照标准ANSI C/C+规范编写的源程序进行全面优化,编译成C55x 汇编语言源程序。C55x C/C+编译器工具拥有完整的实时运行库,所有的库函数均符合ANSI库标准。,6.1.2 C55x C/C+语言概况C55x C/C+,6.2.1 C语言中的数据类型,C55x支持下列数据类型包括字符、定点数、浮点数、指针等。,6.2 C55X C/C+语言编程基础,6.2.1 C语言中的数据类型 C55x支持下列数,类 型长 度内 容最 小 值最 大 值in,6.2.1 C语言中的数据类型,类 型长 度内 容最 小 值最 大 值do,6.2.2 关键字,const C55x C编译器支持标准C语言的const关键字。将这个关键字使用到对任意变量或数组的定义上可以确保它们的值不改变。如果定义一个对象为const,那么const段就会为该对象分配存储空间。使用const关键字可以定义大常数表并将它们分配到系统ROM中。,6.2 C55X C/C+语言编程基础,6.2.2 关键字const 6.2 C55X C/C+语,例:,6.2.2 关键字,int * const p=,定义指向变量int的常量指针p,定义指向常量int的变量指针q,例:6.2.2 关键字 int * const p=&x,2. ioport关键字,1.ioport关键字可以用在数组、结构、联合以及枚举类型当中。,2. 当用在数组中时,ioport限制的数组单元而非数组类型本身; 3. ioport类型只能用来声明全局或静态变量,如果在本地变量中使用ioport类型,则变量必须用指针声明。,6.2.2 关键字,注意:,2. ioport关键字 1.ioport关键字可以用在数组,例,ioport关键字的使用。,ioport int k void foo(void)ioport int i ioport int *j ,6.2.2 关键字,; /*正确* /,; /*错误* /,; /*正确* /,例,ioport关键字的使用。ioport int k 6,例:定时器初始化例程,void TIMER_init(void) ioport unsigned int *tim0; ioport unsigned int *prd0; ioport unsigned int *tcr0; ioport unsigned int *prsc0; tim0 = (unsigned int *)0 x1000;prd0 = (unsigned int *)0 x1001;tcr0 = (unsigned int *)0 x1002;prsc0 = (unsigned int *)0 x1003; *tcr0 = 0 x04f0; *tim0 = 0; *prd0 = 0 x0ffff; *prsc0 = 2; *tcr0 = 0 x00e0;,例:定时器初始化例程void TIMER_init(void,3. interrupt关键字,关键字 “interrupt”-定义中断函数,注意: 1.当C/C+代码被中断时,中断程序必须保存所有与程序有关的寄存器。 2.当使用“interrupt”关键字定义函数时,中断函数必须返回空并且没有参数传递。 3.中断函数可以定义本地变量并且使用堆栈。 4. c_int00是C/C+程序的入口点,这个函数名被系统复位中断保留,该中断服务程序用来初始化系统并调用main函数。,3. interrupt关键字 关键字 “interrup,关于中断的几个要点:,中断服务程序不能被普通C代码调用。,关键字,例:中断服务程序Void INTR_init( void )IVPD=0 xd0;IVPH=0 xd0;IER0=0 x10;DBIER0 =0 x10;IFR0=0 xffff;asm( BCLR INTM);interrupt void timer( ) .,无参数,设置中断寄存器IER0,保存中断入口的现场信息(所用寄存器或全部寄存器),关于中断的几个要点:中断服务程序不能被普通C代码调用。关,通过.sect指令创建中断向量表。,.sect .vectors .ref _c_int00 .ref _timer rsv: B _c_int00 NOP .align 8nmi: .loop 8 nop.endloopint0:.loop 8nop.endloopint2: B _timernop.align 8tint:B _timernop.align 8,在汇编语言中,中断程序名前加下划线,如 _timer。,关于中断的几个要点:,中断处理程序可以处理单个中断或多个中断,c_int00除外,保存中断入口的现场信息 (所用寄存器或全部寄存器),通过.sect指令创建中断向量表。 .sec,onchip关键字-定义的指针所指向的数据在片上内存例:用onchip定义数组和指针 onchip int x100; /* array declaration */ onchip int *p; /* pointer declaration */,4 onchip关键字,onchip关键字-定义的指针所指向的数据在片上内存4,6.2.2 关键字,volatile,-存储器访问,定义格式: register 变量类型 变量名变量类型:整型、浮点型和指针类型,register,6.2.2 关键字volatile-存储器访问定义格,6.2.4 asm指令,-插入一条汇编指令,指令格式: asm (“assembler text”);,main()int i;unsigned int uWork;while ( 1 )for ( i=0;i256;i+ )ADCCTL=0 x8000;asm( nop); ,例:,6.2.4 asm指令 -插入一条汇编指令指令格式:,6.2.5 pragma指令,#define NX 64#define NH 64#pragma DATA_SECTION(db,.dbuffer)DATA dbNH+2 ;#pragma DATA_SECTION(x,.dbuffer)#pragma DATA_SECTION(r,.dbuffer)DATA xNX,rNX;,例:,Pragma指令告诉编译器的预处理器如何处理函数。必须在函数体外确定pragma,且必须出现在任何声明、定义或对函数和符号引用之前。否则,编译器会输出警告。,6.2.5 pragma指令#define NX 64例:,C55x C编译器支持如下pragma指令:,CODE_SECTIONC54X_CALLC54X_FAR_CALLDATA_ALIGNDATA_SECTIONFUNC_CANNOT_INLINEFUNC_EXT_CALLED,FUNC_IS_PUREFUNC_IS_SYSTEMFUNC_NEVER_RETURNSFUNC_NO_GLOBAL_ASGFUNC_NO_IND_ASGMUST_ITERATEUNROLL,C55x C编译器支持如下pragma指令:CODE_SE,CODE_SECTION指令及其用法,语法:#pragma CODE_SECTION(func_name, ”section_name”)作用: 把C函数func_name的代码配置到由section_name定义的程序段中,语法: #pragma DATA_SECTION(var_name,”section_name”)作用:var_name是包含在C函数内的变量名称,该指令将数据var_name配置到由section_name定义的数据段中,DATA_SECTION指令及其用法,CODE_SECTION指令及其用法语法:语法: DATA,例:,#pragma CODE_SECTION(funcA, “codeA”) int funcA(int a) int i; return (i = a); ,编译后的结果如下: .sect “codeA” .global _funcA ;* ;* FUNCTION NAME: _funcA * ;* _funcA: return ;返回,例: #pragma CODE_SECTI,例: #pragma DATA_SECTION(bufferB, “my_sect”) char bufferA512; char bufferB512;,编译后的结果如下: .global _bufferA .bss _bufferA,512 .global _bufferB _bufferB: .usect “my_sect”,512,例: #pragma DATA_SECTION(buffe,6.2.7 存储器模式与分配,编译器支持两种存储器模型:小存储模式大存储器模式,链接器不允许同时存在大存储器模式和小存储器模式。,6.2.7 存储器模式与分配编译器支持两种存储器模型:链接器,下列段必须在长度为64K字的同一个段内: .bss段和.data段(存放静态和全局变量) .stack和.sysstack段(系统堆栈) .system段(动态存储空间) .const段,长度和位置都不受限制的段:.text(代码段),.switch(状态转化段).cinit/.pinit(变量初始化段);,1.小存储器模式(默认模式),下列段必须在长度为64K字的同一个段内:长度和位置都不受限制,大存储器模式下可以更加方便地存放数据,而不必过多地考虑数据页的限制。 在该模式下,数据指针为23位,而堆栈和系统堆栈必须放在同一页中; 代码段可以跨越页边界以外;除代码段外的其他所有的段只能放在一页存储器之中,但不同的段可以放在不同的页内。,2大存储器模式,大存储器模式下可以更加方便地存放数据,而不必过多地考虑数,3. 存储器分配,1. C编译器生成的段C编译器生成的段: 初始化段和未初始化段初始化段有:.cinit段,包含初始化数据表格和常数.pinit段,包含实时运行时调用的数据表格.const段,包含用const定义(不能同时被volatile定义)的字符串常量和数据.switch段,包含switch语句所用表.text段,包含所有可执行代码,汇编器生成了.data段,但C编译器并不使用这个段。,3. 存储器分配1. C编译器生成的段汇编器生成了.dat,未初始化段:.bss段,为全局和静态变量保留了空间。.stack段,为C系统堆栈分配存储地址。这个存储地址用来传递变量和局部存储.sysstack段,为第二系统堆栈分配存储地址.sysmem段,为动态存储分配保留空间。这个空间被malloc、calloc和realloc函数调用。.cio段,支持C I/O。这个空间用来作为标签为_CIOBUF_缓冲区。.cio段必须放在链接器命令文件中才能使用C I/O。,未初始化段:,3. 存储器分配,3. 存储器分配初始化段功能存储器类型未初始化段功能存储器类,6.2.11. 系统初始化,_c_int00,_c_int00函数执行如下工作来初始化C环境:,建立堆栈和第二系统堆栈,从 .cinit段中复制数据到.bss段来初始化全局变量,调用main函数开始执行C程序。,6.2.11. 系统初始化_c_int00 _c_int00,七、 系统初始化,.cinit段中的全局和静态变量的数据。在标准ANSI C语言中,没有显式初始化的全局和静态变量必须在程序执行前设置为0。,1. 变量的自动初始化,七、 系统初始化.cinit段中的全局和静态变量的数据。1.,2. 全局构建器(Global Constructors),链接器则将各输入文件中的.pinit段链接成一个单一的.pinit段,启动程序将使用这个表来运行这些构建器。,2. 全局构建器(Global Constructors)链,3. 初始化表(Initialization Tables),.cinit段中的表中包含可变大小的初始化记录。每个必须被自动初始化的变量在.cinit段中都有一条记录。,3. 初始化表(Initialization Tables),4. 运行时间变量初始化,在运行时间自动初始化是自动初始化的默认模式。为使用这种模式,可采用链接器的-c选项。采用这种方法,.cinit段随着所有其它初始化段被装载到存储器(通常为ROM)中,全局变量在运行时间被初始化。链接器定义了一个叫做cinit的特殊符号,用以指向存储器中初始化表的起始地址。当程序开始运行时,C启动程序从cinit指向的表中复制数据到.bss段中的特定变量中。这使得初始化数据能被存储到ROM中,并在每次程序开始执行时复制到RAM中。,4. 运行时间变量初始化在运行时间自动初始化是自动初始化的默,图6-3 运行时间变量自动初始化过程,这种方法适用于应用程序烧入在ROM中的系统。,图6-3 运行时间变量自动初始化过程这种方法适用于应用程,5. 装载时间变量初始化,在装载时间自动初始化变量会减少启动时间并节省被初始化表使用的存储器,从而改善了系统性能。用-cr链接器选项可以选择这种模式。当使用-cr选项时,链接器置位在.cinit段头的STYP_COPY位,这样装载器就不会把.cinit段装载到存储器中(.cinit段不占用存储器空间)。链接器置cinit符号为1(通常cinit指向初始化表的起始地址),告诉启动程序存储器中没有初始化表,因此在启动时不进行初始化。,5. 装载时间变量初始化在装载时间自动初始化变量会减少启动时,为在装载时间内实现自动初始化,装载器必须能够执行如下工作:检查目标文件中.cinit段是否存在保证STYP_COPY在 .cinit段头中被置位,这样就不会复制.cinit段到存储器中去理解初始化表格式,图6-4 装载时间变量自动初始化过程,为在装载时间内实现自动初始化,装载器必须能够执行如下工作:图,6.5 C55x C和汇编语言混合编程,6.5.1 概述6.5.2 C/C+中的寄存器规则6.5.3 函数结构和调用规则6.5.4 C和汇编语言的接口,6.5 C55x C和汇编语言混合编程6.5.1 概述,6.5.2 . 寄存器规则,6.5.2 . 寄存器规则寄存器保存者用途AC0,AC1,A,6.5.2. 寄存器规则,寄存器保存者用途BRC0、BRC1父函数BRS1父函数BSA,状态寄存器作为标志DSP运行状态的寄存器在运行中起着重要的作用,表4-3介绍了各状态寄存器各字段的作用、默认值以及是否可以修改。,ST0-55,6.5.2. 寄存器规则,状态寄存器作为标志DSP运行状态的寄存器在运行中起着,6.5.2. 寄存器规则,ST1-55,6.5.2. 寄存器规则ST1-55字 段名 称,6.5.2. 寄存器规则,ST2-55,6.5.2. 寄存器规则ST2-55字 段名 称,6.5.2. 寄存器规则,ST3-55,6.5.2. 寄存器规则ST3-55字 段名 称,6.5.3 函数结构和调用规则,1函数调用规则,(1)将所要传递到子函数的参数放入寄存器或堆栈。,如果一个函数的变量用一个省略号声明(标志参数的数量是变化的),则剩余的参数跟着最后一个被声明的参数被传到堆栈,而堆栈的地址将作为访问其他未声明参数的索引。,6.5.3 函数结构和调用规则1函数调用规则(1)将所要,1函数调用规则,编译器对参量分类,有3类:数据指针(int *,long * 等)16位数据(char,short,int)32位数据(long,float,double,函数指针),(1)将所要传递到子函数的参数放入寄存器或堆栈。,1函数调用规则编译器对参量分类,有3类:(1)将所要传递到,如果参数的数量超过可使用寄存器数量,多余的参数会被压入堆栈,子函数通过堆栈得到剩余参数。,1函数调用规则,(1)将所要传递到子函数的参数放入寄存器或堆栈。,如果参数的数量超过可使用寄存器数量,多余的参数会被压,(2)子函数保存所有的入口保存寄存器 (T2、T3、AR5AR7)。 父函数必须通过压入堆栈来保存其它在调用后会用到寄存器的值。,(3)父函数对子函数进行调用。,短数据 T0长数据 AC0数据指针(X)AR0结构体 父函数在本地堆栈中分配相应大小的空间。父函数将该空间地址作为第一个隐含参量传送给子函数,这个参数被看成一个数据指针。,(4)父函数收集返回值。,1函数调用规则,(2)子函数保存所有的入口保存寄存器 (T2、T3,例,寄存器参量传递规则,struct big long x10; ;struct small int x; ;T0 T0 AC0 AR0int fn(int i1, long l2, int *p3);AC0 AR0 T0 T1 AR1long fn(int *p1, int i2, int i3, int i4); AR0 AR1struct big fn(int *p1); T0 AR0 AR1int fn(struct big b, int *p1);,例,寄存器参量传递规则struct big long x,AC0 AR0struct small fn(int *p1);T0 AC0 AR0int fn(struct small b, int *p1);T0 stack stack.int printf(char *fmt, . ); AC0 AC1 AC2 stack T0void fn(long l1, long l2, long l3, long l4, int i5); AC0 AC1 AC2 AR0 AR1void fn(long l1, long l2, long l3, int *p4, int *p5, AR2 AR3 AR4 T0 T1int *p6, int *p7, int *p8, int i9, int i10);,AC0 AR0,子函数执行代码,保护入口寄存器(T2, T3,AR5-AR7),为局部变量等分配存储空间,收集返回值,函数参数传递,恢复保护的寄存器(T2, T3,AR5-AR7),释放堆栈,函数返回,2被调用函数(子函数)的响应,子函数执行代码保护入口寄存器(T2, T3,AR5-AR7),6.5.4 C和汇编语言的接口,C代码和汇编语言代码混合使用方法:在C源代码中直接嵌入汇编语言。在C源代码中使用汇编语言函数、变量和常数。使用几个独立的汇编代码模块,并将它们与编译了的C模块进行链接.,6.5.4 C和汇编语言的接口C代码和汇编语言代码混合使用,1.嵌入汇编语言,注意:千万注意不要破坏C语言操作环境。不要从内嵌asm汇编语句调转到语言模块中。不要在内嵌asm汇编语句中改变语言模块中变量的值,但可以安全地读取它们的值。不要使用内嵌asm汇编语句插入汇编器指令来改变汇编环境。,指令格式: asm (“assembler text”);,例:asm(“BCLR INTM”),1.嵌入汇编语言注意:指令格式:例:asm(“BCLR I,2. 在C代码中访问汇编语言函数,(a)C程序:extern int asmfunc(int,int *); /*声明汇编函数*/int gvar ; /*定义全局变量*/main() int i;i=asmfunc(i,/*调用函数*/,(b)汇编程序: .global _asmfunc_asmfunc:ADD *AR0,T0,T0 ; T0+gvar=i,i=T0 RET;,在定义汇编函数时,在函数名前加下划线“_”.声明为外部函数,2. 在C代码中访问汇编语言函数(a)C程序:extern,3: 在C代码中访问汇编语言变量,访问.bss段或.usect段中没有初始化的变量:使用.bss或.usect指令来定义变量使用.global指令来定义为外部变量在汇编语言中的变量前加下划线“_”在C代码中声明变量为外部变量并正常地访问它,(b)C程序:extern int var;/* 外部变量 */var = 1;/* 使用变量 */,(a)汇编语言程序: .bss var,1;定义变量 .gloabal var;声明变量为外部变量,3: 在C代码中访问汇编语言变量访问.bss段或.use,非.bss段中变量访问-定义指向该变量的指针定义变量声明一个指向该变量起始地址的全局指针在程序中,必须先声明该对象为extern型。,3: 在C代码中访问汇编语言变量,(a)汇编程序: .global _sine .sect ”sine_tab”_sine: .float 0.0 .float 0.015987 .float 0.022145,(b)C程序:extern float sine ;float *sine_p=sine;f=sine_p2;,非.bss段中变量访问-定义指向该变量的指针3: 在C代,4. 在C语言中访问汇编语言常数,使用.set和.global指令定义汇编语言全局常数。使用&运算符来取值。,(a)汇编语言程序:_table_size .set 10000;定义常量.global _table_size;定义该常量为全局常量,例:,(b)语言程序:extern int table_size;#define TABLE_SIZE (int)(+i),4. 在C语言中访问汇编语言常数使用.set和.global,C和汇编语言的接口注意:,(1) 如果用汇编语言编写中断例程,则需要保存在中断例程中使用的所有寄存器。,(2)如果在汇编程序中调用C/C+函数,则只有特定的寄存器在C/C+中被保存,而其他寄存器则可能被C/C+函数改变。,(3)编译器所默认的CPL值为1,即采用间接、绝对方式寻址,如果在汇编函数中CPL被设置为0,在函数返回时应当把这个值改为1。,C和汇编语言的接口注意:(1) 如果用汇编语言编写中断例程,,例:利于混合编程的方式实现y=a+b,主程序用C实现,子函数asmf采用汇编语言,已知a,b,y均为整数。,主程序:,Main(),int a, int b;int y;,a=3; b=5;,y=asmf(a,b);,extern int asmf(int a,int b);,汇编源程序:,.global _asmf,.text,_asmf: add T1,T0,T0 RET,例:利于混合编程的方式实现y=a+b,主程序用C实现,子函数,习题:,利于混合编程的方式实现 已知主程序如下,请将汇编源程序补充完整。,Main(),int anb=2,3,4,5; int xnb=1,2,3,4;int y;,y=asmf(,extern long asmf(int *,int *,int);,主程序:,汇编源程序:,.global _asmf,.text,_asmf: . . RET,#define nb 5;,习题:利于混合编程的方式实现,P249 作业,3,4,5,6, 7,9,10,P249 作业3,4,5,6, 7,9,10,小结:软件开发过程,第一步,分析任务需求并用高级语言写出软件流程。写流程可以采用编写“伪代码”的方式完成。可以清楚地定义信号的处理机制,并为今后程序的调试和扩展预先留好接口。在流程描述中,可以将每一个关键的处理环节用函数(或直接用语言描述)来表示,确定软件的框架。第二步,根据第一步的工作写主流程的C或者汇编程序。整个工作过程可以充分参照例子工程做。第三步,细化主流程程序,按功能编写每一个函数。第四步,完成中断服务程序的编写。第五步,编写链接用cmd命令文件,确定汇编程序中各段代码和数据摆放的位置。通常情况下,程序放置在SARAM内,而数据放置在DARAM 。,注意程序的编制需强调程序的模块化、常量的符号化、变量名有意义等软件工程的基本要素。在汇编级编程的时候,需要做汇编语句级的优化。,小结:软件开发过程第一步,分析任务需求并用高级语言写出软,小结:软件开发过程,软件组成:由代码和数据组成运行:要运行的程序其代码和数据必须存放在CPU的存储空间存放:以代码块和数据块的形式存放代码块和数据块是程序的最小单元一个代码块或数据块在存储空间中连续、顺序存放不同的代码块或数据块,可以存放于不同的存储空间中定位: 编译时定位:MCU系统采用编程时由ORG语句确定代码块和数据块的绝对地址编译器以此地址为首地址,连续、顺序地存放该代码块或数据块 链接时定位:DSP系统采用编程时由“SECTION”伪指令,以区分不同的代码块或数据块编译器每遇到一个“SECTION”伪指令,从0地址重新开始一个代码块或数据块链接器将同名的“SECTION”合并,并按.cmd文件中的“SECTION”命令进行实际的定位 加载时定位:PC机系统采用编程、编译和链接时均未对程序进行绝对定位程序运行前,由操作系统对程序进行重定位,并加载到存储空间中,小结:软件开发过程软件组成:由代码和数据组成,DSP C语言: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, section name)#pragmaDATA_SECTION (symbol, section name),DSP C语言:C运行环境(1)存储模型:C程序的代码和数据,DSP C语言:C运行环境(),寄存器使用规则C编译器如何使用DSP的寄存器函数进入和返回前,寄存器的保护函数调用规则函数间的参数传递通过寄存器和系统堆栈进行调用函数与被调用函数必须对各自的寄存器进行保护从被调用函数返回前,被调用函数必须归还所有已占用的堆栈空间C和ASM混合编程C和ASM混合编程时,必须遵循寄存器使用规则和函数调用规则被C调用的ASM函数,其函数名前应加“_”中断服务程序ASM编写的中断服务程序必须对所有用到寄存器进行保护,以免破坏C运行环境C编写的中断服务程序应用interrupt关键字声明,DSP C语言:C运行环境()寄存器使用规则,DSP C语言:C运行环境(),系统初试化在运行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运行环境的处理略有不同,具体参考各自的Optimizing C Compiler Users Guide,DSP C语言:C运行环境()系统初试化,DSP C语言:软件build流程,目标文件地址是浮动的,能被重定位链接器用.cmd文件对链接目标,进行重定位列出目标文件、库文件和链接器选项用MEMORY命令描述目标系统存储空间配置用SECTIONS命令描述“段”如何定位Hex转换程序也使用.cmd文件,配置转换选项,DSP C语言:软件build流程目标文件地址是浮动的,能被,CCS 软件开发方法,传统软件开发方法,用ASM或ASM和C混合编程,从零开始分配存储器空间编写硬件资源头文件DSP片内部分:描述片内寄存器地址描述片内寄存器控制状态位域DSP板上资源头文件描述片外外设寄存器地址描述片外外设寄存器控制状态位域编写应用专用的外设驱动程序片内片外外设初试化程序片内片外外设操作程序编写中断向量表和中断服务程序编写应用专用的算法编写主控程序顺序、死循环执行,CCS 软件开发方法传统软件开发方法用ASM或ASM和C混合,TI倡导的DSP软件架构,TI倡导的DSP软件架构,TI免费提供的基础软件,CSL库:Chip Support Library芯片支持库定义DSP片内外设资源,实现片内外设基本操作DDK:Driver Development Kit 设备驱动程序开发包设计标准的设备驱动程序模型,方便开发新的设备驱动程序DSPLIBIMGLIB:Signal Processing Library数学运算、矩阵运算、FFT、滤波、卷积、相关等信号处理函数压缩、分析、滤波和格式转换等图像视频处理函数DSP/BIOS:嵌入式实时、多任务操作系统实时、多任务内核实时分析Reference Frameworks:程序参考架构C程序初试骨架,通过其可以迅速创建特定的应用程序XDAIS:DSP Algorithm Standard,DSP算法标准规定一系列算法编程规则,遵循这些规则的算法,可以相互调用,TI免费提供的基础软件CSL库:Chip Support L,DSP/BIOS:功能,抢先型实时、多任务操作系统内核基于优先级的、抢先型实时调度程序支持多线程管理与调度支持4种线程类型:HWI、SWI、TSK、IDL支持3种作业间的通信方式:Mailboxes、Semaphores、Queues支持周期函数,方便实现固定时间间隔的数据采集,简化多速率系统的设计提供存储器管理,实现动态存储器分配实时分析模块分析信息实时获取、传输和显示,为早期的系统级排错提供帮助DSP/BIOS模块中内含分析信息的实时获取功能分析信息的实时传输由RTDX(Real-Time Data Exchange)技术实现,完成目标DSP与主机之间的实时通信,C6000 RTDX的带宽为20KByte,RTDX是在idle作业期间完成,所以对程序执行速度的影响最小主机可以显示:事件记录、线程执行顺序、执行次数的最大值或平均值和总的CPU负载等信息,DSP/BIOS:功能抢先型实时、多任务操作系统内核,DSP/BIOS:功能,为了方便使用,TI 提供一个可视化的配置工具,用于配置实际系统中所需的DSP/BIOS模块;可以在CCS集成环境中调用之DSP/BIOS是可裁剪的,只有被应用程序使用的模块才会被链接到应用程序中DSP/BIOS开销小:代码大小:1K WordsCPU占用:1MIPSDSP/BIOS采用标准的API,所以不同系列DSP之间的移植容易DSP/BIOS集成在CCS中,无需使用许可费,DSP/BIOS:功能为了方便使用,TI 提供一个可视化的配,CSL 库,什么是CSL:Chip Support Library用于配置、控制和管理DSP片上外设已为C6000和C5000系列DSP设计了各自的CSL库CSL库函数大多数是用C语言编写的,并已对代码的大小和速度进行了优化CSL库是可裁剪的:即只有被使用的CSL模块才会包含进应用程序中CSL库是可扩展的:每个片上外设的API相互独立,增加新的API,对其他片上外设没有影响为什么要设计CSLDSP片上外设种类及其应用日趋复杂提供一组标准的方法用于访问和控制片上外设免除用户编写配置和控制片上外设所必需的定义和代码,CSL 库什么是CSL:Chip Support Libra,CSL:特点,片上外设编程的标准协议:定义一组标准的APIs:函数、数据类型、宏对硬件进行抽象,提取符号化的片上外设描述定义一组宏,用于访问和建立寄存器及其域值基本的资源管理对多资源的片上外设进行管理已集成到DSP/BIOS中通过图形用户接口GUI对CSL进行配置使片上外设容易使用缩短开发时间,增加可移植性,CSL:特点片上外设编程的标准协议:,CSL:片上外设,CSL:片上外设,DDK(Driver Development Kit ),TI提供DDK的目的标准的设备驱动程序模型,用户无需从零开始编写设备驱动程序设备驱动程序模型(IOM)将设备驱动程序分为2个部分与设备相关的:“迷你”驱动程序(mini-driver)与设备无关的:“类”驱动程序(class-driver)“类”驱动程序设备驱动程序的上层抽象,使其与特定设备无关,为应用程序提供通用的接口3大类“类”驱动程序:SIO、PIP和GIOSIO:流I/O接口,由SIO和DIO组成,DIO负责缓冲器管理、信号同步以及底层“迷你”驱动程序接口PIP:管道接口,有PIP和PIO组成,PIO负责缓冲器管理、信号同步以及底层“迷你”驱动程序接口GIO:通用I/O,允许进行块读块写,可以用其新的用户驱动程序“迷你”驱动程序设备驱动程序的底层抽象,与特定设备有关,对设计硬件设备进行操作,DDK规定一组标准的API,函数体由用户根据实际硬件设备编写DDK是在CSL基础上对外设I/O进行更高层次的抽象TI免费提供DDK的源代码、库及相关文档,可从TI网站上免费下载,DDK(Driver Development Kit )TI,Signal Processing Library,C6000系列DSP基本的信号处理库DSPLIB提供数学运算、矩阵运算、FFT、滤波、卷积等常用的信号处理函数TMS320C62x DSPLIB:专门为C62x系列DSP进行优化TMS320C67x DSPLIB:专门为C67x系列DSP进行优化TMS320C64x DSPLIB:专门为C64x系列DSP进行优化FastRTS:提供快速的单精度双精度浮点数学运算和转换函数TMS320C62xC64x FastRTS:专门为C62xC64x系列DSP进行优化TMS320C67x FastRTS:专门为C67x系列DSP进行优化IMGLIB:提供压缩、分析、滤波和公司转换等常用的图像视频处理函数TMS320C62x IMGLIB:专门为C62x系列DSP进行优化TMS320C64x IMGLIB:专门为C64x系列DSP进行优化C5000系列DSP基本的信号处理库DSPLIB:提供数学运算、矩阵运算、FFT、滤波、卷积等常用的信号处理函数TMS320C54x DSPLIB:专门为C54x系列DSP进行优化TMS320C55x DSPLIB:专门为C55x系列DSP进行优化IMGLIB:提供压缩、分析、滤波和公司转换等常用的图像视频处理函数TMS320C55x IMGLIB:专门为C55x系列DSP进行优化,Signal Processing LibraryC6000,Reference Framework,TI提供软件参考架构,目的:DSP系统日趋复杂包含多个算法(如:同时包含音频算法和视频算法)同一个算法可能需要多道运行(如:对多个视频流进行处理)不同算法或通道所需的数据或帧率可能不同(如:音频帧和视频帧帧率不同)某些DSP硬件系统的存储容量有限(如:C54x系统)软件对象可能需要动态地创建和删除,导致存储