DSP_C语言程序设计课件.ppt
《DSP_C语言程序设计课件.ppt》由会员分享,可在线阅读,更多相关《DSP_C语言程序设计课件.ppt(81页珍藏版)》请在三一办公上搜索。
1、第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+语言概况
2、,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语言中的数据类型
3、 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=,定义指向变量i
4、nt的常量指针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 in
5、t *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
6、 *)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_i
7、nt00是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,保存中断入口的现场信息(所用寄存器或全部寄存器),关于中断的几个要
8、点:中断服务程序不能被普通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除外,保存中断入口的现场信息 (所用寄存器或全部寄存器),
9、通过.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指
10、令,-插入一条汇编指令,指令格式: 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(
11、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_N
12、O_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定义的数据段中
13、,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 bufferA
14、512; 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和.syssta
15、ck段(系统堆栈) .system段(动态存储空间) .const段,长度和位置都不受限制的段:.text(代码段),.switch(状态转化段).cinit/.pinit(变量初始化段);,1.小存储器模式(默认模式),下列段必须在长度为64K字的同一个段内:长度和位置都不受限制,大存储器模式下可以更加方便地存放数据,而不必过多地考虑数据页的限制。 在该模式下,数据指针为23位,而堆栈和系统堆栈必须放在同一页中; 代码段可以跨越页边界以外;除代码段外的其他所有的段只能放在一页存储器之中,但不同的段可以放在不同的页内。,2大存储器模式,大存储器模式下可以更加方便地存放数据,而不必过多地考虑数,
16、3. 存储器分配,1. C编译器生成的段C编译器生成的段: 初始化段和未初始化段初始化段有:.cinit段,包含初始化数据表格和常数.pinit段,包含实时运行时调用的数据表格.const段,包含用const定义(不能同时被volatile定义)的字符串常量和数据.switch段,包含switch语句所用表.text段,包含所有可执行代码,汇编器生成了.data段,但C编译器并不使用这个段。,3. 存储器分配1. C编译器生成的段汇编器生成了.dat,未初始化段:.bss段,为全局和静态变量保留了空间。.stack段,为C系统堆栈分配存储地址。这个存储地址用来传递变量和局部存储.sysstac
17、k段,为第二系统堆栈分配存储地址.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. 系统初始化_
18、c_int00 _c_int00,七、 系统初始化,.cinit段中的全局和静态变量的数据。在标准ANSI C语言中,没有显式初始化的全局和静态变量必须在程序执行前设置为0。,1. 变量的自动初始化,七、 系统初始化.cinit段中的全局和静态变量的数据。1.,2. 全局构建器(Global Constructors),链接器则将各输入文件中的.pinit段链接成一个单一的.pinit段,启动程序将使用这个表来运行这些构建器。,2. 全局构建器(Global Constructors)链,3. 初始化表(Initialization Tables),.cinit段中的表中包含可变大小的初始化记
19、录。每个必须被自动初始化的变量在.cinit段中都有一条记录。,3. 初始化表(Initialization Tables),4. 运行时间变量初始化,在运行时间自动初始化是自动初始化的默认模式。为使用这种模式,可采用链接器的-c选项。采用这种方法,.cinit段随着所有其它初始化段被装载到存储器(通常为ROM)中,全局变量在运行时间被初始化。链接器定义了一个叫做cinit的特殊符号,用以指向存储器中初始化表的起始地址。当程序开始运行时,C启动程序从cinit指向的表中复制数据到.bss段中的特定变量中。这使得初始化数据能被存储到ROM中,并在每次程序开始执行时复制到RAM中。,4. 运行时间
20、变量初始化在运行时间自动初始化是自动初始化的默,图6-3 运行时间变量自动初始化过程,这种方法适用于应用程序烧入在ROM中的系统。,图6-3 运行时间变量自动初始化过程这种方法适用于应用程,5. 装载时间变量初始化,在装载时间自动初始化变量会减少启动时间并节省被初始化表使用的存储器,从而改善了系统性能。用-cr链接器选项可以选择这种模式。当使用-cr选项时,链接器置位在.cinit段头的STYP_COPY位,这样装载器就不会把.cinit段装载到存储器中(.cinit段不占用存储器空间)。链接器置cinit符号为1(通常cinit指向初始化表的起始地址),告诉启动程序存储器中没有初始化表,因此
21、在启动时不进行初始化。,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
22、.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. 寄存器
23、规则,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)将所要传递到子函数的参数放入
24、寄存器或堆栈。,1函数调用规则编译器对参量分类,有3类:(1)将所要传递到,如果参数的数量超过可使用寄存器数量,多余的参数会被压入堆栈,子函数通过堆栈得到剩余参数。,1函数调用规则,(1)将所要传递到子函数的参数放入寄存器或堆栈。,如果参数的数量超过可使用寄存器数量,多余的参数会被压,(2)子函数保存所有的入口保存寄存器 (T2、T3、AR5AR7)。 父函数必须通过压入堆栈来保存其它在调用后会用到寄存器的值。,(3)父函数对子函数进行调用。,短数据 T0长数据 AC0数据指针(X)AR0结构体 父函数在本地堆栈中分配相应大小的空间。父函数将该空间地址作为第一个隐含参量传送给子函数,这个参数被
25、看成一个数据指针。,(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);,例,寄存器参量传递规则
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DSP_C 语言程序设计 课件

链接地址:https://www.31ppt.com/p-1284299.html