理论教育 数据类型及其特点

数据类型及其特点

时间:2023-06-15 理论教育 版权反馈
【摘要】:数据类型的其他特点如下:1)所有的整型都是等效的,用16位二进制表示。除了基本数据类型外,还具有数组、结构、联合等构造类型数据。GPAMUX_BITS为自定义类型名。例如“unsigned int PWM1_GPIOA0:1;”,表示PWM1_GPIOA0为无符号整型变量。当一个结构中有效位段的长度不足16位时,可以加入保留位段,以保证数据的完整性。

数据类型及其特点

1.C28x编译器基本数据类型

C28x DSP的基本数据类型见表4-8。

4-8 C28x DSPC语言的数据类型

978-7-111-57271-8-Chapter04-19.jpg

由于C28x DSP中数据最小长度为16位,因此所有的字符(char)型数据,包括有符号字符(signed char)和无符号字符(unsigned char),长度均为16位,即用一个字的长度表示。

数据类型的其他特点如下:

1)所有的整型(char、short、int以及对应的无符号类型)都是等效的,用16位进制表示。

2)长整型和无符号长整型用32位二进制表示。

3)有符号数用补码表示。

4)字符(char)型是有符号数,等效于int。

5)枚举(enum)类型代表16位数值,等效于int。

6)所有的浮点类型(float、double及long double)等效,表示为IEEE单精度格式。

除了基本数据类型外,还具有数组、结构、联合等构造类型数据。

2.结构

结构(Structure,也称结构体)是一种构造类型数据。片内外设寄存器通常通过结构与联合变量的方法进行访问。

例如,281x DSP的通用输入输出GPIO A 口的MUX复用控制寄存器可用如下位段结构(Bit field structure)表示

struct GPAMUX_BITS {

unsigned int PWM1_GPIOA0:1; //第0位

unsigned int PWM2_GPIOA1:1; //1

unsigned int PWM3_GPIOA2:1; //2

unsigned int PWM4_GPIOA3:1; //3

unsigned int PWM5_GPIOA4:1; //4

unsigned int PWM6_GPIOA5:1; //5

unsigned intT1PWM_GPIOA6:1; //6

unsigned intT2PWM_GPIOA7:1; //7

unsigned intCAP1Q1_GPIOA8:1; //8

unsigned intCAP2Q2_GPIOA9:1; //9

unsigned inCAP3QI1_GPIOA10:1; //10

unsigned intTDIRA_GPIOA11:1; //11

unsigned intTCLKINA_GPIOA12:1; //12

unsigned int C1TRIP_GPIOA13:1; //13

unsigned int C2TRIP_GPIOA14:1; //14

unsigned int C3TRIP_GPIOA15:1; //第15位

};

其中的struct为关键字。GPAMUX_BITS为自定义类型名。大括号内定义结构内的各个成员。例如“unsigned int PWM1_GPIOA0:1;”,表示PWM1_GPIOA0为无符号整型变量。该变量占用一个2进制位,取值0或1。冒号表示成员不满一个字,其后的数值表示占用的2进制位数,这样的成员称为位段(Bit field),这样的结构称为位段结构。用此方法访问片内寄存器的位非常方便。

当一个结构中有效位段的长度不足16位时,可以加入保留位段,以保证数据的完整性。

例如,281x DSP的GPIO D 口的MUX复用控制寄存器结构

struct GPDMUX_BITS {(www.daowen.com)

unsigned int T1CTRIP_PDPA_GPIOD0:1; //0

unsigned int T2CTRIP_PDPA_GPIOD1:1; //1

unsigned int rsvd1:3; //位4~2,保留位

unsigned int T3CTRIP_PDPA_GPIOD5:1 ;//5

unsigned int T4CTRIP_PDPA_GPIOD6:1; //6

unsigned int rsvd2:9; //位15~7,保留位

};

同基本变量一样,结构变量需要先声明后使用,成员变量可以采用成员运算符即点运算符(.)进行引用,例如

struct GPDMUX_BITS bit; //声明一个GPDMUX_BITS结构类型的变量bit

bit.T1CTRIP_PDPA_GPIOD0=1//将GPIOD口的位0定义为PDPA功能

3.联合

联合(Union,也称为联合体)类型可以将不同类型的数据存放在同一个地方,且占据同样大小的存储空间。例如,定义联合类型GPDMUX_REG

union GPDMUX_REG{

unsigned int all; //声明成员变量all为无符号整型变量

struct GPDMUX_BITS bit; //声明成员变量bit为结构型变量

};

联合变量的声明与成员变量的引用与结构变量类似,例如

union GPDMUX_REG GPDMUX; //声明联合类型变量GPDMUX

GPDMUX.all=1; //寄存器GPDMUX赋值为1,

//将GPIOD位0引脚定义为PDPA功能,其他为数字I/O

联合可以出现在结构和数组中,结构和数组也可以出现在联合中。例如,结构类型GPIO_MUX_REGS中包含联合类型成员变量

struct GPIO_MUX_REGS{

union GPAMUX_REG GPAMUX;

union GPDMUX_REG GPDMUX;

};

定义了一个结构类型GPIO_MUX_REGS,其成员为联合类型变量GPAMUX、GPDMUX。

这种结构变量的声明与普通结构变量一样,例如

structGPIO_MUX_REGS GpioMuxRegs;

//表示GpioMuxRegs是结构GPIO_MUX_REGS的一个变量

声明了结构变量后,可以采用分级点运算符的方法引用各成员变量,例如

GpioMuxRegs.GPAMUX.all=0x077F; //CAP1-3,PWM1-6,T1pwm

GpioMuxRegs.GPDMUX.bit.T1CTRIP_PDPA__GPIOD0=1; //PDPA

GpioMuxRegs.GPDMUX.bit.T2CTRIP_SOCA__GPIOD1=0; //GPIOD1

GpioMuxRegs.GPDMUX.bit.T3CTRIP_PDPB__GPIOD5=0; //GPIOD5

GpioMuxRegs.GPDMUX.bit.T4CTRIP_SOCB__GPIOD6=0; //GPIOD6

定义281x DSP的GPIOA口时,采用了一条C语句,这样的程序简单。而定义GPIOD口时,采用了4条C语句,这样编程可以清晰地看到GPIOD口各位的定义。编程风格可以由编程者自己决定。

实际编程时,片内寄存器及其各位通常已经有人进行了定义,做成了头文件(.h文件),一般放在项目中包含的include路径下,用编译预处理命令#include包含该头文件,用户可以直接使用。例如,头文件DSP2803x_Gpio.h定义了2803x DSP的GPIO口的寄存器。

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

我要反馈