dsp-第6章-C54x的C语言程序设计.ppt_第1页
dsp-第6章-C54x的C语言程序设计.ppt_第2页
dsp-第6章-C54x的C语言程序设计.ppt_第3页
dsp-第6章-C54x的C语言程序设计.ppt_第4页
dsp-第6章-C54x的C语言程序设计.ppt_第5页
免费预览已结束,剩余66页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、2020年7月28日,DSP原理及应用,1,第6章 TMS320C54xC语言程序设计,内容提要 C54x的程序设计语言可以选择:汇编语言和C语言。 汇编语言的优点:程序执行效率高,硬件定时准确; 缺点:程序不够直观,可移植性和可维护性差 C语言特点:可移植性和可维护性好 程序设计是应用软件设计的基础,主要任务是利用C指令和伪指令编写源程序以完成指定的功能。 本章重点介绍DSP的C语言程序设计的特点、DSP C语言编程的设计技巧、C与汇编的混合编程实现等,2020年7月28日,DSP原理及应用,2,第6章 TMS320C54xC语言程序设计,6.1 C54x C语言介绍 6.2 C54x C语

2、言编程 6.3 C54x C代码优化,2020年7月28日,DSP原理及应用,3,第6章 TMS320C54xC语言程序设计,6.1 C54x C语言介绍,C54x C编译器支持美国国家标准委员会 (American Nation Standards Institute ,ANSI)开发的C语言标准。,2020年7月28日,DSP原理及应用,4,第6章 TMS320C54xC语言程序设计,概括地讲,C54x C继承了ANSI C的大部分基本特征,只要与硬件不是特别相关的部分都是它们的相同点。 C54x C继承了ANSI C结构化程序设计的基本思想,以函数作为基本单位,函数的定义和引用方式完全一

3、致,大部分变量、常量、数组、结构体、枚举、联合体、指针的定义语法结构也完全一致,局部变量、全局变量、静态变量、动态变量等基本定义也一致,宏定义、宏展开、宏调用的思想语法规则基本一致。,6.1.1 C54x C与ANSI C的相同点,2020年7月28日,DSP原理及应用,5,第6章 TMS320C54xC语言程序设计,1. 常量定义,6.1.1 C54x C与ANSI C的相同点,格式:const 类型 符号=数值;,例6-1 const short d1=8;,C54x C也可以用下面的方法定义符号常量 #define d1 8;/程序中出现d1时均会以8来代替,2020年7月28日,DSP

4、原理及应用,6,第6章 TMS320C54xC语言程序设计,2. 变量定义,1)一般变量的定义 格式:类型 符号;,例6-2 char ch_1;/定义了一个字符变量,名字为ch_1 short sh_1; /定义了一个短整型变量,名字为sh_1 long 1_dat1;/定义了一个长整型变量1_dat1 int *pi_1; /定义了一个指向整型数据的指针变量, 名字为pi_1 Short sh_a10;/定义了一个短整型数组,数组的长 度为10,2020年7月28日,DSP原理及应用,7,第6章 TMS320C54xC语言程序设计,2)扩展变量的定义,struct str_t /定义一个结

5、构类型str_t short sh_a; long l_b; float f_c; struct str_t str_a;/定义一个str_t型结构变量str_a,2020年7月28日,DSP原理及应用,8,第6章 TMS320C54xC语言程序设计,3)自定义变量的定义,格式:typedef 已有类型 新数据类型,例6-3 typedef unsigned short US_DATA; US_DATA ush_t; 等同于: unsigned short ush_t; 或者:#define US_DATA unsigned short;,2020年7月28日,DSP原理及应用,9,第6章 T

