dspCx的C语言程序设计实用教案

上传人:pu****.1 文档编号:568835484 上传时间:2024-07-27 格式:PPT 页数:72 大小:2.20MB
返回 下载 相关 举报
dspCx的C语言程序设计实用教案_第1页
第1页 / 共72页
dspCx的C语言程序设计实用教案_第2页
第2页 / 共72页
dspCx的C语言程序设计实用教案_第3页
第3页 / 共72页
dspCx的C语言程序设计实用教案_第4页
第4页 / 共72页
dspCx的C语言程序设计实用教案_第5页
第5页 / 共72页
点击查看更多>>
资源描述

《dspCx的C语言程序设计实用教案》由会员分享,可在线阅读,更多相关《dspCx的C语言程序设计实用教案(72页珍藏版)》请在金锄头文库上搜索。

1、2024年7月27日DSP原理(yunl)及应用1第第6 6章章 TMS320C54xC TMS320C54xC语言程序设计语言程序设计(chn x sh (chn x sh j) j) 6.1 C54x C6.1 C54x C6.1 C54x C6.1 C54x C语言介绍语言介绍(jisho) (jisho) (jisho) (jisho) 6.2 C54x C6.2 C54x C6.2 C54x C6.2 C54x C语言编程语言编程 6.3 C54x C6.3 C54x C6.3 C54x C6.3 C54x C代码优化代码优化第1页/共71页第一页,共72页。2024年7月27日DS

2、P原理(yunl)及应用2第第第第第第6 6 6 66 6章章章章章章 TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计(chn(chn(chn(chn(chn(chn x sh j) x sh j) x sh j) x sh j) x sh j) x sh j)6.1 C54x C6.1 C54x C语言介绍(jisho)(jisho) C54x CC54x C编译器支持美国国家标准委员会编译器支持美国国家标准委员会(Ameri

3、can Nation Standards Institute American Nation Standards Institute American Nation Standards Institute American Nation Standards Institute ,ANSIANSIANSIANSI)开发的)开发的C C语语言标准。言标准。第2页/共71页第二页,共72页。2024年7月27日DSP原理(yunl)及应用3第第第第第第6 6 6 66 6章章章章章章 TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54x

4、C TMS320C54xC语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计(chn(chn(chn(chn(chn(chn x sh j) x sh j) x sh j) x sh j) x sh j) x sh j) 概括地讲,概括地讲,C54x CC54x CC54x CC54x C继承了继承了ANSI CANSI CANSI CANSI C的大部分基本特征,只要与的大部分基本特征,只要与硬件不是特别相关的部分都是它们的相同点。硬件不是特别相关的部分都是它们的相同点。 C54x C C54x C C54x C C54x C继承了继承了ANSI CANSI CANSI

5、 CANSI C结构化程序设计的基本思想,以函数结构化程序设计的基本思想,以函数作为基本单位,函数的定义和引用方式完全一致,大部分变量、作为基本单位,函数的定义和引用方式完全一致,大部分变量、常量、数组、结构体、枚举、联合体、指针常量、数组、结构体、枚举、联合体、指针(zhzhn)(zhzhn)(zhzhn)(zhzhn)的定义语的定义语法结构也完全一致,局部变量、全局变量、静态变量、动态变量法结构也完全一致,局部变量、全局变量、静态变量、动态变量等基本定义也一致,宏定义、宏展开、宏调用的思想语法规则基等基本定义也一致,宏定义、宏展开、宏调用的思想语法规则基本一致。本一致。6.16.1.1 1

6、 C54x CC54x C与与ANSI CANSI C的相同点的相同点第3页/共71页第三页,共72页。2024年7月27日DSP原理(yunl)及应用4第第第第第第6 6 6 66 6章章章章章章 TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计(chn(chn(chn(chn(chn(chn x sh j) x sh j) x sh j) x sh j) x sh j) x sh j)1. 1. 常量常量(chngling)(

7、chngling)定义定义 6.1.1 C54x C6.1.1 C54x C与ANSI C的相同点的相同点 格式:格式:const const const const 类型 符号= =数值;数值; 例6-1 const short d1=86-1 const short d1=86-1 const short d1=86-1 const short d1=8; C54xC54x C C也可以用下面的方法定义符号常量也可以用下面的方法定义符号常量 #define d1 8 #define d1 8;/ /程序中出现程序中出现d1d1时均会以时均会以8 8来代替来代替第4页/共71页第四页,共72

8、页。2024年7月27日DSP原理(yunl)及应用5第第第第第第6 6 6 66 6章章章章章章 TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计(chn(chn(chn(chn(chn(chn x sh x sh x sh x sh x sh x sh j)j)j)j)j)j)2. 变量(binling)定义 1 1)一般变量的定义)一般变量的定义 格式:类型格式:类型 符号;符号; 例例例6-2 6-2 6-2 char c

9、h_1char ch_1char ch_1;/ / /定义了一个字符变量,名字为定义了一个字符变量,名字为定义了一个字符变量,名字为ch_1ch_1ch_1short sh_1; /short sh_1; /short sh_1; /定义了一个短整型变量,名字为定义了一个短整型变量,名字为定义了一个短整型变量,名字为sh_1sh_1sh_1long 1_dat1;/long 1_dat1;/定义了一个长整型变量定义了一个长整型变量定义了一个长整型变量1_dat11_dat1int *pi_1; /int *pi_1; /定义了一个指向整型数据的指针变量,定义了一个指向整型数据的指针变量, 名字

10、为名字为pi_1pi_1pi_1Short sh_a10;/Short sh_a10;/Short sh_a10;/定义了一个短整型数组,数组的长定义了一个短整型数组,数组的长 度为度为101010第5页/共71页第五页,共72页。2024年7月27日DSP原理(yunl)及应用6第第第第第第6 6 6 66 6章章章章章章 TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计(chn(chn(chn(chn(chn(chn x sh

11、 j) x sh j) x sh j) x sh j) x sh j) x sh j)2 2 2 2)扩展)扩展)扩展)扩展(kuzhn)(kuzhn)(kuzhn)(kuzhn)变量的定义变量的定义变量的定义变量的定义 struct str_t /struct str_t /struct str_t /定义一个结构类型定义一个结构类型定义一个结构类型str_tstr_tstr_t short sh_a; short sh_a; long l_b; long l_b; float f_c; float f_c; struct str_t str_a;/struct str_t str_a;/s

12、truct str_t str_a;/定义一个定义一个定义一个str_tstr_t型结构变量型结构变量str_astr_a第6页/共71页第六页,共72页。2024年7月27日DSP原理(yunl)及应用7第第第第第第6 6 6 66 6章章章章章章 TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计(chn(chn(chn(chn(chn(chn x sh j) x sh j) x sh j) x sh j) x sh j) x

13、sh j)3)3)3)3)自定义变量自定义变量自定义变量自定义变量(binling)(binling)(binling)(binling)的定义的定义的定义的定义 格式:格式:typedef typedef typedef typedef 已有类型已有类型已有类型 新数据类型新数据类型新数据类型例例例6-36-3typedef unsigned short US_DATA;typedef unsigned short US_DATA; US_DATA ush_t US_DATA ush_t US_DATA ush_t;等同于:等同于:等同于:unsigned short ush_tunsign

14、ed short ush_tunsigned short ush_t;或者:或者:或者:#define US_DATA unsigned short#define US_DATA unsigned short;第7页/共71页第七页,共72页。2024年7月27日DSP原理(yunl)及应用8第第第第第第6 6 6 66 6章章章章章章 TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计(chn(chn(chn(chn(chn(ch

15、n x sh j) x sh j) x sh j) x sh j) x sh j) x sh j)3.3.函数的定义函数的定义(dngy)(dngy)和组织和组织 C54x CC54x CC54x CC54x CC54x CC54x C和和和ANSI CANSI CANSI CANSI CANSI CANSI C一样,整个程序有一个主函数一样,整个程序有一个主函数一样,整个程序有一个主函数(mainmainmainmainmainmain函数)和零个或者多个子函数构成,如下所示:函数)和零个或者多个子函数构成,如下所示:函数)和零个或者多个子函数构成,如下所示:float sub_cac(fl

16、oat a, float b);/float sub_cac(float a, float b);/子函数声明子函数声明void main()/void main()/主函数定义,整个程序内有且只有一个主函数定义,整个程序内有且只有一个 float a=1; float a=1; float b=2; float b=2; float c; float c; c=sub_cac(a,b);/ c=sub_cac(a,b);/子函数调用子函数调用while(1) /while(1) /死循环,等待外部事件发生死循环,等待外部事件发生 第8页/共71页第八页,共72页。2024年7月27日DSP原

17、理(yunl)及应用9第第第第第第6 6 6 66 6章章章章章章 TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计(chn(chn(chn(chn(chn(chn x sh j) x sh j) x sh j) x sh j) x sh j) x sh j) float sub_cac(float e,float f)/ float sub_cac(float e,float f)/ float sub_cac(float e,

18、float f)/ float sub_cac(float e,float f)/子函数定义子函数定义(dngy)(dngy)(dngy)(dngy) float g; float g; float g; float g; g=e*f; g=e*f; g=e*f; g=e*f; return g; return g; return g; return g; 除此之外,除此之外,除此之外,C54x CC54x CC54x C的的的算术运算符算术运算符算术运算符、关系运算符关系运算符关系运算符、逻辑运算符逻辑运算符逻辑运算符、位操作运算符位操作运算符位操作运算符,包括运算符之间的优先级和综合性等也

19、都和,包括运算符之间的优先级和综合性等也都和,包括运算符之间的优先级和综合性等也都和ANSI CANSI CANSI C一样,函数语句的组织也分成顺序结构、分支结构、一样,函数语句的组织也分成顺序结构、分支结构、一样,函数语句的组织也分成顺序结构、分支结构、循环结构等。循环结构等。循环结构等。第9页/共71页第九页,共72页。2024年7月27日DSP原理(yunl)及应用10第第第第第第6 6 6 66 6章章章章章章 TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC语言程序设计语言程序设计语言程序

