单片机中的C语言

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gin_love/article/details/51164786

   最近写单片机总会遇到一些关于数据存储类型和指针的相关问题,所以特整理此篇方便以后查看。

一、C51变量的数据类型

                                   C51的数据类型

 

数据类型

长度

值域

位型

 bit

1bit

0或1

字符型

 signed char

1Byte

-128~127

 unsigned char

1Byte

0~255

整型

signed int

2Byte

-32768~+32768

unsigned int

2Byte

0~65535

signed long

4Byte

-2147483648~+2147483647

unsigned long

4Byte

0~4294967295

实型

float

4Byte

1.176E-38~3.40E+38

指针型

data/idata/pdata

1Byte

1字节地址

code/xdata

2Byte

2字节地址

通用指针

3Byte

其中1字节为存储类型编码,2、3字节为地址偏移量

访问SFR

的数据类型

sbit

1bit

0或1

sfr

1Byte

0~255

sfr16

2Byte

0~65535

 说明:对于字符型、整型和长整型均有有符号和无符号型两种,如果不是必需,尽可能选择unsigned型,

         这将会使编译器省却符号位的检测,使生成的程序代码比signed类型短得多。

二、数据的存储类型和存储模式

存储类型                                                            描述
    data                                           直接寻址片内数据存储器的低128字节,访问速度最快
    bdata                                         可位寻址内部数据存储区,允许位与字节混合访问(16B)
    idata                                          间接寻址内部数据存储区,可访问安全部内部地址空间(256B)
   pdata                                         分页(256B)外部数据存储区,由操作码MOV@Ri访问
   xdata                                          外部数据存储区(64KB),由操作码MOVX@Ri访问
   code                                           代码存储区(64KB),由操作码MOVC@A+DPTR访问

       访问内部数据存储器(idata)比访问外部数据存储器(xdata)相对要快一些,因此,通常将经常使用的变量置于内部数据存储器中,而将较大及很少使用放入数据变量置于外部数据存储器中。
例如:
     data char x;/*字符变量x定位在片内数据存储区。等同于char data x;*/
        如果用户没有对变量的存储类型定义,则编译器承认默认存储类类型,默认存储类型由编译控制命令的存储模式部分决定。
       在Keil里面通过 Option for target/Target/Memory Model 设置存储模式。

三、存储器模式

    存储器模式决定了变量的默认存储器类型,参数传递区和无明确存储区类型的说明。C51的存储器模式有SMALL、LARGE和COMPACT。C51也支持混合模式。例如在LARGE模式下生成的程序可将一些函数分页放在SMALL模式中,从而加快执行速度。

存储器模式                                                        描述
SMALL                            参数及局部变量放入可直接寻址的内部存储器(最大为128B,默认存储器类型为data)
COMPACT                      参数及局部变量放入分页外部存储区(最大为256B,默认存储器类型为pdata) 
LARGE                           参数及局部变量直接放入外部数据存储器(最大为64KB),默认存储器类型为xdata

四、指针变量说明举例

      指针本身是一个变量,包括存放的存储区和数据长度。因此在指针类型的定义中要说明:被指的变量的数据类型和存储类型;指针变量本身的数据类型(占几个字节)和存储类型(即指针本身存在哪个存储区)。
例如:
long xdata *px;           <span style="font-family: Arial, Helvetica, sans-serif;">/*指针px指向long型xdata区(每个数据占4个单元,指针                                                     自身在默认存储器)指针长度为两个字节*/</span>
char xdata * data pd;     /*指针pd指向字符型xdata区,自身在data区,长度为两个                            字节*/
/*定义一个人类型为int型的通用型指针,指针自身在data区,长度为3个字节*/
data int * pn;//等效于int * data pn 及int * pn



    

             
















猜你喜欢

转载自blog.csdn.net/gin_love/article/details/51164786