6、MS320C54xC语言程序设计,3.函数的定义和组织,C54x C和ANSI C一样,整个程序有一个主函数 (main函数)和零个或者多个子函数构成,如下所示:,float sub_cac(float a, float b);/子函数声明 void main()/主函数定义,整个程序内有且只有一个 float a=1; float b=2; float c; c=sub_cac(a,b);/子函数调用 while(1) /死循环,等待外部事件发生 ,2020年7月28日,DSP原理及应用,10,第6章 TMS320C54xC语言程序设计,float sub_cac(float e,float

7、 f)/子函数定义 float g; g=e*f; return g; ,除此之外,C54x C的算术运算符、关系运算符、逻辑运算符、 位操作运算符,包括运算符之间的优先级和综合性等也都和 ANSI C一样,函数语句的组织也分成顺序结构、分支结构、 循环结构等。,2020年7月28日,DSP原理及应用,11,第6章 TMS320C54xC语言程序设计,6.1.2 C54x C与ANSI C的不同点,C54x C与ANSI C的不同点总的来说有以下几个方面:,1. 所处理数据的性质不同 面向PC机的ANSI C所处理的数据是一些采集好 的、数据量较多的、以数据块为单位的数据。对这 些数据的处理实

8、时性要求并不是很高。 C54x C 的编程对象C54x DSP工作于实时性处 理场合,对于处理时间有比较严格的实时性要求。,2020年7月28日,DSP原理及应用,12,第6章 TMS320C54xC语言程序设计,2.数据出输入输出设备不同,C54x C处理的数据来自于实时采集数据,数据 处理的结果通过通信口传递给其他计算机或者芯片 (如MCU、ARM等)使用,或者通过D/A输出。,面向PC机的ANSI C所处理的数据来自硬盘、内存等存储介质,或者是键盘的输入。其输出是显示器、通信口或者实时输出。对人机界面提出了较高的要求。,2020年7月28日,DSP原理及应用,13,第6章 TMS320C

9、54xC语言程序设计,3.“死循环”的对待上不同,面向PC机的ANSI C程序,最怕的事情就是程序 内部出现“死循环”。,C54x C在系统初始化之后安排“死循环”,在“死循环”内等待各种中断事件(如外部中断事件、定时器中断事件、通信口的中断事件等)的发生。,2020年7月28日,DSP原理及应用,14,第6章 TMS320C54xC语言程序设计,4.语法及数据结构细节上的不同,(1)C54x的C语言数据类型及其表示范围,由于C54x是一种16位定点DSP,所处理的数据一般都是以字(word ,16bit)为单位,而对于小于16位的数据的运算,需要配合逻辑和以为运算来完成。,C54x编译器将1

10、6位数据定义成最短的数据表示类型,如signed char, char, unsigned char, short, signed short, int, signed int, enum, unsigned int,* 指针都是16位数据,与ANSI C有较大区别。,2020年7月28日,DSP原理及应用,15,第6章 TMS320C54xC语言程序设计,对于16位表示范围不够的数据,C54x编译器安排 了32位的数据类型,32位的数据包括long, signed long, float, double, long double。这也是表示范围最 大的一种数据类型。与ANSI C有较大区别。

11、,2020年7月28日,DSP原理及应用,16,第6章 TMS320C54xC语言程序设计,(2)C54x的C语言特有数据类型,C54x的C语言除了从ANSI C继承了一些既有数据类型,在表示方法上作了少许调整。为了便于C语言直接对DSP硬件进行操作,C54x的C语言还扩展了一些专用或者说是特有的数据类型。,1)地址变量,在DSP的C语言程序中,经常需要对某一个存储单元进行访问,这个存储单元可能是普通的数据存储器单元,也可能是存储器映像寄存器。对于他们的访问必须明确指出其地址,为此C54x的C语言编译器设置一种地址变量来实现对这些指定数据存储单元的访问。,2020年7月28日,DSP原理及应用