20、设计语言程序设计语言程序设计语言程序设计(chn(chn(chn(chn(chn(chn x sh j) x sh j) x sh j) x sh j) x sh j) x sh j)6.1.2 C54x C6.1.2 C54x C与与ANSI CANSI CANSI CANSI C的不同点的不同点的不同点的不同点 C54x C C54x C C54x C C54x C C54x C C54x C与与与ANSI CANSI CANSI CANSI CANSI CANSI C的不同点总的来说有以下几个的不同点总的来说有以下几个的不同点总的来说有以下几个(j )(j )(j )(j )(j )(j

21、 )方面:方面:方面:1. 1. 1. 所处理数据的性质不同所处理数据的性质不同所处理数据的性质不同 面向面向PCPCPC机的机的机的ANSI CANSI CANSI C所处理的数据是一些采集好所处理的数据是一些采集好的、数据量较多的、以数据块为单位的数据。对这的、数据量较多的、以数据块为单位的数据。对这些数据的处理实时性要求并不是很高。些数据的处理实时性要求并不是很高。 C54x C C54x C 的编程对象的编程对象的编程对象C54x DSPC54x DSPC54x DSP工作于实时性处工作于实时性处理场合,对于处理时间有比较严格的实时性要求。理场合,对于处理时间有比较严格的实时性要求。理

22、场合,对于处理时间有比较严格的实时性要求。第10页/共71页第十页,共72页。2024年7月27日DSP原理(yunl)及应用11第第第第第第6 6 6 66 6章章章章章章 TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计(chn(chn(chn(chn(chn(chn x sh j) x sh j) x sh j) x sh j) x sh j) x sh j)2.2.2.数据数据数据(shj)(shj)(shj)出输入输出设

23、备不同出输入输出设备不同出输入输出设备不同 C54x CC54x CC54x CC54x CC54x CC54x C处理的数据来自于实时采集数据,数据处理的数据来自于实时采集数据,数据处理的结果通过通信口传递给其他计算机或者芯片处理的结果通过通信口传递给其他计算机或者芯片处理的结果通过通信口传递给其他计算机或者芯片(如(如(如MCUMCUMCUMCUMCUMCU、ARMARMARMARM等)使用,或者通过等)使用,或者通过等)使用,或者通过D/AD/AD/AD/A输出。输出。 面向面向面向PCPCPC机的机的机的ANSI CANSI C所处理的数据来自硬盘、内存等存所处理的数据来自硬盘、内存等

24、存储介质,或者是键盘的输入。其输出是显示器、通信口或者储介质,或者是键盘的输入。其输出是显示器、通信口或者实时输出。对人机界面提出了较高的要求。实时输出。对人机界面提出了较高的要求。 第11页/共71页第十一页,共72页。2024年7月27日DSP原理(yunl)及应用12第第第第第第6 6 6 66 6章章章章章章 TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计(chn(chn(chn(chn(chn(chn x sh x s

25、h x sh x sh x sh x sh j)j)j)j)j)j)3.“3.“3.“死循环死循环死循环” ” ”的对待的对待的对待(dudi)(dudi)(dudi)上不同上不同上不同 面向面向面向PCPCPCPCPCPC机的机的机的ANSI CANSI CANSI CANSI C程序,最怕的事情就是程序程序,最怕的事情就是程序内部出现内部出现“ “死循环死循环” ” ”。 C54x CC54x CC54x CC54x CC54x CC54x C在系统初始化之后安排在系统初始化之后安排在系统初始化之后安排“ “死循环死循环” ” ”,在,在“ “ “死循环死循环” ” ”内等待各种中断事件(

26、如外部中断事件、定时器中断内等待各种中断事件(如外部中断事件、定时器中断事件、通信口的中断事件等)的发生。事件、通信口的中断事件等)的发生。第12页/共71页第十二页,共72页。2024年7月27日DSP原理(yunl)及应用13第第第第第第6 6 6 66 6章章章章章章 TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计(chn(chn(chn(chn(chn(chn x sh x sh x sh x sh x sh x sh

27、j)j)j)j)j)j)4.4.4.4.语法语法(yf)(yf)(yf)(yf)及数据结构细节上的不同及数据结构细节上的不同(1 1 1 1)C54xC54xC54xC54x的的C C C C语言数据类型及其表示范围语言数据类型及其表示范围 由于C54xC54x是一种是一种1616位定点DSPDSPDSPDSP,所处理的数据一般都是以字(word ,16bitword ,16bit)为单位,而对于小于)为单位,而对于小于16161616位的数据的运算,位的数据的运算,需要配合逻辑和以为运算来完成。需要配合逻辑和以为运算来完成。 C54xC54xC54xC54x编译器将编译器将1616位数据定义

28、成最短的数据表示类型,如signed char, char, unsigned char, short, signed signed char, char, unsigned char, short, signed short, int, signed int, enum, unsigned int,* short, int, signed int, enum, unsigned int,* 指针指针都是都是1616位数据,与ANSI CANSI C有较大区别。有较大区别。第13页/共71页第十三页,共72页。2024年7月27日DSP原理(yunl)及应用14第第第第第第6 6 6 66 6

29、章章章章章章 TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计(chn(chn(chn(chn(chn(chn x sh x sh x sh x sh x sh x sh j)j)j)j)j)j) 对于对于1616位表示范围不够的数据,位表示范围不够的数据,C54xC54x编译器安排编译器安排了了3232位的数据类型,位的数据类型,3232位的数据包括位的数据包括(boku)long, signed (boku)long, sig

30、ned long, float, double, long doublelong, float, double, long double。这也是表示范围最。这也是表示范围最大的一种数据类型。与大的一种数据类型。与ANSI CANSI C有较大区别。有较大区别。第14页/共71页第十四页,共72页。2024年7月27日DSP原理(yunl)及应用15第第第第第第6 6 6 66 6章章章章章章 TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计语

31、言程序设计(chn(chn(chn(chn(chn(chn x sh x sh x sh x sh x sh x sh j)j)j)j)j)j)(2)C54x2)C54x的的C C语言特有语言特有(t yu)(t yu)数据类型数据类型 C54xC54xC54xC54xC54xC54x的的的C C C CC C语言除了从语言除了从语言除了从ANSI CANSI CANSI CANSI CANSI CANSI C继承了一些既有数据类型,在表示方法上作了少许调整。为了便继承了一些既有数据类型,在表示方法上作了少许调整。为了便继承了一些既有数据类型,在表示方法上作了少许调整。为了便于于于C C C

32、CC C语言直接对语言直接对语言直接对DSPDSPDSPDSPDSPDSP硬件进行操作,硬件进行操作,硬件进行操作,C54xC54xC54xC54xC54xC54x的的的C C C CC C语言还扩展了一些专用或者说是特有的数据类型。语言还扩展了一些专用或者说是特有的数据类型。语言还扩展了一些专用或者说是特有的数据类型。 1 1 1 1)地址变量)地址变量)地址变量)地址变量 在在在DSPDSPDSPDSPDSPDSP的的的C C C CC C语言程序中,经常需要对某一个存储单元进行访问,这个存储单元可能是普通语言程序中,经常需要对某一个存储单元进行访问,这个存储单元可能是普通语言程序中,经常

33、需要对某一个存储单元进行访问,这个存储单元可能是普通的数据存储器单元,也可能是存储器映像寄存器。对于他们的访问必须明确指出其地址,为此的数据存储器单元,也可能是存储器映像寄存器。对于他们的访问必须明确指出其地址,为此的数据存储器单元,也可能是存储器映像寄存器。对于他们的访问必须明确指出其地址,为此C54xC54xC54xC54xC54xC54x的的的C C C CC C语言编译器设置一种地址变量来实现对这些指定数据存储单元的访问。语言编译器设置一种地址变量来实现对这些指定数据存储单元的访问。语言编译器设置一种地址变量来实现对这些指定数据存储单元的访问。第15页/共71页第十五页,共72页。20

34、24年7月27日DSP原理(yunl)及应用16第第第第第第6 6 6 66 6章章章章章章 TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计(chn(chn(chn(chn(chn(chn x sh j) x sh j) x sh j) x sh j) x sh j) x sh j)1 1 1 1)地址)地址)地址)地址(dzh)(dzh)(dzh)(dzh)变量变量变量变量 所谓的地址变量实际上就是指定了具体地址的指针变量。所

