《2022年数据的存储器类型和存储器模式整理 .pdf》由会员分享,可在线阅读,更多相关《2022年数据的存储器类型和存储器模式整理 .pdf(6页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、数据的存储器类型和存储器模式2009-05-10 13:28 数据的存储器类型和存储器模式变量是一种在程序执行过程中,其数值不断变化的量。C51规定变量必须先定义后使用。 C51对变量的进行定义的格式如下: 存储种类 数据类型 存储器类型 变量名表。其中,存储种类和存储器类型是可选项。 1. 存储种类存储种类是指变量在程序执行过程中的作用范围。变量的存储种类有四种,分别为:自动( auto )、外部( extern )、静态( static)和寄存器(register)。使用存储种类说明符auto 定义的变量称为自动变量。自动变量作用范围在定义它的函数体或复合语句内部,在定义它的函数体或复合语
2、句被执行时, C51才为该变量分配内存空间,当函数调用结束返回或复合语句执行结束时,自动变量所占用的内存空间被释放,这些内存空间又可被其他的函数体或复合语句使用。可见使用自动变量能最有效地使用80C51单片机内存。 定义变量时, 如果省略存储种类,则该变量默认为自动(auto )变量。由于 80C51单片机访问片内RAM 速度最快,通常将函数体内和复合语句中使用频繁的变量放在片内RAM 中,且定义为自动变量,可有效地利用片内有限的RAM 资源。使用外部种类存储符extern定义的变量称为外部变量。在一个函数体内,要使用一个已在该函数体外或别的程序模块文件中定义过的外部变量时,该变量在本函数体内
3、要用extern说明。外部变量被定义后,即分配了固定的内存空间,在程序的整个执行时间内都是有效的。通常将多个函数或模块共享的变量定义为外部变量。 外部变量是全局变量,在程序执行期间一直占有固定的内存空间。当片内 RAM 资源紧张时,不建议将外部变量放在片内RAM 。使用存储种类说明符static定义的变量称为静态变量。静态变量分为局部静态变量和全局静态变量。局部静态变量是在两次函数调用之间仍能保持其值的局部变量。有些程序要求在多次调用之间仍然保持变量的值,使用自动变量无法作用到这一点。使用全局变量有时会带来意外的副作用,这时可采用局部静态变量。使用存储种类说明符register定义的变量称为寄
4、存器变量。 80C51访问寄存器的速度最快,通常将使用频率最高的那些变量定义为寄存器变量。C51编译器能自动识别程序中使用频率最高的变量,并自动将其作为寄存器变量,用户无需专门声明。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 6 页 - - - - - - - - - 2. 存储器类型存储器类型:用以指明所定义的变量应分配在什么样的存储空间。一、程序存储区Code :程序空间用 code 标识符来访问片内、片外统一编址的程序存储区,寻址范围为065535。二、内部数据
5、存储区Data: 直接访问的内部数据存储器该标识符通常是指低128 字节的内部数据区,为片内直接寻址的RAM 空间,寻址范围 0127。Idata : 间接访问的内部数据存储器该标识符是指全部256 个字节的内部存储区,为片内间接寻址的RAM 空间,寻址范围为 0255。Bdata: 可位寻址的内部数据存储器该标识符是指可位寻址的16 字节内部存储区( 20H2FH ),位地址范围为0127.本空间允许按字节和按拉寻址。三、外部数据存储区Xdata: 外部数据存储器( 64KB )该标识符是指外部数据存储区 (64KB )内的任何地址, 寻址范围为 065535。Pdata: 分页的外部数据存
6、储器( 256 字节)该标识符仅指一页或256 字节的外部数据存储区,寻址范围为0255。定义变量时,除了说明存储种类外,还允许说明变量的存储器类型。存储器类型和存储种类是完全不同的概念,存储器类型指明该变量所处的单片机的内存空间。如果在变量定义时省略了存储器类型标识符,C51编译器会选择默认的存储器类型。默认的存储器类型由SMALL 、COMPACT 和 LARGE 存储模式指令决定。 1) DATA区对 DATA区的寻址是最快的,所以应该把使用频率高的变量放在DATA区,由于空间有限, 必须注意使用DATA 区,DATA区除了包含程序变量外,还包含了堆栈和寄存器组DATA区。unsigne
7、d char data system_status=0; unsigned int data unit_id2; char data inp_string16; float data outp_value; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 6 页 - - - - - - - - - mytype data new_var; 在 SMALL存储模式下, 未说明存储器类型时,变量默认被定位在DATA区。标准变量和用户自定义变量都可以存储在DATA区,只要不超过
8、DATA区的范围。 因为 C51使用默认的寄存器组传递参数,至少失去了8B。另外要定义足够大的堆栈空间,当内部堆栈溢出的时候,程序会产生莫名其妙的错误,实际原因是80C51系列单片机没有硬件报错机制,堆栈溢出只能以这种方式表示出来。 2)BDATA 区当在 DATA区的位寻址区定义变量,这个变量就可进行位寻址,并且声明位变量。这对状态寄存器来说十分有用,因为它可以单独使用变量的每一位,而不一定要用位变量名引用位变量。下面是一些在BDATA 区中声明变量和使用位变量的例子。unsigned char bdata status_byte; unsigned int bdata status_wor
9、d; unsigned long bdata status_dword; sbit stat_flag=status_byte4; if ( status_word15) stat_flag=1; 编译器不允许在BDATA 区中定义float和 double 类型的变量, 如果想对浮点数的每位寻址,可以通过包含float和 long 的联合实现。typedef union /*定义联合类型 */ unsigned long lvalue; /*长整型 32 位*/ float fvalue; /*浮点数 32 位*/ bit_float; /*联合名 */ bit_float bdata my
10、float; /*在 BDATA 区中声明联合*/ sbit float_ld=myfloat.lvalue31; /*定义位变量名 */ 3)IDATA区名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 6 页 - - - - - - - - - IDATA区也可以存放使用比较频繁的变量,使用寄存器作为指针进行寻址。在寄存器中设置8 位地址进行间接寻址,与外部存储器寻址比较,它的指令执行周期和代码长度都比较短。unsigned char idata system_stat
11、us=0; unsigned int idata unit_id2; char idata inp_string16; float idata outp_value; 4)PDATA 和 XDATA 区在这两个区声明变量和在其他区的语法是一样的,PDATA 区只有 256B,而 XDATA 区可达 65536B,举例如下。unsigned char xdata system_status=0; unsigned int pdata unit_id2; char xdata inp_string16; float pdata outp_value; 对 PDATA 和 XDATA的操作是相似的,
12、对PDATA 区寻址比对XDATA 区寻址要快,因为对 PDATA 区寻址只需要装入8 位地址,而对XDATA 区寻址需装入16 位地址。所以尽量把外部数据存储在PDATA 区中,对PDATA 和 XDATA 寻址要使用MOVX 指令,需要2 个处理周期。 5) CODE 区 CODE区即 80C51的程序代码区,所以代码区的数据是不可改变的,80C51的代码区不可重写。一般代码区中可存放数据表,跳转向量和状态表,对CODE 区的访问和对XDATA区的访问的时间是一样的,代码区中的对象在编译时初始化,否则就得不到想要的值。下面是代码区的声明例子。unsigned int code unit_i
13、d2=0 x1234, 0 x89ab; unsigned char code uchar_data16 =0 x00,0 x01,0 x02,0 x03,0 x04,0 x05,0 x06,0 x07, 0 x08,0 x09,0 x10,0 x11,0 x12,0 x13,0 x14,0 x15; 3. 存储模式名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 6 页 - - - - - - - - - C51编译器允许采用三种存储模式:小编译模式SMALL 、紧凑编译
14、模式COMPACT、大编译模式LARGE 。 一个变量的存储器模式确定了变量在内存中的地址空间。在 SMALL 模式下,该变量在80C51单片机的内部RAM 中;在 COMPACT和 LARGE 模式下,该变量在80C51单片机的外部 RAM 中。 同样一个函数的存储器模式确定了函数的参数和局部变量在内存中的地址空间。在 SMALL 模式下,函数的参数和局部变量在80C51单片机的内部RAM 中;在 COMPACT和 LARGE 模式下,函数的参数和局部变量在80C51单片机的外部RAM 中。下面这个例子说明了存储模式的定义方法。变量和函数的存储模式#pragma small /*默认存储器类
15、型为80C51片内直接寻址RAM*/ char data i,j,k; /*在 80C51片内直接寻址RAM 中定义了3 个变量,默认为自动变量 */ char i,j,k; /*未指明存储模式,由#pragma small决定,与前一句完全等价*/ int xdata m, n; /*在 80C51片外 RAM 中定义了2 个自动变量 */ static char m, n; /*在 80C51片内直接寻址RAM 中定义了2个静态变量 */ unsigned char xdata ram128; /*在 80C51片外 RAM 中定义了大小为128B的数组变量 */ int func1(in
16、t i, int j) large /*指定 large 模式 */ return(i+j); int func2(int i, int j) /*未指明存储模式, 按默认的SMALL模式*/ return(i-j); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 6 页 - - - - - - - - - 不同的存储器类型访问速度是不一样的,如:unsigned char data var1; /*SMALL模式, var1 被定位在 DATA区*/ /*即 80C5
17、1片内直接寻址RAM*/ unsigned char pdata var1; /*COMPACT模式, var1 被定位在PDATA 区*/ /*即 80C51片外按页面间接寻址 RAM*/ unsigned char xdata var1; /*LARGE模式, var1 被定位在 XDATA区*/ /*即 80C51片外间接寻址RAM*/ 在 SMALL模式下, var1 被定位在 DATA区,经 C51编译器编译后,采用内部RAM 直接寻址方式访问速度最快;在COMPACT 模式下, var1 被定位在PDATA 区,经 C51编译器编译后,采用外部RAM 间接寻址方式访问速度较快;在LARGE 模式下, var1 被定位在XDATA区,经 C51编译器编译后, 采用外部RAM 间接寻址方式访问速度最慢。为了提高系统运行速度,建议在编写源程序时,把存储模式设定为SMALL ,再在程序中把XDATA 、PDATA 和 IDATA等类型变量进行专门声明。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 6 页 - - - - - - - - -