您好,欢迎访问一九零五行业门户网

C51单片机存储类型及存储模式

1.c51存储类型
对于在片外扩充的接口,可以根据硬件形成的地址,用#define语句进行定义,例如:
#define unsigned char xdata adaddr_at_0x2000;/*定义了片外接口地址为2000h*/
c51编译器支持80c51及其派生系列的体系结构,并提供对80c51所有存储区的访问。每个变量可以用表1中所列的存储器类型明确地分配到指定的存储空间。
表1 c51存储类型与80c51存储空间的关系
数据类型

字节
值的范围
char
8
1
-128~127
unsigned char
8
1
0~255
enum
16
2
-32768~32767
short
16
2
-32768~32767
unsigned short
16
2
0~65535
int
16
2
-32768~32767
unsigned int
16
2
0~65535
long
32
4
-2147483648~2147483647
unsigned long
32
4
0~4294967295
float
32
4
±1.175494e-38~±3.402823e+38
bit
1

0,1
sbit
1

0,1
sfr
8
1
0~255
sfr16
16
2
0~65535
对内部数据存储器的访问比对外部数据存储器的访问快许多,因此应当将频繁使用的变量放在内部数据存储器,而把较少使用的变量放在外部数据存储器中。
下面用实例说明各种存储器变量的声明。
(1)程序存储器变量:程序存储器的数据不能修改,通常将跳转向量或表格存放在该区,存储器类型标识符为code。
例如:unsigned char code text[] = “enter parameter”;
(2)直接寻址内部数据存储器变量:可在一个机器周期直接寻址,因此将常用的变量放在data区。存储器类型标识符为data。
例如:unsigned char data flag; /*声明一个内部直接寻址的无符号字节变量*/
(3)间接寻址内部数据存储器变量:用8位寄存器作为指针寻址内部存储器。存储器类型标识符为idata。
例如:unsigned char idata buffer[8]; /*声明一个内部间接寻址的无符号字节数组*/
(4)位寻址内部数据存储器变量:是内部数据存储器的位寻址区,位变量对需要位操作的数据十分有用,其存储器类型标识符为bdata。
注意:位寻址变量应声明为全局变量,否则编译将出错。
例如:unsigned char bdata bstatue; /*定义可位寻址的位变量,在片内ram中*/
sbit statue_0 = bstatue^0; /*定义位变量bstatue的第三位的符号地址*/
bit数据类型可以用来访问用bdata存储器类型标识声明的变量的位。
外部数据存储器的声明与前面例子相似,这里不再说明。
如果变量声明中遗漏存储器类型标识符,则自动选择默认的存储器类型。默认的存储器类型应用到所有全局变量、静态变量、函数自变量和不能分配寄存器的自动变量。默认的存储器类型取决于编译时的存储器模式。这都是不同于一般c语言的地方。
2.c51的存储器模式
存储器模式确定了用于函数自变量、自动变量和无明确存储类型变量的默认存储器类型。可用编译器控制指令small,compact和large指定编译时的存储器模式。用存储器类型标识符明确声明一个变量,优先于默认存储器类型。
(1)small模式
所有变量默认位于80c51内部数据存储器,这和使用data存储器类型标识符明确声明是相同的。该模式变量访问非常有效,但所有数据对象和堆栈必须适合内部ram。因为使用的堆栈空间决定于不同函数嵌套的深度,故对堆栈的尺寸要求严格。
(2)compact模式
所有变量默认位于外部数据存储器的一页(256b)内,这和使用pdata存储器类型标识符明确声明是相同的。地址高字节通常设置p2,编译器无法设置这个端口,故必须在启动代码中手工设置。该模式能容纳最多256b的变量,这个限制是用r0、r1间接寻址造成的。该模式的效率不如small模式的效率,变量访问速度不如small模式的快,但比large模式快。
(3)large模式
所有变量默认位于外部数据存储器,这和使用xdata存储器类型标识符明确声明是相同的。寻址使用数据指针(dprt),变量访问效率低,特别是对多字节变量,该模式的数据访问比small模式和compact模式生成的代码多。
一般经常使用small模式,它可生成最快、最紧凑和最有效的代码。通常可以明确指定变量的存储位置。仅当使用small模式时不适合应用或操作才上升到compact模式和large模式。
其它类似信息

推荐信息