35、谓的地址变量实际上就是指定了具体地址的指针变量。所谓的地址变量实际上就是指定了具体地址的指针变量。所谓的地址变量实际上就是指定了具体地址的指针变量。所谓的地址变量实际上就是指定了具体地址的指针变量。所谓的地址变量实际上就是指定了具体地址的指针变量。 为了防止编译器将其优化掉(为了防止编译器将其优化掉(为了防止编译器将其优化掉(为了防止编译器将其优化掉(为了防止编译器将其优化掉(为了防止编译器将其优化掉(C54xC54xC54xC54x编译器在对程编译器在对程编译器在对程编译器在对程编译器在对程编译器在对程序进行优化时,会将定义了但从来没有使用的变量序进行优化时,会将定义了但从来没有使用的变量序

36、进行优化时,会将定义了但从来没有使用的变量序进行优化时,会将定义了但从来没有使用的变量优化掉,以便节省存储空间),往往需要用优化掉,以便节省存储空间),往往需要用优化掉,以便节省存储空间),往往需要用优化掉,以便节省存储空间),往往需要用volatilevolatilevolatilevolatile关键字进行说明,如:关键字进行说明,如:关键字进行说明,如:关键字进行说明,如:关键字进行说明,如:关键字进行说明,如: volatile short *mcbsp0_drr10=0x10; short sh_drr10_data; sh_drr10_data=*mcbsp0_drr10第16页/

37、共71页第十六页,共72页。2024年7月27日DSP原理(yunl)及应用17第第第第第第6 6 6 66 6章章章章章章 TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计(chn(chn(chn(chn(chn(chn x sh x sh x sh x sh x sh x sh j)j)j)j)j)j)2)I/O端口变量(binling) C54xC54x的存储空间有三个:程序存储空间、数据存储空间的存储空间有三个:程序存储空

38、间、数据存储空间和和I/OI/O空间。为了实现空间。为了实现C C C C访问访问访问访问DSPDSPDSPDSP的的I/OI/OI/OI/O空间,空间,空间,空间,C54x CC54x CC54x CC54x C语言规定语言规定了一种了一种I/OI/OI/OI/O端口变量,对这些端口变量的访问就是对端口变量,对这些端口变量的访问就是对端口变量,对这些端口变量的访问就是对端口变量,对这些端口变量的访问就是对I/OI/OI/OI/O空间的空间的访问。访问。I/OI/OI/OI/O端口变量的定义格式如下:端口变量的定义格式如下:端口变量的定义格式如下:端口变量的定义格式如下: ioport iop

39、ort ioport ioport 数据类型数据类型数据类型数据类型 porthex_num;porthex_num; 其中,其中,其中,其中, ioportioport:端口变量定义关键字;数据类型:只:端口变量定义关键字;数据类型:只能是能是char, short, int, unsignedchar, short, int, unsigned等等16161616位类型;位类型;hex_num:hex_num:hex_num:hex_num:该该I/OI/OI/OI/O端口的端口的16161616进制表示的端口地址。进制表示的端口地址。 第17页/共71页第十七页,共72页。2024年7月

40、27日DSP原理(yunl)及应用18第第第第第第6 6 6 66 6章章章章章章 TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计(chn(chn(chn(chn(chn(chn x sh j) x sh j) x sh j) x sh j) x sh j) x sh j)2 2 2 2)I/OI/OI/OI/O端口变量端口变量端口变量端口变量(binling)(binling)(binling)(binling) 例如:例如:

41、 ioport short port100;/ioport short port100;/定义了一个端口变量定义了一个端口变量定义了一个端口变量定义了一个端口变量 ,端口地址是,端口地址是100h100h 端端端端口口口口变变变变量量量量定定定定义义义义好好好好后后后后,对对对对这这这这些些些些变变变变量量量量的的的的访访访访问问问问在在在在形形形形式式式式上上上上和和和和普普普普通通通通的的的的变量没有太大区别,如:变量没有太大区别,如:变量没有太大区别,如:变量没有太大区别,如: short sh_1,sh_2;/short sh_1,sh_2;/short sh_1,sh_2;/shor

42、t sh_1,sh_2;/定义了两个短整型变量定义了两个短整型变量 sh_1=port100;/ sh_1=port100;/ sh_1=port100;/ sh_1=port100;/端口读操作端口读操作端口读操作端口读操作 port100=sh_2;/ port100=sh_2;/端口写操作端口写操作第18页/共71页第十八页,共72页。2024年7月27日DSP原理(yunl)及应用19第第第第第第6 6 6 66 6章章章章章章 TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC语言程序设计语言

43、程序设计语言程序设计语言程序设计语言程序设计语言程序设计(chn(chn(chn(chn(chn(chn x sh j) x sh j) x sh j) x sh j) x sh j) x sh j)I/OI/OI/OI/O变量变量变量变量(binling)(binling)(binling)(binling)可以和其他变量可以和其他变量可以和其他变量可以和其他变量(binling)(binling)(binling)(binling)一样参加任一样参加任一样参加任一样参加任何的表达式运算何的表达式运算何的表达式运算何的表达式运算例如:例如: short s1,s2;short s1,s2;

44、s1=0x55; s1=0x55; s2=port100+s1; s2=port100+s1;/从100100端端口口读读数数据据,将将所所读读到到的的数数据据和和s1s1s1s1加加在在一一起起,结结果果送送s2s2s2s2第19页/共71页第十九页,共72页。2024年7月27日DSP原理(yunl)及应用20第第第第第第6 6 6 66 6章章章章章章 TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计(chn(chn(chn

45、(chn(chn(chn x sh x sh x sh x sh x sh x sh j)j)j)j)j)j) 需要注意的是:一般情况下I/OI/O变量的读写速度有快有慢,快的和CPUCPU的处理速度差不多,慢的和CPUCPU的处理速度差距(chj)(chj)非常大。对于读写速度慢的I/OI/O变量的读写,需要在程序中通过调用不同的延时程序实现延时。第20页/共71页第二十页,共72页。2024年7月27日DSP原理(yunl)及应用21第第第第第第6 6 6 66 6章章章章章章 TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C5

46、4xC TMS320C54xC语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计(chn(chn(chn(chn(chn(chn x sh x sh x sh x sh x sh x sh j)j)j)j)j)j) DSP DSP的C C语言扩展了寄存器变量。在一个C C函数内部最多可以使用(shyng)(shyng)两个寄存器变量,编译器在编译这两个寄存器变量时用AR6AR6和AR7AR7这两个辅助寄存器分别做了对应: 3 3 3 3)寄存器变量)寄存器变量)寄存器变量)寄存器变量 AR6AR6被赋给第一个寄存器变量被赋给第一个寄存器变量 AR7 AR7 AR7 AR7

47、被赋给了第二个寄存器变量被赋给了第二个寄存器变量 寄存器变量的定义格式:寄存器变量的定义格式:寄存器变量的定义格式:寄存器变量的定义格式: register type AR6 register type AR6 或 register type AR7register type AR7第21页/共71页第二十一页,共72页。2024年7月27日DSP原理(yunl)及应用22第第第第第第6 6 6 66 6章章章章章章 TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC语言程序设计语言程序设计语言程序设计

48、语言程序设计语言程序设计语言程序设计(chn(chn(chn(chn(chn(chn x sh j) x sh j) x sh j) x sh j) x sh j) x sh j)1 1 1 1)变量)变量(binling)(binling)(binling)(binling)的初值问题的初值问题(3 3)DSP DSP C C C C语言关于变量的特殊规定语言关于变量的特殊规定ANSI ANSI C C语言规定:没有显式初始化的变量都将初始化为0 0DSPDSP的的C语语言言规规定定:没没有有显显式式初初始始化化的的变变量量仍仍保保持持未未初初始始化状态化状态第22页/共71页第二十二页,共

49、72页。2024年7月27日DSP原理(yunl)及应用23第第第第第第6 6 6 66 6章章章章章章 TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计(chn(chn(chn(chn(chn(chn x sh j) x sh j) x sh j) x sh j) x sh j) x sh j) 例如例如(lr)(lr)(lr)(lr): int sum; int sum; int sum; int sum; int a8 =1

50、,2,3,4,5,6,7,8; int a8 =1,2,3,4,5,6,7,8; int a8 =1,2,3,4,5,6,7,8; int a8 =1,2,3,4,5,6,7,8; for(i=0;i8;i+) for(i=0;i8;i+) for(i=0;i8;i+) for(i=0;i16;/16 result1=(long)m1*m2)16;/16 result1=(long)m1*m2)16;/16 result1=(long)m1*m2)16;/16位位* * * *16161616位结位结 果应用果应用32323232位表示 result3=(unsigned long)m3*m4

51、)16;result3=(unsigned long)m3*m4)16; 第28页/共71页第二十八页,共72页。2024年7月27日DSP原理(yunl)及应用29第第第第第第6 6 6 66 6章章章章章章 TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计(chn(chn(chn(chn(chn(chn x sh j) x sh j) x sh j) x sh j) x sh j) x sh j) 这里的这里的m1*m2m1*

52、m2m1*m2m1*m2的中间结果作了强制的中间结果作了强制(qingzh)long(qingzh)long(qingzh)long(qingzh)long转换,是转换,是为了防止有效数据位的丢失。为了防止有效数据位的丢失。第29页/共71页第二十九页,共72页。2024年7月27日DSP原理(yunl)及应用30第第第第第第6 6 6 66 6章章章章章章 TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计(chn(chn(chn

53、(chn(chn(chn x sh j) x sh j) x sh j) x sh j) x sh j) x sh j)6.2.1 C54x C6.2.1 C54x C语言开发语言开发(kif)(kif)的存储器结构的存储器结构 1.C54x C1.C54x C语言开发的段结构 C C C C编译器对C C语言源程序进行编译后产生汇编程序,汇编语言源程序进行编译后产生汇编程序,汇编程序再经过汇编将成为程序再经过汇编将成为COFFCOFF格式的目标文件,该文件将包含七格式的目标文件,该文件将包含七个可以进行重新定位的代码和数据段,他们是:个可以进行重新定位的代码和数据段,他们是: 6.26.2

54、C54x C C语言编程语言编程 第30页/共71页第三十页,共72页。2024年7月27日DSP原理(yunl)及应用31第第第第第第6 6 6 66 6章章章章章章 TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计(chn(chn(chn(chn(chn(chn x sh j) x sh j) x sh j) x sh j) x sh j) x sh j)已初始化段:(1 1 1 1).text.text.text.text段

55、,包含了可执行代码段,包含了可执行代码(di m)(di m)(di m)(di m)。(2 2 2 2).cinit.cinit.cinit.cinit段,包含明显初始化的全局变量和静态变量。段,包含明显初始化的全局变量和静态变量。(3 3 3 3).const.const.const.const段,包含字符串常数和全局变量。段,包含字符串常数和全局变量。(4 4 4 4).switch.switch.switch.switch段,包含大型段,包含大型switchswitchswitchswitch语句的跳转表语句的跳转表未初始化段未初始化段(1 1 1 1). . . .bssbssbss

