首页 理论教育 相关基础知识:5.6.1解析

相关基础知识:5.6.1解析

时间:2023-06-20 理论教育 版权反馈
【摘要】:使用C语言开发TMS320C54x应用程序,与在PC上开发标准C程序方法基本一致,但有一些细微区别,具体表现在以下几个方面。表5-6 C语言中的数据类型特别注意:TMS320C54x的字节为16位。const关键字TMS320C54xC支持标准C的const关键字。注意,near、far关键字仅影响函数的调用,对函数指针没有任何影响。interrupt关键字TMS320C54xC拓展了标准C语言,增加了interrupt关键字,用于指定函数作为中断处理函数。 ioport关键字使用示例。

相关基础知识:5.6.1解析

使用C语言开发TMS320C54x应用程序,与在PC上开发标准C程序方法基本一致,但有一些细微区别,具体表现在以下几个方面。

1.TMS320C54x的C语言中的数据类型

TMS320C54xCPU是16位的,TMS320C54x提供的编译环境中的数据格式与标准ANSIC编程略有不同,见表5-6。

表5-6 C语言中的数据类型

978-7-111-35536-6-Chapter05-49.jpg

特别注意:TMS320C54x的字节(Byte)为16位。

2.TMS320C54xC扩展的C语言关键字

TMS320C54xC编译器支持标准的const(常数)和volatile(可变的)关键字,此外TMS320C54xC还扩展了标准C,支持interrupt(中断)、ioport(I/O端口)、near(近)、far(远)关键字。

(1)const关键字

TMS320C54xC支持标准C的const关键字。在标准C中该关键字可以对变量数组进行限定,保证他们的值在程序执行过程中不被改变。在TMS320C54xC中还常用来定义大的常数表并把它们分配到系统的ROM。例如:

978-7-111-35536-6-Chapter05-50.jpg

(2)volatile关键字

一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,每次使用它的时候必须从其地址中读取,而不能被编译器进行代码优化。换句话说,C编译时的优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。

(3)near、far关键字

TMS320C54xC拓展了标准C语言,增加了near、far关键字,用于指定函数调用的方式。例如:

978-7-111-35536-6-Chapter05-51.jpg

978-7-111-35536-6-Chapter05-52.jpg

当使用near限定的函数时,编译将使用CALL指令产生调用;当使用far限定的函数时,编译将使用FCALL指令产生调用。注意,near、far关键字仅影响函数的调用,对函数指针没有任何影响。

(4)interrupt关键字

TMS320C54xC拓展了标准C语言,增加了interrupt关键字,用于指定函数作为中断处理函数。中断处理函数与普通函数的区别在于采用了特殊的寄存器保护规则和返回序列。当中断发生时,中断处理函数必须保护所有寄存器,在返回时要恢复所有保护的寄存器,使用语法如下:

例5-20】 中断服务程序定义示例。

978-7-111-35536-6-Chapter05-53.jpg

在用C语言编写中断程序时,应注意以下几点:

1)中断的使能和屏蔽由程序员自己来设置。这一点可以通过内嵌汇编语句来控制中断的使能和屏蔽,即通过内嵌汇编语句来设置中断屏蔽寄存器IMR及INTM,也可通过调用汇编程序函数来实现。

2)中断程序不能有入口参数,即使声明,也会被忽略。

3)中断子程序即使被普通的C程序调用,也是无效的,因为所有的寄存器都已经被保护了。(www.xing528.com)

(5)ioport关键字

ioport关键字允许访问TMS320C54x的I/O存储空间,使用语法:

978-7-111-35536-6-Chapter05-54.jpg

其中,ioport是关键字;type必须是char、short、int或unsignedint之一;port hex_num指明了端口地址;hex_num必须是十六进制数的描述。

例5-21】 ioport关键字使用示例。

978-7-111-35536-6-Chapter05-55.jpg

3.C语言开发需要的支持

TMS320C54x在用C语言开发时,必须添加C开发运行库的支持。在C代码编译生成的目标代码执行main函数代码之前,有许多工作要做,才能保证程序的正确运行,这都需要开发库提供解决方案

从C编译过程如图5-5所示,C编译过程必须要有C运行库的支持。

978-7-111-35536-6-Chapter05-56.jpg

图5-5 C编译过程示意图

实际用户生成最终代码,最先被执行的函数并非main函数,而是C开发库提供的_c_int00,它是rts.lib库里的一个函数,完成初始化全局和静态变量、初始化C环境变量、设置堆栈(SP)、呼叫主函数等很多具体的工作,它建立起程序的运行环境,才能保障C程序的正确运行。因此,在建立的C开发工程里写main()函数,首先一定要添加C开发库文件,即创建工程以后,在工程中添加C:\CCStudio_v3.3\C5400\cgtools\lib\rts.lib,其中C:\CCStudio_v3.3\是CCS的安装路径。

另外,C生成最终代码如果需要脱离计算机开发环境,从而实现独立运行时,则必须指定DSP的复位中断向量。让它指向整个程序运行的最开始位置_c_int00。例如添加cvectors.asm汇编文件:

978-7-111-35536-6-Chapter05-57.jpg

这样在复位的时候,指定CPU从_c_int00处开始执行。

4.一些与标准ANSIC保持一致的常用语法

1)限定词:可由字母、数字和下画线组成。限定词必须以字母或下画线开头。区分大小写

2)常量:常量包括整型常量(八进制十进制、十六进制、长整型),字符常量,实型常量(小数形式、指数形式),字符串常量,表达式,算术表达式(整型表达式、实型表达式),逻辑表达式,字位表达式,强制类型转换表达式,逗号表达式(顺序表达式),赋值表达式,条件表达式,指针表达式。

3)数据变量定义格式:存储类别数据类型变量列表;

4)函数定义:

存储类别 数据类型 函数名(形参列表)

函数体

5)语句语法:包括表达式语句、函数调用语句、控制语句、复合语句、空语句。其中控制语句包括if语句、while语句、for语句和switch语句以及break语句、continue语句、return语句等。

6)预处理命令:主要是指define和include语句等。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