12、,17,第6章 TMS320C54xC语言程序设计,1)地址变量,所谓的地址变量实际上就是指定了具体地址的指针变量。,为了防止编译器将其优化掉(C54x编译器在对程 序进行优化时,会将定义了但从来没有使用的变量 优化掉,以便节省存储空间),往往需要用 volatile关键字进行说明,如:,volatile short *mcbsp0_drr10=0 x10; short sh_drr10_data; sh_drr10_data=*mcbsp0_drr10,2020年7月28日,DSP原理及应用,18,第6章 TMS320C54xC语言程序设计,2)I/O端口变量,C54x的存储空间有三个:程序

13、存储空间、数据存储空间和I/O空间。为了实现C访问DSP的I/O空间,C54x C语言规定了一种I/O端口变量,对这些端口变量的访问就是对I/O空间的访问。I/O端口变量的定义格式如下:,ioport 数据类型 porthex_num; 其中, ioport:端口变量定义关键字;数据类型:只能是char, short, int, unsigned等16位类型;hex_num:该I/O端口的16进制表示的端口地址。,2020年7月28日,DSP原理及应用,19,第6章 TMS320C54xC语言程序设计,2)I/O端口变量,例如: ioport short port100;/定义了一个端口变量

14、,端口地址是100h,端口变量定义好后,对这些变量的访问在形式上和普通的变量没有太大区别,如: short sh_1,sh_2;/定义了两个短整型变量 sh_1=port100;/端口读操作 port100=sh_2;/端口写操作,2020年7月28日,DSP原理及应用,20,第6章 TMS320C54xC语言程序设计,I/O变量可以和其他变量一样参加任何的表达式运算,例如: short s1,s2; s1=0 x55; s2=port100+s1; /从100端口读数据,将所读到的数据和s1加在一起,结果送s2,2020年7月28日,DSP原理及应用,21,第6章 TMS320C54xC语言

15、程序设计,需要注意的是:一般情况下I/O变量的读写速度 有快有慢,快的和CPU的处理速度差不多,慢的和CPU 的处理速度差距非常大。对于读写速度慢的I/O变量 的读写,需要在程序中通过调用不同的延时程序实现延时。,2020年7月28日,DSP原理及应用,22,第6章 TMS320C54xC语言程序设计,DSP的C语言扩展了寄存器变量。在一个C函数内部最多可以使用两个寄存器变量,编译器在编译这两个寄存器变量时用AR6和AR7这两个辅助寄存器分别做了对应:,3)寄存器变量,AR6被赋给第一个寄存器变量 AR7被赋给了第二个寄存器变量,寄存器变量的定义格式: register type AR6 或

16、register type AR7,2020年7月28日,DSP原理及应用,23,第6章 TMS320C54xC语言程序设计,1)变量的初值问题,(3)DSP C语言关于变量的特殊规定,ANSI C语言规定:没有显式初始化的变量都将初始化为0 DSP的C语言规定:没有显式初始化的变量仍保持未初始化状态,2020年7月28日,DSP原理及应用,24,第6章 TMS320C54xC语言程序设计,例如: int sum; int a8 =1,2,3,4,5,6,7,8; for(i=0;i8;i+) sum=sum+ai;,在PC机上运行的结果为sum=36。,注意:在DSP上运行,结果可能不是su

17、m=36。 因为变量sum没有初始化,初始值是未知的。,2020年7月28日,DSP原理及应用,25,第6章 TMS320C54xC语言程序设计,DSP的C语言规定,有符号数的右移等价于算术右移,即右移时符号位会扩展,这样右移一位相当于除2,对于除2或2的整数次方的运算,应该用移位来实现,这样实现的除法代码运行效率最高。,2)有符号数的右移,2020年7月28日,DSP原理及应用,26,第6章 TMS320C54xC语言程序设计,对于无符号整数除法和取余运算,标准C做了规定,3)除法和取余,例如: 10/3=3, 10%3=1,对于有符号整数除法和取余运算没有硬性规定,例如: -10%3=-1