56、bss段,包含了未初始化的全局变量和静态变量段,包含了未初始化的全局变量和静态变量(2 2 2 2).stack.stack.stack.stack段,定义软件堆栈段,定义软件堆栈(3 3 3 3).system.system.system.system段,为动态存储器函数段,为动态存储器函数malloc,calloc,realloc(malloc,calloc,realloc(malloc,calloc,realloc(malloc,calloc,realloc(这些函数由运行支持库提供这些函数由运行支持库提供) ) ) )分配存储器空分配存储器空间间第31页/共71页第三十一页,共72页。

57、2024年7月27日DSP原理(yunl)及应用32第第第第第第6 6 6 66 6章章章章章章 TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计(chn(chn(chn(chn(chn(chn x sh j) x sh j) x sh j) x sh j) x sh j) x sh j)(1 1 1 1) 已初始化段已初始化段已初始化段已初始化段 1 1).cinit.cinit段 DSP DSP的C C语言全局变量和静态(jn

58、gti)(jngti)变量,其存储单元定义在段.bss.bss中,需要显式初始化的值存放在段.cinit.cinit中。在DSPDSP上电时,系统初始化函数(bootloaderbootloader)会自动调用段.cinit.cinit的值来初始化段.bss.bss。对于没有显式定义初始化值的,则保持未初始化状态。 第32页/共71页第三十二页,共72页。2024年7月27日DSP原理(yunl)及应用33第第第第第第6 6 6 66 6章章章章章章 TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC语

59、言程序设计语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计(chn(chn(chn(chn(chn(chn x sh x sh x sh x sh x sh x sh j)j)j)j)j)j) 例如例如(lr)(lr)(lr)(lr):假设在:假设在C C C C程序中定义了两个初始化变量:程序中定义了两个初始化变量: int a=45;int a=45; int b5=2,3,4,5,6; int b5=2,3,4,5,6; int b5=2,3,4,5,6; int b5=2,3,4,5,6;则这两个变量的初始化信息如下:则这两个变量的初始化信息如下:.sect .sect “

60、.cinit.cinit”; ; 初始化段初始化段*变量a a a a的记录*.word 1 ;.word 1 ;.word 1 ;.word 1 ;数据长度为1 1 1 1.word _a.word _a;.bss.bss中的地址.word 45.word 45.word 45.word 45; ; ; ;数据第33页/共71页第三十三页,共72页。2024年7月27日DSP原理(yunl)及应用34第第第第第第6 6 6 66 6章章章章章章 TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC语言程

61、序设计语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计(chn(chn(chn(chn(chn(chn x sh j) x sh j) x sh j) x sh j) x sh j) x sh j)*变量变量b b b b的记录的记录* * * * .word 5.word 5.word 5.word 5; ; ; ;数据长度数据长度(chngd)(chngd)(chngd)(chngd)为为1 1 1 1.word _b.word _b.word _b.word _b;.bss;.bss;.bss;.bss中的地址中的地址.word 2,3,4,5,6.word 2,3,4,5,

62、6.word 2,3,4,5,6.word 2,3,4,5,6; ; ; ;数据数据2 2).switch .switch .switch .switch 段 当当C C语言程序中有分支语句语言程序中有分支语句switchswitch时,时,如:如: int i;int i; int function( ) int function( ) switch(i)switch(i)case 1;case 1;return 1;return 1;第34页/共71页第三十四页,共72页。2024年7月27日DSP原理(yunl)及应用35第第第第第第6 6 6 66 6章章章章章章 TMS320C54x

63、C TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计(chn(chn(chn(chn(chn(chn x sh x sh x sh x sh x sh x sh j)j)j)j)j)j) break;break;break;break;default;default;return 0;return 0;return 0;return 0;break;break;break;break; C C C C语言程序经过编译将产生语言程序经过编译将产生.swit

64、ch.switch.switch.switch段,该段记录段,该段记录了开关变量和相应开关值,以及需要执行的程序起始了开关变量和相应开关值,以及需要执行的程序起始(q sh)(q sh)(q sh)(q sh)位置的对应关系。位置的对应关系。第35页/共71页第三十五页,共72页。2024年7月27日DSP原理(yunl)及应用36第第第第第第6 6 6 66 6章章章章章章 TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计(ch

65、n(chn(chn(chn(chn(chn x sh j) x sh j) x sh j) x sh j) x sh j) x sh j)(2 2)未初始化段)未初始化段)未初始化段)未初始化段1 1).stack段段 .stack .stack .stack .stack段定义了软件堆栈,该堆栈用于函数调用、变量传段定义了软件堆栈,该堆栈用于函数调用、变量传递以及局部变量分配递以及局部变量分配(fnpi)(fnpi)(fnpi)(fnpi)。软件堆栈的大小由连接器选项。软件堆栈的大小由连接器选项-stack-stack-stack-stack后面的数值规定(如后面的数值规定(如-stack

66、40 -stack 40 -stack 40 -stack 40 规定了栈的大小为规定了栈的大小为40404040字)字),如果没有规定,则默认大小为,如果没有规定,则默认大小为400h400h400h400h即即1K1K1K1K。注意:注意:注意:注意:C C编译器并不提供检查堆栈溢出的手段,因此,必须保编译器并不提供检查堆栈溢出的手段,因此,必须保证有足够的空间由于堆栈,否则,发生溢出现象将破坏程序的证有足够的空间由于堆栈,否则,发生溢出现象将破坏程序的运行环境,从而导致程序的瘫痪。运行环境,从而导致程序的瘫痪。 第36页/共71页第三十六页,共72页。2024年7月27日DSP原理(yu

67、nl)及应用37第第第第第第6 6 6 66 6章章章章章章 TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计(chn(chn(chn(chn(chn(chn x sh j) x sh j) x sh j) x sh j) x sh j) x sh j) 2) . . . . system system段段. system. system. system. system段为动态存储器函数段为动态存储器函数段为动态存储器函数段为动态

68、存储器函数malloc,calloc,malloc,calloc,malloc,calloc,malloc,calloc,realloc(realloc(realloc(realloc(这些函数由运行支持库提供这些函数由运行支持库提供这些函数由运行支持库提供这些函数由运行支持库提供) ) ) )分配存储器空间。若分配存储器空间。若分配存储器空间。若分配存储器空间。若C C C C程程程程序序序序(chngx)(chngx)(chngx)(chngx)没有使用这些函数,编译器就不创建没有使用这些函数,编译器就不创建没有使用这些函数,编译器就不创建没有使用这些函数,编译器就不创建.system.s

69、ystem.system.system段。段。段。段。 (3 3)自定义段)自定义段 除了除了除了除了C C编译器所产生的标准段:编译器所产生的标准段:编译器所产生的标准段:编译器所产生的标准段:.text, .cinit, .const, .text, .cinit, .const, .text, .cinit, .const, .text, .cinit, .const, .switch, .bss, .stack, .system.switch, .bss, .stack, .system.switch, .bss, .stack, .system.switch, .bss, .stac

70、k, .system段外,用户还可以利用段外,用户还可以利用段外,用户还可以利用段外,用户还可以利用progmaprogma伪指令来产生其他的自定义段。伪指令来产生其他的自定义段。 第37页/共71页第三十七页,共72页。2024年7月27日DSP原理(yunl)及应用38第第第第第第6 6 6 66 6章章章章章章 TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计(chn(chn(chn(chn(chn(chn x sh j)

71、x sh j) x sh j) x sh j) x sh j) x sh j) CODE_SECTION pragma CODE_SECTION pragma 如果用户想将程序中的代码(如函数)编译成不同于如果用户想将程序中的代码(如函数)编译成不同于.text.text.text.text段的其他段,并链接段的其他段,并链接(lin ji)(lin ji)(lin ji)(lin ji)到到不同于不同于.text.text.text.text段的独立区域,就可以使用段的独立区域,就可以使用CODE_SECTION pragmaCODE_SECTION pragmaCODE_SECTION p

72、ragmaCODE_SECTION pragma伪指令。其语法结构为伪指令。其语法结构为: : : : # pragma CODE_SECTION (symbol# pragma CODE_SECTION (symbol,“section namesection name”) 这里 ,section namesection name代表了要产生的段名,而代表了要产生的段名,而symbolsymbol代表了要汇编到该段的符号(如函数名)。第38页/共71页第三十八页,共72页。2024年7月27日DSP原理(yunl)及应用39第第第第第第6 6 6 66 6章章章章章章 TMS320C54xC

73、 TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计(chn(chn(chn(chn(chn(chn x sh j) x sh j) x sh j) x sh j) x sh j) x sh j)DATA_SECTION pragmaDATA_SECTION pragma 如果用户想将程序中的部分数据编译成不同于.bss段的其他段,并链接到不同于.bss段的独立区域,就可以(ky)使用DATA_SECTION pragma伪指令。其语法结构为: # pra

74、gma DATA_SECTION # pragma DATA_SECTION (symbolsymbol,“ “section namesection name” ”) 这里 ,section name代表了要产生的段名,而symbol代表了要汇编到该段的符号(如变量名)。第39页/共71页第三十九页,共72页。2024年7月27日DSP原理(yunl)及应用40第第第第第第6 6 6 66 6章章章章章章 TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC语言程序设计语言程序设计语言程序设计语言程序设

75、计语言程序设计语言程序设计(chn(chn(chn(chn(chn(chn x sh x sh x sh x sh x sh x sh j)j)j)j)j)j)2. C54x C2. C54x C语言开发语言开发(kif)(kif)的存储器结构的存储器结构(1 1 1 1)段的存储器定位)段的存储器定位 DSPDSPDSPDSP的的C C C C语言程序经过编译器编译后生成一些段,如已初语言程序经过编译器编译后生成一些段,如已初始化的始化的.text.text,.cinit, .const, switch.cinit, .const, switch.cinit, .const, switch.

