DSP_C语言程序设计

上传人:xmg****18 文档编号:117488441 上传时间:2019-12-05 格式:PPT 页数:81 大小:4.77MB
返回 下载 相关 举报
DSP_C语言程序设计_第1页
第1页 / 共81页
DSP_C语言程序设计_第2页
第2页 / 共81页
DSP_C语言程序设计_第3页
第3页 / 共81页
DSP_C语言程序设计_第4页
第4页 / 共81页
DSP_C语言程序设计_第5页
第5页 / 共81页
点击查看更多>>
资源描述

《DSP_C语言程序设计》由会员分享,可在线阅读,更多相关《DSP_C语言程序设计(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软件开发平台 l汇编语言依赖于计算机硬件,程序的可读性和 可移植性比较差。一般高级语言具有很好的可 移植性,但是难以实现汇编语言的某些功能( 如对内存地址的操作、位操作等)。 lC/C+语言作为一种高级语言,既可以访问物 理地址又可以进行位操作,能直接对硬件进行 操作,适合用作DSP开发语言。 6.1.1 C/C+语言概况 6.1 C55X C/C+语言概述

2、 6.1.2 C55x C/C+语言概况 lC55x C/C+编译器全面支持ANSI C/C+ 语言标准,能够把按照标准ANSI C/C+ 规范编写的源程序进行全面优化,编译成 C55x 汇编语言源程序。 lC55x C/C+编译器工具拥有完整的实时 运行库,所有的库函数均符合ANSI库标准 。 6.2.16.2.1 C C语言中的数据类型语言中的数据类型 C55x C55x支持下列数据类型包括字符、定点数、浮支持下列数据类型包括字符、定点数、浮 点数、指针等。点数、指针等。 6.2 6.2 C55X C/C+语言编程基础 类类型长长度内容最小值值最大值值 signed char(有符号 字符

3、) 16位ASCII 码码 -3276832767 unsigned char (无符号字符) 16位 ASCII 码码 065535 short, signed short( 短整型) 16位 二进进制 补补 码码 -3276832767 unsigned short(无 符号短整型) 16位 二进进制 数 065535 类类 型长长 度内 容最 小 值值最 大 值值 int, signed int(整型) 16位 二进进制 补码补码 3276832767 unsigned int(无符号 整型) 16位 二进进制 数 065535 long, signed long(长长 整型) 32位

4、二进进制 补码补码 2 147 483 648 2 147 483 647 unsigned long(无符号 长长整型) 32位 二进进制 数 04 249 967 295 long long(40位长长整型 ) 40位 二进进制 补码补码 549 755 813 888 549 755 813 887 unsigned long long(40 位无符号长长整型) 40位 二进进制 数 0 1 099 511 627 775 emum(枚举举型) 16位 二进进制 补码补码 3276832767 float(浮点型) 32位 32位浮 点数 1.175 494e38 3.40 282 34

5、6e+38 类类 型长长 度 内 容最 小 值值最 大 值值 double(双精度浮点 数) 32位 32位浮 点数 1.175 494e38 3.40 282 346e+38 long double(长长双 精度浮点数) 32位 32位浮 点数 1.175 494e38 3.40 282 346e+38 大存储储器模式23位二进进制 数 00x7FFFFF pointers(程序指针针 ) 24位二进进制 数 00xFFFFFF 6.2.16.2.1 C C语言中的数据类型语言中的数据类型 6.2.2 关键字 1. const lC55x C编译器支持标准C语言的const关键字。 l将这个

6、关键字使用到对任意变量或数组的定义上 可以确保它们的值不改变。 l如果定义一个对象为const,那么const段就会为 该对象分配存储空间。使用const关键字可以定义 大常数表并将它们分配到系统ROM中。 6.2 6.2 C55X C/C+语言编程基础 例: 6.2.2 关键字 int * const p= const int *q= 定义指向变量int的常量指针p 定义指向常量int的变量指针q 2. 2. ioportioport关键字关键字 1.1.ioportioport关键字可以用在关键字可以用在数组、结构、联合数组、结构、联合以及以及枚枚 举举类型当中。类型当中。 2. 2. 当

7、用在数组中时,当用在数组中时,ioportioport限制的数组单元而非数组类型限制的数组单元而非数组类型 本身;本身; 3. 3. ioportioport类型只能用来声明类型只能用来声明全局或静态变量全局或静态变量,如果在,如果在本本 地地变量中使用变量中使用ioportioport类型,则变量必须用类型,则变量必须用指针指针声明。声明。 6.2.2 6.2.2 关键字关键字 注意: 例,ioport关键字的使用。 ioport int k void foo(void) ioport int i ioport int *j 6.2.2 6.2.2 关键字关键字 ; /*正确* / ; /*

8、错误* / ; /*正确* / 例:定时器初始化例程 void TIMER_init(void) ioport unsigned int *tim0; ioport unsigned int *prd0; ioport unsigned int *tcr0; ioport unsigned int *prsc0; tim0 = (unsigned int *)0x1000; prd0 = (unsigned int *)0x1001; tcr0 = (unsigned int *)0x1002; prsc0 = (unsigned int *)0x1003; *tcr0 = 0x04f0; *

9、tim0 = 0; *prd0 = 0x0ffff; *prsc0 = 2; *tcr0 = 0x00e0; 3. interrupt3. interrupt关键字关键字 关键字关键字 “ “interruptinterrupt” ”-定义中断函数定义中断函数 注意:注意: 1.1.当当C/C+C/C+代码被中断时,中断程序必须保存所有与程序代码被中断时,中断程序必须保存所有与程序 有关的寄存器。有关的寄存器。 2.2.当使用当使用“ “interruptinterrupt” ”关键字定义函数时,中断函数必须关键字定义函数时,中断函数必须 返回空并且没有参数传递。返回空并且没有参数传递。 3.

10、3.中断函数可以定义本地变量并且使用堆栈。中断函数可以定义本地变量并且使用堆栈。 4. c_int00是C/C+程序的入口点,这个函数名被系统 复位中断保留,该中断服务程序用来初始化系统并调用main 函数。 关于中断的几个要点: 中断服务程序不能 被普通C代码调用 。 关键字 例:中断服务程序 Void INTR_init( void ) IVPD=0xd0; IVPH=0xd0; IER0=0x10; DBIER0 =0x10; IFR0=0xffff; asm(“ BCLR INTM“); interrupt void timer( ) . 无参数 设置中断寄存器IER0 保存中断入口的

11、现场信息(所用 寄存器或全部寄存器) 通过.sect指令创建中 断向量表。 .sect “.vectors“ .ref _c_int00 .ref _timer rsv: B _c_int00 NOP .align 8 nmi: .loop 8 nop .endloop int0:.loop 8 nop .endloop int2: B _timer nop .align 8 tint:B _timer nop .align 8 在汇编语言中,中断程序名前 加下划线,如 _timer。 关于中断的几个要点: 中断处理程序可以处理单个中 断或多个中断,c_int00除外 保存中断入口的现场信息

12、(所用寄存器或全部寄存器 ) onchiponchip关键字关键字-定义的指针所指向的数据在定义的指针所指向的数据在片片 上内存上内存 例:用例:用onchiponchip定义数组和指针定义数组和指针 onchip int x100;onchip int x100; /* array declaration */ /* array declaration */ onchip int *p; onchip int *p; /* pointer declaration */* pointer declaration */ 4 onchip4 onchip关键字关键字 6.2.2 6.2.2 关键字

13、关键字 volatile-存储器访问 l定义格式: register 变量类型 变量名 l变量类型: l整型、浮点型和指针类型 register 6.2.4 asm指令 -插入一条汇编指令 l指令格式: asm (“assembler text”); main() int i; unsigned int uWork; while ( 1 ) for ( i=0;ii,i=T0 RET; 在定义汇编函数时,在函 数名前加下划线“_”. 声明为外部函数 3: 在C代码中访问汇编语言变量 l访问.bss段或.usect段中没有初始化的变量: u使用.bss或.usect指令来定义变量 u使用.glo

14、bal指令来定义为外部变量 u在汇编语言中的变量前加下划线“_” u在C代码中声明变量为外部变量并正常地访问它 (b)C程序: extern int var;/* 外部变量 */ var = 1;/* 使用变量 */ (a)汇编语言程序: .bss var,1;定义变量 .gloabal var;声明变量为外部变量 l非.bss段中变量访问-定义指向该变量的指针 u定义变量 u声明一个指向该变量起始地址的全局指针 u在程序中,必须先声明该对象为extern型。 3: 在C代码中访问汇编语言变量 (a)汇编程序: .global _sine .sect ”sine_tab” _sine: .fl

15、oat 0.0 .float 0.015987 .float 0.022145 (b)C程序: extern float sine ; float *sine_p=sine; f=sine_p2; 4. 在C语言中访问汇编语言常数 l使用.set和.global指令定义汇编语言全局常数 。 l使用定义常量 .global _table_size ;定义该常量为全局常量 例: (b)语言程序: extern int table_size; #define TABLE_SIZE (int)(iTABLE_SIZE;+i) C和汇编语言的接口注意: (1 1) 如果用汇编语言编写中断例程,则需要保存

16、在如果用汇编语言编写中断例程,则需要保存在 中断例程中使用的所有寄存器。中断例程中使用的所有寄存器。 (2 2)如果在汇编程序中调用如果在汇编程序中调用C/C+C/C+函数,则只有特定函数,则只有特定 的寄存器在的寄存器在C/C+C/C+中被保存,而其他寄存器则可能被中被保存,而其他寄存器则可能被 C/C+C/C+函数改变。函数改变。 (3)(3)编译器所默认的编译器所默认的CPLCPL值为值为1 1,即采用间接、绝对方式,即采用间接、绝对方式 寻址,如果在汇编函数中寻址,如果在汇编函数中CPLCPL被设置为被设置为0 0,在函数返回,在函数返回 时应当把这个值改为时应当把这个值改为1 1。 例:利

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 大杂烩/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号