18、, -10%3=1,而DSP的C语言做了如下规定:,10/-3=-3, 10%-3=1 -10/3=-3,-10%3=-1,即:余数的符号与被除数的符号保持一致,2020年7月28日,DSP原理及应用,27,第6章 TMS320C54xC语言程序设计,浮点数转换到整数时,DSP的C语言采用朝0截止的方式,即简单地去掉分数部分。(标准C可以选择是向下截取取比该浮点数小的最大整数,向上截取取比该浮点数大的最小整数,还是简单截止DSP的C语言采用的方式),4)浮点数转换到整数,例如:int a,b a=1.3; a=1 b=-1.3; b=-1,2020年7月28日,DSP原理及应用,28,第6章

19、TMS320C54xC语言程序设计,5)多字符常量,标准C规定:字符用单引号括起来,其本质是代表一个整数,如: char c=r; 标准C还允许单引号内包含多个字符,通常取里面的第一个或最后一个字符有效,没有硬性规定。,TI公司的DSP C语言规定取最后一个字符有效: 例如: abc=c,2020年7月28日,DSP原理及应用,29,第6章 TMS320C54xC语言程序设计,6)16位数相乘,DSP C语言规定:16位数相乘,如果只想获得乘积结果的高16位(如Q15格式数据相乘仍然可以用Q15来表示),可通过把乘积结果右移16位来获得。,例如:int m1,m2,result1; unsig

20、ned m3,m4,result3; result1=(long)m1*m2)16;/16位*16位结 果应用32位表示 result3=(unsigned long)m3*m4)16;,2020年7月28日,DSP原理及应用,30,第6章 TMS320C54xC语言程序设计,这里的m1*m2的中间结果作了强制long转换,是为了防止有效数据位的丢失。,2020年7月28日,DSP原理及应用,31,第6章 TMS320C54xC语言程序设计,6.2.1 C54x C语言开发的存储器结构,1.C54x C语言开发的段结构 C编译器对C语言源程序进行编译后产生汇编程序,汇编程序再经过汇编将成为CO

21、FF格式的目标文件,该文件将包含七个可以进行重新定位的代码和数据段,他们是:,6.2 C54x C语言编程,2020年7月28日,DSP原理及应用,32,第6章 TMS320C54xC语言程序设计,已初始化段:,(1).text段,包含了可执行代码。 (2).cinit段,包含明显初始化的全局变量和静态变量。 (3).const段,包含字符串常数和全局变量。 (4).switch段,包含大型switch语句的跳转表,未初始化段 (1).bss段,包含了未初始化的全局变量和静态变量 (2).stack段,定义软件堆栈 (3).system段,为动态存储器函数malloc,calloc,reall

22、oc(这些函数由运行支持库提供)分配存储器空间,2020年7月28日,DSP原理及应用,33,第6章 TMS320C54xC语言程序设计,(1) 已初始化段,1).cinit段 DSP的C语言全局变量和静态变量,其存储单元定义在段.bss中,需要显式初始化的值存放在段.cinit中。在DSP上电时,系统初始化函数(bootloader)会自动调用段.cinit的值来初始化段.bss。对于没有显式定义初始化值的,则保持未初始化状态。,2020年7月28日,DSP原理及应用,34,第6章 TMS320C54xC语言程序设计,例如:假设在C程序中定义了两个初始化变量:,int a=45; int b

23、5=2,3,4,5,6;,则这两个变量的初始化信息如下: .sect “.cinit”; 初始化段 *变量a的记录* .word 1 ;数据长度为1 .word _a;.bss中的地址 .word 45;数据,2020年7月28日,DSP原理及应用,35,第6章 TMS320C54xC语言程序设计,*变量b的记录* .word 5;数据长度为1 .word _b;.bss中的地址 .word 2,3,4,5,6;数据,2).switch 段,当C语言程序中有分支语句switch时,如: int i; int function( ) switch(i) case 1; return 1;,202