76、cinit, .const, switch段和未初始化的段和未初始化的.bss, .bss, .bss, .bss, .stack, .system.stack, .system.stack, .system.stack, .system段,还有一些自定义段,这些段在链接时必段,还有一些自定义段,这些段在链接时必段,还有一些自定义段,这些段在链接时必段,还有一些自定义段,这些段在链接时必须指定相应的存储位置。须指定相应的存储位置。须指定相应的存储位置。须指定相应的存储位置。第40页/共71页第四十页,共72页。2024年7月27日DSP原理(yunl)及应用41第第第第第第6 6 6 66 6

77、章章章章章章 TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计(chn(chn(chn(chn(chn(chn x sh x sh x sh x sh x sh x sh j)j)j)j)j)j)C54xC54x的段存储器分配的段存储器分配段名及段的类型段名及段的类型段名及段的类型段名及段的类型存储器类型存储器类型存储器类型存储器类型PagePage类型类型已初始化段已初始化段 .cinit.cinitROM or RAMROM

78、or RAMROM or RAMROM or RAM0 0 0 0.const .const ROM or RAMROM or RAMROM or RAMROM or RAM1 1 1 1.switch.switchROM or RAMROM or RAMROM or RAMROM or RAM 0 0 0 0.text.textROM or RAMROM or RAMROM or RAMROM or RAM0 0 0 0未初始化段未初始化段 .bss.bssRAMRAMRAMRAM1 1 1 1.stack .stack RAMRAMRAMRAM1 1 1 1.system.systemRA

79、MRAMRAMRAM1 1 1 1命名段命名段命名段命名段 CODE_SECTIONCODE_SECTIONROM or RAMROM or RAMROM or RAMROM or RAM0 0 0 0 DATA_SECTIONDATA_SECTIONRAMRAMRAMRAM1 1 1 1第41页/共71页第四十一页,共72页。2024年7月27日DSP原理(yunl)及应用42第第第第第第6 6 6 66 6章章章章章章 TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC语言程序设计语言程序设计语言程

80、序设计语言程序设计语言程序设计语言程序设计(chn(chn(chn(chn(chn(chn x sh j) x sh j) x sh j) x sh j) x sh j) x sh j) DSP DSP DSP DSP编译器支持编译器支持(zhch)(zhch)(zhch)(zhch)两种存储器模式:小存储器模式两种存储器模式:小存储器模式(little endianlittle endianlittle endianlittle endian)和大存储器模式)和大存储器模式(big endian)(big endian)(big endian)(big endian); (2 2 2 2)存

81、储器模式)存储器模式 小存储器模式:编译器默认的存储器模式。这要求小存储器模式:编译器默认的存储器模式。这要求.bss.bss在在在在128128128128个字(一个数据页)范围内,这样编译器个字(一个数据页)范围内,这样编译器个字(一个数据页)范围内,这样编译器个字(一个数据页)范围内,这样编译器在编译成汇编时,不需要修改在编译成汇编时,不需要修改DPDP的值,程序代码简单的值,程序代码简单,运算效率高。,运算效率高。,运算效率高。,运算效率高。 大大存储器模式:对存储器模式:对.bss.bss大小没有限制,访问变量大小没有限制,访问变量大小没有限制,访问变量大小没有限制,访问变量 时需要

82、首先确定时需要首先确定时需要首先确定时需要首先确定DPDPDPDP值,这将增加指令访问周期值,这将增加指令访问周期值,这将增加指令访问周期值,这将增加指令访问周期第42页/共71页第四十二页,共72页。2024年7月27日DSP原理(yunl)及应用43第第第第第第6 6 6 66 6章章章章章章 TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计(chn(chn(chn(chn(chn(chn x sh x sh x sh x s

83、h x sh x sh j)j)j)j)j)j)6.2.2 C54x C6.2.2 C54x C语言开发的函数语言开发的函数(hnsh)(hnsh)及其约定及其约定 DSPDSPDSPDSP的的C C语言和基本语言和基本C C的开发一样,也是采用函数作为主的开发一样,也是采用函数作为主体的模块化程序设计方法。同样也是以体的模块化程序设计方法。同样也是以mainmain函数作为主函数,函数作为主函数,函数作为主函数,函数作为主函数,其他功能函数作为子函数,函数的定义函数的声明和函数的调用其他功能函数作为子函数,函数的定义函数的声明和函数的调用其他功能函数作为子函数,函数的定义函数的声明和函数的调

84、用其他功能函数作为子函数,函数的定义函数的声明和函数的调用方法,从形式上都是一样的。方法,从形式上都是一样的。方法,从形式上都是一样的。方法,从形式上都是一样的。 而对于函数的参数传递,不同的计算机结构确定了不同而对于函数的参数传递,不同的计算机结构确定了不同种类甚至不同信号的计算机,其种类甚至不同信号的计算机,其C C C C语言函数在参数传递的实现语言函数在参数传递的实现语言函数在参数传递的实现语言函数在参数传递的实现上也是有一定的差异的。上也是有一定的差异的。上也是有一定的差异的。上也是有一定的差异的。第43页/共71页第四十三页,共72页。2024年7月27日DSP原理(yunl)及应

85、用44第第第第第第6 6 6 66 6章章章章章章 TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计(chn(chn(chn(chn(chn(chn x sh j) x sh j) x sh j) x sh j) x sh j) x sh j)1.C54x C1.C54x C1.C54x C1.C54x C语言开发的寄存器约定语言开发的寄存器约定语言开发的寄存器约定语言开发的寄存器约定(yudng)(yudng)(yudng)(y

86、udng)规则规则规则规则 编译器的寄存器约定规则规定了在函数内如何使用寄编译器的寄存器约定规则规定了在函数内如何使用寄存器,以及在函数之间相互调用时如何保存(或称为保护)存器,以及在函数之间相互调用时如何保存(或称为保护)这些寄存器的值。这些寄存器的值。 寄存器值的保存分成两种基本类型,即入口保存和调寄存器值的保存分成两种基本类型,即入口保存和调用保存。用保存。 第44页/共71页第四十四页,共72页。2024年7月27日DSP原理(yunl)及应用45第第第第第第6 6 6 66 6章章章章章章 TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC

87、 TMS320C54xC TMS320C54xC语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计(chn(chn(chn(chn(chn(chn x sh x sh x sh x sh x sh x sh j)j)j)j)j)j) 调用保存(调用保存(save-on-callsave-on-callsave-on-callsave-on-call) :为了防止:为了防止(fngzh)(fngzh)(fngzh)(fngzh)调用函调用函数所使用的寄存器的值被调用函数更改掉,在调用被调用函数数所使用的寄存器的值被调用函数更改掉,在调用被调用函数之前,由调用函数负责将这些寄

88、存器的值进行保护,因此称为之前,由调用函数负责将这些寄存器的值进行保护,因此称为“调用保存调用保存”。如:如:AR0AR0AR0AR0、AR2-AR5AR2-AR5AR2-AR5AR2-AR5、A A A A、B B B B、T T T T、BRCBRCBRCBRC 入口保存(入口保存(save-on-entry:save-on-entry:save-on-entry:save-on-entry:当被调用函数需要使用某个当被调用函数需要使用某个寄存器时,这些寄存器原来的值由被调用函数负责保存。寄存器时,这些寄存器原来的值由被调用函数负责保存。这些寄存器值的保护,一般放置在被调用函数的入口处,这

89、些寄存器值的保护,一般放置在被调用函数的入口处,因此称为因此称为“入口保存入口保存”。如:如:AR1AR1、AR6AR6、AR7AR7AR7AR7第45页/共71页第四十五页,共72页。2024年7月27日DSP原理(yunl)及应用46第第第第第第6 6 6 66 6章章章章章章 TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计(chn(chn(chn(chn(chn(chn x sh j) x sh j) x sh j) x

90、sh j) x sh j) x sh j)2.C54x C2.C54x C语言开发语言开发(kif)(kif)的函数调用规则的函数调用规则 C54x CC54x CC54x CC54x C编译器规定了一组严格的函数调用规则,任何调用编译器规定了一组严格的函数调用规则,任何调用编译器规定了一组严格的函数调用规则,任何调用编译器规定了一组严格的函数调用规则,任何调用C C C C函数或被函数或被C C调用的函数都必须遵循这些规则,否则,就调用的函数都必须遵循这些规则,否则,就会破坏会破坏C C环境,造成不可预测的结果。环境,造成不可预测的结果。环境,造成不可预测的结果。环境,造成不可预测的结果。

91、假定有一个函数假定有一个函数function1function1,它接收了调用者传递给它的,它接收了调用者传递给它的,它接收了调用者传递给它的,它接收了调用者传递给它的参数,它自己有自己的局部变量,它还要调用另一个函数参数,它自己有自己的局部变量,它还要调用另一个函数参数,它自己有自己的局部变量,它还要调用另一个函数参数,它自己有自己的局部变量,它还要调用另一个函数function2function2,function1function1function1function1也需要传递参数给也需要传递参数给function2function2function2function2,并从,并从,并从

92、,并从function2function2function2function2中返回计算结果。中返回计算结果。第46页/共71页第四十六页,共72页。2024年7月27日DSP原理(yunl)及应用47第第第第第第6 6 6 66 6章章章章章章 TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计(chn(chn(chn(chn(chn(chn x sh j) x sh j) x sh j) x sh j) x sh j) x sh

93、 j) 其调用(dioyng)(dioyng)关系是: main( ) function1() function2() main( ) function1() function2() 第47页/共71页第四十七页,共72页。2024年7月27日DSP原理(yunl)及应用48第第第第第第6 6 6 66 6章章章章章章 TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计(chn(chn(chn(chn(chn(chn x sh j)

94、 x sh j) x sh j) x sh j) x sh j) x sh j)3.C54x C3.C54x C3.C54x C3.C54x C语言开发的标识符命名约定语言开发的标识符命名约定语言开发的标识符命名约定语言开发的标识符命名约定(yudng)(yudng)(yudng)(yudng)和混合语言编程和混合语言编程和混合语言编程和混合语言编程 约定:约定:约定:约定: C C C C C C编译器在编译编译器在编译编译器在编译编译器在编译编译器在编译编译器在编译C C C C语言程序时,会自动在所有标识符语言程序时,会自动在所有标识符语言程序时,会自动在所有标识符语言程序时,会自动在所

95、有标识符语言程序时,会自动在所有标识符语言程序时,会自动在所有标识符(函数名、变量名等)之前加下划线(函数名、变量名等)之前加下划线(函数名、变量名等)之前加下划线(函数名、变量名等)之前加下划线(函数名、变量名等)之前加下划线(函数名、变量名等)之前加下划线“ “ “_ _ _ _ _ _” ”,比如在,比如在,比如在,比如在,比如在,比如在C C C C C C程序中程序中程序中程序中定义的变量定义的变量定义的变量定义的变量x x x x x x,则编译以后的汇编程序里面会成为,则编译以后的汇编程序里面会成为,则编译以后的汇编程序里面会成为,则编译以后的汇编程序里面会成为,则编译以后的汇编

96、程序里面会成为,则编译以后的汇编程序里面会成为_x_x_x_x_x_x,在,在,在,在汇编程序中使用该变量,变量的标号应该是汇编程序中使用该变量,变量的标号应该是汇编程序中使用该变量,变量的标号应该是汇编程序中使用该变量,变量的标号应该是_x_x_x_x_x_x。 汇编程序中定义一个标识符汇编程序中定义一个标识符_x_x,C C语言程语言程序调用是序调用是序调用是序调用是x x x x,而不是,而不是,而不是,而不是_x_x 第48页/共71页第四十八页,共72页。2024年7月27日DSP原理(yunl)及应用49第第第第第第6 6 6 66 6章章章章章章 TMS320C54xC TMS3

97、20C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计(chn(chn(chn(chn(chn(chn x sh j) x sh j) x sh j) x sh j) x sh j) x sh j)(1 1)在)在C C中访问中访问.bss.bss中定义的汇编中定义的汇编(hubin)(hubin)变量变量 1 1 1)在)在C C中访问中访问.bss.bss.bss中定义的汇编变量中定义的汇编变量 汇编程序:汇编程序: .bss _var,1 ;.bss _var,

98、1 ;.bss _var,1 ;.bss _var,1 ;.bss _var,1 ;.bss _var,1 ;定义变量定义变量定义变量 .global _var ; .global _var ; .global _var ; .global _var ; .global _var ; .global _var ;说明为外部变量说明为外部变量 C C C C程序:程序:程序: extern int var; /*extern int var; /*extern int var; /*extern int var; /*extern int var; /*extern int var; /*声明为

99、外部变量声明为外部变量* * * */ / / / / / var=1; /* var=1; /* var=1; /* var=1; /* var=1; /* var=1; /*访问外部变量访问外部变量访问外部变量* * * * * */ / / / / /第49页/共71页第四十九页,共72页。2024年7月27日DSP原理(yunl)及应用50第第第第第第6 6 6 66 6章章章章章章 TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计语

100、言程序设计(chn(chn(chn(chn(chn(chn x sh j) x sh j) x sh j) x sh j) x sh j) x sh j)2 2 2 2)在)在)在)在C C C C中访问中访问中访问中访问(fngwn)(fngwn)(fngwn)(fngwn)汇编常数。汇编常数。汇编常数。汇编常数。 汇编程序:汇编程序: .global _table_size ; .global _table_size ; .global _table_size ; .global _table_size ;说明为外部变量说明为外部变量 _table_size .set 10000 ;_ta

101、ble_size .set 10000 ;_table_size .set 10000 ;_table_size .set 10000 ;定义常数定义常数C C C C程序:程序: extern int table_sizeextern int table_sizeextern int table_sizeextern int table_size; /*/*/*/*声明为外部变量声明为外部变量* * * */ / / / for(i=0;itable_size;i+) for(i=0;itable_size;i+) for(i=0;itable_size;i+) for(i=0;itable

102、_size;i+) 第50页/共71页第五十页,共72页。2024年7月27日DSP原理(yunl)及应用51第第第第第第6 6 6 66 6章章章章章章 TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计(chn(chn(chn(chn(chn(chn x sh j) x sh j) x sh j) x sh j) x sh j) x sh j)3)3)3)3)在在C C C C中访问中访问(fngwn)(fngwn)(fngwn

103、)(fngwn)汇编常数表汇编常数表汇编程序:汇编程序: .global _sine ;.global _sine ;说明为外部变量说明为外部变量说明为外部变量 .sect “sine_tab” ;.sect “sine_tab” ;定义命名段定义命名段_sine:_sine:_sine: .word 0.word 0.word 0 .word 1*32768/100 .word 1*32768/100 .word 1*32768/100 .word 2*32768/100 .word 2*32768/100 .word 2*32768/100 .word 2*32768/100.word 2

104、*32768/100.word 2*32768/100第51页/共71页第五十一页,共72页。2024年7月27日DSP原理(yunl)及应用52第第第第第第6 6 6 66 6章章章章章章 TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计(chn(chn(chn(chn(chn(chn x sh j) x sh j) x sh j) x sh j) x sh j) x sh j)C CC程序:程序:程序: extern int

105、sine; /* extern int sine; /* extern int sine; /*声明为外部变量声明为外部变量声明为外部变量(binling)*/(binling)*/(binling)*/ int *sine_pointer=sine; /* int *sine_pointer=sine; /* int *sine_pointer=sine; /*访问外部变量访问外部变量访问外部变量(binling)*/(binling)*/(binling)*/ float f; float f; float f; f=(float)sine_pointer2/32768; f=(float

106、)sine_pointer2/32768; f=(float)sine_pointer2/32768; 第52页/共71页第五十二页,共72页。2024年7月27日DSP原理(yunl)及应用53第第第第第第6 6 6 66 6章章章章章章 TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计(chn(chn(chn(chn(chn(chn x sh j) x sh j) x sh j) x sh j) x sh j) x sh j)

107、(2 2 2 2)在汇编程序中访问)在汇编程序中访问(fngwn)C(fngwn)C(fngwn)C(fngwn)C变量的例子变量的例子1)1)1)1)在汇编中访问在汇编中访问在汇编中访问在汇编中访问C C C C中定义的全局变量。中定义的全局变量。中定义的全局变量。中定义的全局变量。C C C C程序:程序:程序:程序: int i; /*int i; /*int i; /*int i; /*全局变量全局变量全局变量全局变量* * * */ / / / main( )main( )main( )main( ) 汇编程序:汇编程序:汇编程序:汇编程序: .global _i ;.global

108、_i ;.global _i ;.global _i ;说明为外部变量说明为外部变量说明为外部变量说明为外部变量 STM _i,AR0 ;AR0=iSTM _i,AR0 ;AR0=iSTM _i,AR0 ;AR0=iSTM _i,AR0 ;AR0=i第53页/共71页第五十三页,共72页。2024年7月27日DSP原理(yunl)及应用54第第第第第第6 6 6 66 6章章章章章章 TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计语言程序设

109、计(chn(chn(chn(chn(chn(chn x sh j) x sh j) x sh j) x sh j) x sh j) x sh j)2)2)在汇编中访问(fngwn)C(fngwn)C中定义的全局数组C C程序: int h20; /*int h20; /*int h20; /*int h20; /*全局数组变量全局数组变量* * * */ / main( )main( ) 第54页/共71页第五十四页,共72页。2024年7月27日DSP原理(yunl)及应用55第第第第第第6 6 6 66 6章章章章章章 TMS320C54xC TMS320C54xC TMS320C54xC

110、 TMS320C54xC TMS320C54xC TMS320C54xC语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计(chn(chn(chn(chn(chn(chn x sh j) x sh j) x sh j) x sh j) x sh j) x sh j)汇编程序:汇编程序:汇编程序:汇编程序: .global _h ; .global _h ; .global _h ; .global _h ;说明为外部变量说明为外部变量说明为外部变量说明为外部变量(binling)(binling)(binling)(binling) .data .data .data .

111、datah_add .word _h ;h_add .word _h ;h_add .word _h ;h_add .word _h ;数组数组数组数组h h h h的起始地址的起始地址的起始地址的起始地址 .text .text .text .text STM h_add,AR0 STM h_add,AR0 STM h_add,AR0 STM h_add,AR0 RPTZ A, #19 RPTZ A, #19 RPTZ A, #19 RPTZ A, #19 ST A,*AR0+ ST A,*AR0+ ST A,*AR0+ ST A,*AR0+第55页/共71页第五十五页,共72页。2024年

112、7月27日DSP原理(yunl)及应用56第第第第第第6 6 6 66 6章章章章章章 TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计(chn(chn(chn(chn(chn(chn x sh j) x sh j) x sh j) x sh j) x sh j) x sh j)(3)在C中访问汇编(hubin)函数 C C C C程序: extern int asmfunc( ); /*extern int asmfunc( )

113、; /*定义外部的汇编 函数* */ / int gvar; /* int gvar; /* int gvar; /* int gvar; /*定义全局变量* */ / / / main( ) main( ) int i; int i; i=samfunc(i); /* i=samfunc(i); /* i=samfunc(i); /* i=samfunc(i); /*调用函数* */ / / / 第56页/共71页第五十六页,共72页。2024年7月27日DSP原理(yunl)及应用57第第第第第第6 6 6 66 6章章章章章章 TMS320C54xC TMS320C54xC TMS320

114、C54xC TMS320C54xC TMS320C54xC TMS320C54xC语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计(chn(chn(chn(chn(chn(chn x sh j) x sh j) x sh j) x sh j) x sh j) x sh j)汇编程序汇编程序(hu bin chn x)(hu bin chn x)(hu bin chn x)(hu bin chn x) FP .set AR7FP .set AR7FP .set AR7FP .set AR7 .mmregs ; .mmregs ; .mmregs ; .mmregs ;使能