24、0年7月28日,DSP原理及应用,36,第6章 TMS320C54xC语言程序设计,break; default; return 0; break; ,C语言程序经过编译将产生.switch段,该段记录 了开关变量和相应开关值,以及需要执行的程序起始 位置的对应关系。,2020年7月28日,DSP原理及应用,37,第6章 TMS320C54xC语言程序设计,(2)未初始化段,1).stack段,.stack段定义了软件堆栈,该堆栈用于函数调用、变量传递以及局部变量分配。软件堆栈的大小由连接器选项-stack后面的数值规定(如-stack 40 规定了栈的大小为40字),如果没有规定,则默认大小

25、为400h即1K。,注意:C编译器并不提供检查堆栈溢出的手段,因此,必须保证有足够的空间由于堆栈,否则,发生溢出现象将破坏程序的运行环境,从而导致程序的瘫痪。,2020年7月28日,DSP原理及应用,38,第6章 TMS320C54xC语言程序设计,2) . system段,. system段为动态存储器函数malloc,calloc, realloc(这些函数由运行支持库提供)分配存储器空间。若C程序没有使用这些函数,编译器就不创建.system段。,(3)自定义段,除了C编译器所产生的标准段:.text, .cinit, .const, .switch, .bss, .stack, .sy

26、stem段外,用户还可以利用progma伪指令来产生其他的自定义段。,2020年7月28日,DSP原理及应用,39,第6章 TMS320C54xC语言程序设计, CODE_SECTION pragma,如果用户想将程序中的代码(如函数)编译成不同于.text段的其他段,并链接到不同于.text段的独立区域,就可以使用CODE_SECTION pragma伪指令。其语法结构为:,# pragma CODE_SECTION (symbol,“section name”),这里 ,section name代表了要产生的段名,而symbol代表了要汇编到该段的符号(如函数名)。,2020年7月28日,

27、DSP原理及应用,40,第6章 TMS320C54xC语言程序设计,DATA_SECTION pragma,如果用户想将程序中的部分数据编译成不同于.bss段的其他段,并链接到不同于.bss段的独立区域,就可以使用DATA_SECTION pragma伪指令。其语法结构为:,# pragma DATA_SECTION (symbol,“section name”),这里 ,section name代表了要产生的段名,而symbol代表了要汇编到该段的符号(如变量名)。,2020年7月28日,DSP原理及应用,41,第6章 TMS320C54xC语言程序设计,2. C54x C语言开发的存储器结

28、构,(1)段的存储器定位,DSP的C语言程序经过编译器编译后生成一些段,如已初始化的.text,.cinit, .const, switch段和未初始化的.bss, .stack, .system段,还有一些自定义段,这些段在链接时必须指定相应的存储位置。,2020年7月28日,DSP原理及应用,42,第6章 TMS320C54xC语言程序设计,2020年7月28日,DSP原理及应用,43,第6章 TMS320C54xC语言程序设计,DSP编译器支持两种存储器模式:小存储器模式 (little endian)和大存储器模式(big endian);,(2)存储器模式,小存储器模式:编译器默认的

29、存储器模式。这要求 .bss在128个字(一个数据页)范围内,这样编译器 在编译成汇编时,不需要修改DP的值,程序代码简单 ,运算效率高。,大存储器模式:对.bss大小没有限制,访问变量 时需要首先确定DP值,这将增加指令访问周期,2020年7月28日,DSP原理及应用,44,第6章 TMS320C54xC语言程序设计,6.2.2 C54x C语言开发的函数及其约定,DSP的C语言和基本C的开发一样,也是采用函数作为主体的模块化程序设计方法。同样也是以main函数作为主函数,其他功能函数作为子函数,函数的定义函数的声明和函数的调用方法,从形式上都是一样的。 而对于函数的参数传递,不同的计算机结