115、存储器映像寄存器使能存储器映像寄存器 .global _asmfunc ;.global _asmfunc ;.global _asmfunc ;.global _asmfunc ;说明为外部函数说明为外部函数 .global _gvar ;C.global _gvar ;C.global _gvar ;C.global _gvar ;C中定义的变量中定义的变量 .text.text.text.text_asmfunc:_asmfunc:_asmfunc:_asmfunc: FRAME #-1 ;(SP)-1 FRAME #-1 ;(SP)-1 FRAME #-1 ;(SP)-1 FRAME

116、#-1 ;(SP)-1SP,SP,形成局部帧形成局部帧 NOP ;NOP ;避免流水线冲突避免流水线冲突 STL A, SP ;STL A, SP ;参数参数i i暂存到暂存到SPSP ADD (_gvar),A ; ADD (_gvar),A ;将参数与将参数与gvargvar相加相加 STL A, (_gvar) ;STL A, (_gvar) ;保存至保存至gvargvar FRAME #1 ;(SP)+1SP, FRAME #1 ;(SP)+1SP,撤销局部帧撤销局部帧 RET ;RET ;函数返回函数返回 第57页/共71页第五十七页,共72页。2024年7月27日DSP原理(yun

117、l)及应用58第第第第第第6 6 6 66 6章章章章章章 TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计(chn(chn(chn(chn(chn(chn x sh x sh x sh x sh x sh x sh j)j)j)j)j)j)(4 4)在)在C C中使用中使用(shyng)(shyng)内嵌汇编内嵌汇编 在在C C程序中内嵌汇编语句是一种直接的程序中内嵌汇编语句是一种直接的C C模块和汇编模块接口方法。采用这种方法

118、一方面可以在C C程序中实现用C C C C语言难以实现的一些硬件控制功能;另一方面,也可以用这语言难以实现的一些硬件控制功能;另一方面,也可以用这种方法在种方法在C C程序中的关键部分用汇编语句代替程序中的关键部分用汇编语句代替C C C C语句以优化程序。语句以优化程序。格式:asmasm(“ “ 汇编语句汇编语句”)如:asm(asm(“ SSBX INTM SSBX INTM SSBX INTM SSBX INTM” ”) ) ) )第58页/共71页第五十八页,共72页。2024年7月27日DSP原理(yunl)及应用59第第第第第第6 6 6 66 6章章章章章章 TMS320C5

119、4xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计(chn(chn(chn(chn(chn(chn x sh j) x sh j) x sh j) x sh j) x sh j) x sh j)注意:注意: (1)” ” (1)” ” (1)” ” (1)” ”内的内容要符合汇编语言语法规则内的内容要符合汇编语言语法规则 例如:标号要从头开始例如:标号要从头开始 (2) (2) (2) (2)这种方式交易破坏这种方式交易破坏C C C C环境,汇编

120、出错编译器查不出;环境,汇编出错编译器查不出; (3) (3) (3) (3)插入跳转、标号可能导致插入跳转、标号可能导致C C C C代码出错;代码出错; (4) (4) (4) (4)不要在内嵌汇编中改变不要在内嵌汇编中改变(gibin)C(gibin)C(gibin)C(gibin)C变量的值;变量的值; (5) (5) (5) (5)不要在内嵌汇编中更改汇编环境的设置。因为改变不要在内嵌汇编中更改汇编环境的设置。因为改变(gibin)(gibin)(gibin)(gibin)可可能与能与C C C C编译器的设置有冲突。编译器的设置有冲突。 第59页/共71页第五十九页,共72页。20

121、24年7月27日DSP原理(yunl)及应用60第第第第第第6 6 6 66 6章章章章章章 TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计(chn(chn(chn(chn(chn(chn x sh x sh x sh x sh x sh x sh j)j)j)j)j)j)6.2.3 C54x C6.2.3 C54x C语言中断(zhngdun)(zhngdun)处理函数的实现1.C1.C语言中断函数的定义语言中断函数的定义语言

122、中断函数的定义语言中断函数的定义 C C C C语言中断函数的定义有两种实现方法,如下:(1 1)c_intd c_intd 函数 C C C C编译器约定,任何具有名为编译器约定,任何具有名为c_intdc_intd(d d为0909)的函数都)的函数都被假定为一个中断程序。如:被假定为一个中断程序。如:void c_int1()void c_int1() 第60页/共71页第六十页,共72页。2024年7月27日DSP原理(yunl)及应用61第第第第第第6 6 6 66 6章章章章章章 TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS

123、320C54xC TMS320C54xC语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计(chn(chn(chn(chn(chn(chn x sh j) x sh j) x sh j) x sh j) x sh j) x sh j) 这种定义的中断函数每个中断都采用固定的处理程序名。其中这种定义的中断函数每个中断都采用固定的处理程序名。其中这种定义的中断函数每个中断都采用固定的处理程序名。其中c_int0c_int0c_int0c_int0c_int0c_int0函数是系统复位函数是系统复位函数是系统复位的中断处理程序,主要用来完成系统上电后的初始化。该函数是的中断处理

124、程序,主要用来完成系统上电后的初始化。该函数是的中断处理程序,主要用来完成系统上电后的初始化。该函数是rts.librts.librts.librts.librts.librts.lib库函数来完成的,库函数来完成的,库函数来完成的,不用编写。不用编写。不用编写。缺点:可以定义的中断处理函数数目较少(只有缺点:可以定义的中断处理函数数目较少(只有缺点:可以定义的中断处理函数数目较少(只有9 9 9 99 9个),另外,函数名称与其功能的对应关个),另外,函数名称与其功能的对应关个),另外,函数名称与其功能的对应关系不够直观。因此,除了系不够直观。因此,除了系不够直观。因此,除了(ch le)c

125、_int0(ch le)c_int0(ch le)c_int0(ch le)c_int0(ch le)c_int0(ch le)c_int0函数外,一般不建议使用这种定义方法。函数外,一般不建议使用这种定义方法。函数外,一般不建议使用这种定义方法。 第61页/共71页第六十一页,共72页。2024年7月27日DSP原理(yunl)及应用62第第第第第第6 6 6 66 6章章章章章章 TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计语言程序设

126、计(chn(chn(chn(chn(chn(chn x sh j) x sh j) x sh j) x sh j) x sh j) x sh j)(2 2 ) interrupt interrupt 函数函数 中断函数定义的另一种实现方法中断函数定义的另一种实现方法(fngf)(fngf)就是利用就是利用interruptinterrupt关键字,将该关键字后面所定义的函数声明为关键字,将该关键字后面所定义的函数声明为中断函数,当编译器编译该函数时,就会把该函数编译中断函数,当编译器编译该函数时,就会把该函数编译成中断处理函数。成中断处理函数。 voidvoidvoidvoid interru

127、pt isr()interrupt isr()interrupt isr()interrupt isr() 采用这种方法,可以对每种中断服务函数的功能,给它采用这种方法,可以对每种中断服务函数的功能,给它采用这种方法,可以对每种中断服务函数的功能,给它采用这种方法,可以对每种中断服务函数的功能,给它起一个有意义的名称,非常直观,同时,中断服务函数的起一个有意义的名称,非常直观,同时,中断服务函数的起一个有意义的名称,非常直观,同时,中断服务函数的起一个有意义的名称,非常直观,同时,中断服务函数的个数也没有严格的限制。个数也没有严格的限制。个数也没有严格的限制。个数也没有严格的限制。第62页/共

128、71页第六十二页,共72页。2024年7月27日DSP原理(yunl)及应用63第第第第第第6 6 6 66 6章章章章章章 TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计(chn(chn(chn(chn(chn(chn x sh j) x sh j) x sh j) x sh j) x sh j) x sh j)2.2.关于C C语言中断函数(hnsh)(hnsh)的说明 (1 1 1 1)中断函数的返回类型必须是)中断函数的

129、返回类型必须是voidvoid类型,并且不能类型,并且不能有参数。有参数。(4 4 4 4 4 4)中断函数不能被普通)中断函数不能被普通)中断函数不能被普通)中断函数不能被普通C C C C代码之间调用代码之间调用代码之间调用代码之间调用代码之间调用代码之间调用(5 5 5 5 5 5)C C C C编译器规定进入中断函数时,要求编译器规定进入中断函数时,要求编译器规定进入中断函数时,要求编译器规定进入中断函数时,要求SPSPSPSP的内容是偶数;的内容是偶数;的内容是偶数;的内容是偶数;的内容是偶数;的内容是偶数;(6 6 6 6)如果屏蔽中断时,用户可以使用内嵌汇编语句来修改)如果屏蔽中

130、断时,用户可以使用内嵌汇编语句来修改)如果屏蔽中断时,用户可以使用内嵌汇编语句来修改)如果屏蔽中断时,用户可以使用内嵌汇编语句来修改)如果屏蔽中断时,用户可以使用内嵌汇编语句来修改)如果屏蔽中断时,用户可以使用内嵌汇编语句来修改IMRIMRIMRIMRIMRIMR使能或禁止指定的中断。使能或禁止指定的中断。使能或禁止指定的中断。使能或禁止指定的中断。(2 2 2 2)对中断函数,其寄存器的保护不使用入口或调用保护)对中断函数,其寄存器的保护不使用入口或调用保护)对中断函数,其寄存器的保护不使用入口或调用保护)对中断函数,其寄存器的保护不使用入口或调用保护规则;规则;规则;规则; (3 3)在返

131、回时中断函数使用)在返回时中断函数使用)在返回时中断函数使用)在返回时中断函数使用RETIRETIRETIRETI。第63页/共71页第六十三页,共72页。2024年7月27日DSP原理(yunl)及应用64第第第第第第6 6 6 66 6章章章章章章 TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计(chn(chn(chn(chn(chn(chn x sh j) x sh j) x sh j) x sh j) x sh j) x

132、 sh j) (7 7 7 7 7 7)一个中断)一个中断)一个中断)一个中断)一个中断)一个中断(zhngdun)(zhngdun)(zhngdun)(zhngdun)(zhngdun)(zhngdun)程序可以处理一个或多个中断程序可以处理一个或多个中断程序可以处理一个或多个中断程序可以处理一个或多个中断程序可以处理一个或多个中断程序可以处理一个或多个中断(zhngdun)(zhngdun)(zhngdun)(zhngdun)(zhngdun)(zhngdun); (8 8 8 8 8 8)中断)中断)中断)中断)中断)中断(zhngdun)(zhngdun)(zhngdun)(zhngd

133、un)(zhngdun)(zhngdun)处理和具体某种中断处理和具体某种中断处理和具体某种中断处理和具体某种中断处理和具体某种中断处理和具体某种中断(zhngdun)(zhngdun)(zhngdun)(zhngdun)(zhngdun)(zhngdun)的联系,由中断的联系,由中断的联系,由中断的联系,由中断的联系,由中断的联系,由中断(zhngdun)(zhngdun)(zhngdun)(zhngdun)(zhngdun)(zhngdun)向量来表明向量来表明向量来表明向量来表明向量来表明向量来表明 (9 9 9 9 9 9)在汇编语言中,访问中断)在汇编语言中,访问中断)在汇编语言中,

134、访问中断)在汇编语言中,访问中断)在汇编语言中,访问中断)在汇编语言中,访问中断(zhngdun)(zhngdun)(zhngdun)(zhngdun)(zhngdun)(zhngdun)处理函数是,处理函数是,处理函数是,处理函数是,处理函数是,处理函数是,加上加上加上加上加上加上“_”“_”“_”“_”“_”“_”第64页/共71页第六十四页,共72页。2024年7月27日DSP原理(yunl)及应用65第第第第第第6 6 6 66 6章章章章章章 TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC

135、语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计(chn(chn(chn(chn(chn(chn x sh j) x sh j) x sh j) x sh j) x sh j) x sh j)3.C3.C3.C3.C语言中断函数语言中断函数语言中断函数语言中断函数(hnsh)c_int0(hnsh)c_int0(hnsh)c_int0(hnsh)c_int0的作用的作用的作用的作用 C_int0C_int0C_int0C_int0C_int0C_int0函数初始化函数初始化函数初始化函数初始化C C C C环境时,要完成如下工作:环境时,要完成如下工作:环境时,要完成如

136、下工作:环境时,要完成如下工作:环境时,要完成如下工作:环境时,要完成如下工作: (1)(1)为系统堆栈定义个名为为系统堆栈定义个名为.stack.stack的段,并建立初始化堆栈和堆栈指针;(2 2 2 2)将.cinit.cinit.cinit.cinit段中的数据表拷贝到.bss.bss块,对全局和静态块,对全局和静态变量进行初始化;变量进行初始化;(3 3 3 3)设置DPDPDPDP,使其指向,使其指向.bss.bss段中的全局存储器页;段中的全局存储器页;(4 4)调用mainmain函数,开始运行C C C C程序;第65页/共71页第六十五页,共72页。2024年7月27日DS

137、P原理(yunl)及应用66第第第第第第6 6 6 66 6章章章章章章 TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计(chn(chn(chn(chn(chn(chn x sh j) x sh j) x sh j) x sh j) x sh j) x sh j)6.2.4 C54x C 6.2.4 C54x C 语言语言(yyn)(yyn)库函数调用库函数调用 为了便于用户对为了便于用户对DSPDSP进行进行C C语言编程,语

138、言编程,语言编程,语言编程,TITITITI公司提供公司提供公司提供公司提供了一些库函数,这些库函数主要是用来对了一些库函数,这些库函数主要是用来对了一些库函数,这些库函数主要是用来对了一些库函数,这些库函数主要是用来对DSPDSP的的的的C C语言语言语言语言编程环境的运行提供支持,称为运行支持库编程环境的运行提供支持,称为运行支持库编程环境的运行提供支持,称为运行支持库编程环境的运行提供支持,称为运行支持库(run-(run-time-support library).time-support library).time-support library).time-support libr

139、ary). TITITITI公司提供两种形式的运行支持库:公司提供两种形式的运行支持库: 目标代码:目标代码:目标代码:rts.librts.librts.librts.lib 源代码:源代码:rts.srcrts.srcrts.srcrts.src 在使用这些库函数时,只要将这些库函数包含到在使用这些库函数时,只要将这些库函数包含到工程里,添加一些有关的头文件,就可以使用这些库工程里,添加一些有关的头文件,就可以使用这些库中提供的函数中提供的函数第66页/共71页第六十六页,共72页。2024年7月27日DSP原理(yunl)及应用67第第第第第第6 6 6 66 6章章章章章章 TMS32

140、0C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计(chn(chn(chn(chn(chn(chn x sh j) x sh j) x sh j) x sh j) x sh j) x sh j) 在使用这些标准库函数时,一定要注意把包含这些在使用这些标准库函数时,一定要注意把包含这些库函数声明库函数声明(shngmng)(shngmng)(shngmng)(shngmng)的头文件包含到自己的文件的头文件包含到自己的文件中。中。例如:要使用标

141、准输入输出函数例如:要使用标准输入输出函数”fprintf”fprintf”fprintf”在文件中加上一条语句在文件中加上一条语句 #include #include #include 第67页/共71页第六十七页,共72页。2024年7月27日DSP原理(yunl)及应用68第第第第第第6 6 6 66 6章章章章章章 TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计(chn(chn(chn(chn(chn(chn x sh

142、j) x sh j) x sh j) x sh j) x sh j) x sh j)对对对对对对C C C C C C代码代码代码代码代码代码 进行手工汇编优化有两种方法:进行手工汇编优化有两种方法:进行手工汇编优化有两种方法:进行手工汇编优化有两种方法:进行手工汇编优化有两种方法:进行手工汇编优化有两种方法:(1 1 1 1 1 1)对照)对照)对照)对照)对照)对照C C C C C C代码写出汇编代码。代码写出汇编代码。代码写出汇编代码。代码写出汇编代码。代码写出汇编代码。代码写出汇编代码。 这种方法优化的效率这种方法优化的效率这种方法优化的效率这种方法优化的效率这种方法优化的效率这种方

143、法优化的效率(xio l)(xio l)(xio l)(xio l)(xio l)(xio l)很高,但是开发难度很大特别很高,但是开发难度很大特别很高,但是开发难度很大特别很高,但是开发难度很大特别很高,但是开发难度很大特别很高,但是开发难度很大特别是当代码量很大,结构很复杂时优化很容易出错。是当代码量很大,结构很复杂时优化很容易出错。是当代码量很大,结构很复杂时优化很容易出错。是当代码量很大,结构很复杂时优化很容易出错。是当代码量很大,结构很复杂时优化很容易出错。是当代码量很大,结构很复杂时优化很容易出错。 6.3 C54x C6.3 C54x C6.3 C54x C6.3 C54x C代

144、码优化代码优化(2)(2)(2)(2)(2)(2)先用编译器产生汇编代码,然后改写汇编代码。先用编译器产生汇编代码,然后改写汇编代码。这种方法优化效率低,但是开发难度降低了。这种方法优化效率低,但是开发难度降低了。第68页/共71页第六十八页,共72页。2024年7月27日DSP原理(yunl)及应用69第第第第第第6 6 6 66 6章章章章章章 TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计(chn(chn(chn(chn(

145、chn(chn x sh j) x sh j) x sh j) x sh j) x sh j) x sh j)手工汇编优化考虑以下手工汇编优化考虑以下(yxi)(yxi)几个方几个方面:面:1.1.1.1.对一个参数的保存;对一个参数的保存;2.2.2.尽量减少进行函数调用;尽量减少进行函数调用;尽量减少进行函数调用;3.3.3.3.尽量使用尽量使用RPTRPTRPTRPT和和RPTBRPTBRPTBRPTBRPTBRPTB来执行循环操作;来执行循环操作;4.4.4.4.优化循环;优化循环;优化循环;5.5.5.5.使用循环缓冲区;使用循环缓冲区;使用循环缓冲区;6.6.6.6.6.6. 循环

146、缓冲区地址分配问题;循环缓冲区地址分配问题;第69页/共71页第六十九页,共72页。2024年7月27日DSP原理(yunl)及应用70第第第第第第6 6 6 66 6章章章章章章 TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC TMS320C54xC语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计语言程序设计(chn(chn(chn(chn(chn(chn x sh j) x sh j) x sh j) x sh j) x sh j) x sh j)7.7.7.7.将一些常用的程序和数据,放在片内将一些常用的

147、程序和数据,放在片内RAMRAMRAMRAM运行;运行;8.8.8.8.注意注意(zh y)(zh y)(zh y)(zh y)流水线冲突流水线冲突9.9.9.9.使用比较快的寻址方式;使用比较快的寻址方式;10.10.10.10.去除一个冗余的赋值;去除一个冗余的赋值;11.11.11.11.使用一些主用指令;使用一些主用指令;12.12.12.12.使用并行指令;使用并行指令;第70页/共71页第七十页,共72页。2024年7月27日DSP原理(yunl)及应用71谢谢您的观看(gunkn)!第71页/共71页第七十一页,共72页。内容(nirng)总结2021年11月12日。其输出是显示器、通信口或者实时输出。C54x的存储空间有三个:程序存储空间、数据存储空间和I/O空间。sum=sum+ai。(4).switch段,包含大型switch语句的跳转表。.stack段定义了软件堆栈,该堆栈用于函数调用、变量传递以及(yj)局部变量分配。序调用是x,而不是_x。(SP)-1SP,形成局部帧。(SP)+1SP,撤销局部帧。谢谢您的观看第七十二页,共72页。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

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