30、构确定了不同种类甚至不同信号的计算机,其C语言函数在参数传递的实现上也是有一定的差异的。,2020年7月28日,DSP原理及应用,45,第6章 TMS320C54xC语言程序设计,1.C54x C语言开发的寄存器约定规则,编译器的寄存器约定规则规定了在函数内如何使用寄存器,以及在函数之间相互调用时如何保存(或称为保护)这些寄存器的值。 寄存器值的保存分成两种基本类型,即入口保存和调用保存。,2020年7月28日,DSP原理及应用,46,第6章 TMS320C54xC语言程序设计,调用保存(save-on-call) :为了防止调用函数所使用的寄存器的值被调用函数更改掉,在调用被调用函数之前,由

31、调用函数负责将这些寄存器的值进行保护,因此称为“调用保存”。 如:AR0、AR2-AR5、A、B、T、BRC,入口保存(save-on-entry:当被调用函数需要使用某个寄存器时,这些寄存器原来的值由被调用函数负责保存。这些寄存器值的保护,一般放置在被调用函数的入口处,因此称为“入口保存”。 如:AR1、AR6、AR7,2020年7月28日,DSP原理及应用,47,第6章 TMS320C54xC语言程序设计,2.C54x C语言开发的函数调用规则,C54x C编译器规定了一组严格的函数调用规则,任何调用C函数或被C调用的函数都必须遵循这些规则,否则,就会破坏C环境,造成不可预测的结果。 假定

32、有一个函数function1,它接收了调用者传递给它的参数,它自己有自己的局部变量,它还要调用另一个函数function2,function1也需要传递参数给function2,并从function2中返回计算结果。,2020年7月28日,DSP原理及应用,48,第6章 TMS320C54xC语言程序设计,其调用关系是: main( ) function1() function2(),2020年7月28日,DSP原理及应用,49,第6章 TMS320C54xC语言程序设计,3.C54x C语言开发的标识符命名约定和混合语言编程,约定: C编译器在编译C语言程序时,会自动在所有标识符(函数名、变

33、量名等)之前加下划线“_”,比如在C程序中定义的变量x,则编译以后的汇编程序里面会成为_x,在汇编程序中使用该变量,变量的标号应该是_x。,汇编程序中定义一个标识符_x,C语言程 序调用是x,而不是_x,2020年7月28日,DSP原理及应用,50,第6章 TMS320C54xC语言程序设计,(1)在C中访问.bss中定义的汇编变量,1)在C中访问.bss中定义的汇编变量,汇编程序: .bss _var,1 ;定义变量 .global _var ;说明为外部变量 C程序: extern int var; /*声明为外部变量*/ var=1; /*访问外部变量*/,2020年7月28日,DSP原

34、理及应用,51,第6章 TMS320C54xC语言程序设计,2)在C中访问汇编常数。,汇编程序: .global _table_size ;说明为外部变量 _table_size .set 10000 ;定义常数 C程序: extern int table_size; /*声明为外部变量*/ for(i=0;itable_size;i+) ,2020年7月28日,DSP原理及应用,52,第6章 TMS320C54xC语言程序设计,3)在C中访问汇编常数表,汇编程序: .global _sine ;说明为外部变量 .sect “sine_tab” ;定义命名段 _sine: .word 0 .w

35、ord 1*32768/100 .word 2*32768/100 .word 2*32768/100,2020年7月28日,DSP原理及应用,53,第6章 TMS320C54xC语言程序设计,C程序: extern int sine; /*声明为外部变量*/ int *sine_pointer=sine; /*访问外部变量*/ float f; f=(float)sine_pointer2/32768;,2020年7月28日,DSP原理及应用,54,第6章 TMS320C54xC语言程序设计,(2)在汇编程序中访问C变量的例子,1)在汇编中访问C中定义的全局变量。 C程序: int i; /

36、*全局变量*/ main( ) 汇编程序: .global _i ;说明为外部变量 STM _i,AR0 ;AR0=i,2020年7月28日,DSP原理及应用,55,第6章 TMS320C54xC语言程序设计,2)在汇编中访问C中定义的全局数组,C程序: int h20; /*全局数组变量*/ main( ) ,2020年7月28日,DSP原理及应用,56,第6章 TMS320C54xC语言程序设计,汇编程序: .global _h ;说明为外部变量 .data h_add .word _h ;数组h的起始地址 .text STM h_add,AR0 RPTZ A, #19 ST A,*AR0

37、+,2020年7月28日,DSP原理及应用,57,第6章 TMS320C54xC语言程序设计,(3)在C中访问汇编函数,C程序: extern int asmfunc( ); /*定义外部的汇编 函数*/ int gvar; /*定义全局变量*/ main( ) int i; i=samfunc(i); /*调用函数*/ ,2020年7月28日,DSP原理及应用,58,第6章 TMS320C54xC语言程序设计,汇编程序,FP .set AR7 .mmregs ;使能存储器映像寄存器 .global _asmfunc ;说明为外部函数 .global _gvar ;C中定义的变量 .text

38、_asmfunc: FRAME #-1 ;(SP)-1SP,形成局部帧 NOP ;避免流水线冲突 STL A, SP ;参数i暂存到SP ADD (_gvar),A ;将参数与gvar相加 STL A, (_gvar) ;保存至gvar FRAME #1 ;(SP)+1SP,撤销局部帧 RET ;函数返回,2020年7月28日,DSP原理及应用,59,第6章 TMS320C54xC语言程序设计,(4)在C中使用内嵌汇编,在C程序中内嵌汇编语句是一种直接的C模块和汇编模块接口方法。采用这种方法一方面可以在C程序中实现用C语言难以实现的一些硬件控制功能;另一方面,也可以用这种方法在C程序中的关键部

39、分用汇编语句代替C语句以优化程序。,格式:asm(“ 汇编语句”) 如:asm(“ SSBX INTM”),2020年7月28日,DSP原理及应用,60,第6章 TMS320C54xC语言程序设计,注意: (1)” ”内的内容要符合汇编语言语法规则 例如:标号要从头开始 (2)这种方式交易破坏C环境,汇编出错编译器查不出; (3)插入跳转、标号可能导致C代码出错; (4)不要在内嵌汇编中改变C变量的值; (5)不要在内嵌汇编中更改汇编环境的设置。因为改变可 能与C编译器的设置有冲突。,2020年7月28日,DSP原理及应用,61,第6章 TMS320C54xC语言程序设计,6.2.3 C54x

40、 C语言中断处理函数的实现,1.C语言中断函数的定义,C语言中断函数的定义有两种实现方法,如下:,(1)c_intd 函数 C编译器约定,任何具有名为c_intd(d为09)的函数都被假定为一个中断程序。如:,void c_int1() ,2020年7月28日,DSP原理及应用,62,第6章 TMS320C54xC语言程序设计,这种定义的中断函数每个中断都采用固定的处理程序名。其中c_int0函数是系统复位的中断处理程序,主要用来完成系统上电后的初始化。该函数是rts.lib库函数来完成的,不用编写。 缺点:可以定义的中断处理函数数目较少(只有9个),另外,函数名称与其功能的对应关系不够直观。

41、因此,除了c_int0函数外,一般不建议使用这种定义方法。,2020年7月28日,DSP原理及应用,63,第6章 TMS320C54xC语言程序设计,(2 ) interrupt 函数 中断函数定义的另一种实现方法就是利用interrupt关键字,将该关键字后面所定义的函数声明为中断函数,当编译器编译该函数时,就会把该函数编译成中断处理函数。,void interrupt isr() ,采用这种方法,可以对每种中断服务函数的功能,给它起一个有意义的名称,非常直观,同时,中断服务函数的个数也没有严格的限制。,2020年7月28日,DSP原理及应用,64,第6章 TMS320C54xC语言程序设计,2.关于C语言

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论