当前位置:网站首页>C51 存储类型与存储模式
C51 存储类型与存储模式
2022-08-03 19:56:00 【timerring】
目录
在C51中对变量进行定义的格式如下:
【存储种类】数据类型 【存储器类型】 变量名列表;
其中存储种类和存储器类型是可选项,当变量名列表中的变量不止一个时,用逗号隔开。
存储种类:4种
自动(auto),外部(extern),静态(static)和寄存器(register)
存储器类型:6种
DATA区、BDATA区、IDATA区、PDATA区、XDATA区、CODE区 指明该变量所处的内存空间
存储模式: 3种
SMALL、COMPACT和LARGE 指明了变量在没有指明存储器类型时默认的存储区域
1、存储种类
自动(auto)变量
当变量的生命周期结束时,它所占的内存单元也就被释放。定义变量时省略存储种类,则该变量默认为自动变量。
例: add()
{int i=10;
……
}
main()
{……
add();在调用add()子函数时为i分配内存单元,调用结束后变量i所占用的内存被释放。
……
}外部(extern)变量
假设一个变量在函数体外或别的程序中已被定义过,并且在本函数体内要使用该变量,则该变量要在本函数体内用extern 说明。用extern定义的变量称为外部变量。外部变量被定义后,在程序的执行过程中都是有效的。
静态(static)变量
用static定义的变量称为静态变量。静态变量在程序调用结束后其占用的内存单元并不被释放(其值保持不变)。
寄存器(register)变量
用register声明的变量称为寄存器变量。该类变量速度最快,应该存放使用频率最高的变量。通常C51编译器会自动识别程序中使用频率最高的变量,并自动将其作为寄存器变量,程序员无需专门声明。
变量的存储种类和存储器类型是不一样的。存储器类型指明该变量所处的内存空间。单片机内部有程序存储器和数据存储器。数据存储器又分为片内存储器和片外存储器。而片内存储器又分为低128字节和SFR特殊功能寄存器。
使用不同的存储器类型,程序会有不同的执行效率,在编写C51程序时,推荐指定变量的存储器类型,这样有利于提高程序的执行效率。
若省略存储器类型,编译器将根据使用的存储器模式(SMALL,COMPACT,LARGE)来规定默认的存储器类型。
六种存储器类型
(1) DATA区
该区速度最快,所以应该存放使用频率最高的变量。但是该区资源有限,除了存放变量外,还包含堆栈和寄存器组。一旦该区资源不够,会使程序发生莫名其妙的错误。
变量定义举例: char data i[10];
(2) BDATA区
在该区定义的变量,可以进行位寻址,并且可以声明位变量。它可以单独使用变量的某一位,而不一定要用位变量名引用位变量。
例如:
unsigned char bdata status;
if(status^5)
{
…………
}注意该区不允许定义float类型的变量。
(3) IDATA区
该区使用寄存器间接寻址,可以存放使用比较频繁的变量。变量定义举例: float idata var;
(4) PDATA区
该区只有一页即256字节,具体哪一页有P2口指定。使用MOVX指令进行数据传送。
变量定义举例: long PDATA var
(5) XDATA区
该区和PDATA区类似,只是空间增大了——64KB。对XDATA的寻址比对PDATA的寻址要慢(前者需要装入16位地址,而后者只需要装载8位地址)。进行数据传送时同样需要使用MOVX指令。
变量定义举例:unsigned char XDATA i;
(6) CODE区
该区为程序存储器,代码区中的数据一旦写入不可擦除不可重写。在该区中一般存放数据表,跳转向量和状态表等。变量定义举例:
变量定义举例:unsigned char CODE da[3]={0x04,0x58,0x56};
对于片外扩展I/O口,则要根据其硬件译码地址,将其视为片外数据存储器的一个单元,在程序的开始位置使用#define 定义:
例:
#define <absacc.h>
#define PORTA XBYTE[0x8003]
/*将PORTA定义为外部I/O口,其地址为0x8003*/,长度为一个字节。- 一旦在头文件或程序中对这些片内外I/O口进行定义以后,在程序中就可以自由使用这些I/O口了。
2、存储模式
存储模式指明了变量在没有指明存储器类型时默认的存储区域,共有:SMALL、COMPACT和LARGE三种。
(1)SMALL模式
所有的缺省变量,参数都存储在内部RAM中,优点:存储速度快,执行效率高。缺点:内部RAM有限,只适合小程序。
(2)COMPACT模式
所有缺省变量都存储在外部RAM的一页(256字节)中。具体哪一页可有P2口指定,该模式空间较SMALL模式充裕,速度较SMALL模式慢,较LARGE模式快,是一种中间模式。
(3)LARGE模式
所有参数变量都放在片外数据存储器中,容量大,但速度慢。
- 通过#pragma定义,例如#pragma small。
3、指针的存储类型
C51编译器支持两种不同类型的指针:存储器指针和通用指针
(1)通用指针
通用或未定型的指针的声明和标准C语言中一样。
如 : char *s; /* string ptr */
int *numptr; /* int ptr */
long *state; /* long ptr */
通用指针总是需要三个字节来存储,第一个字节是用来表示存储
器类型,第二个字节是指针的高字节,第三字节是指针的低字节
存储类型部分代表了该指针所指向的变量的存储器类型,存储类型的代码如下表所示:
通用指针可以用来访问所有类型的变量,而不管变量存储在哪个存储空间中,因而许多库函数都使用通用指针。通用指针很方便,但是也很慢,在所指向目标的存储空间不明确的情况下它们用的最多。
(2)存储器指针
存储器指针或类型确定的指针,在定义时包括一个存储器类型说明,并且总是指向此说明的特定存储器空间,例如:
char data *str; /* ptr to string in data */
int xdata *numtab; /* ptr to int(s) in xdata */
long code *powtab; /* ptr to long(s) in code */
正是由于存储器类型在编译时已经确定,通用指针中用来表示存储器类型的字节就不再需要了。指向idata、data、bdata和pdata的存储器指针用一个字节保存,指向code和xdata的存储器指针用两个字节保存,使用存储器指针比通用指针效率要高,速度要快。
存储器指针与通用指针实例比较
边栏推荐
猜你喜欢

Benchmarking Lane-changing Decision-making for Deep Reinforcement Learning

友宏医疗与Actxa签署Pre-M Diabetes TM 战略合作协议

【飞控开发高级教程4】疯壳·开源编队无人机-360 度翻滚

友宏医疗与Actxa签署Pre-M Diabetes TM 战略合作协议

(十六)51单片机——红外遥控

深入理解JVM-内存结构

演讲议题及嘉宾重磅揭晓,TDengine 开发者大会推动数据技术“破局”

codeforces:C. Maximum Subrectangle【前缀和 + 贪心 + 最小子数组和】

FreeRTOS Intermediate

详解AST抽象语法树
随机推荐
JS 内置构造函数 扩展 prototype 继承 借用构造函数 组合式 原型式creat 寄生式 寄生组合式 call apply instanceof
DeepMCP网络详解
钱江摩托某型号产品ECU货不对版 消费者知情权应如何保障?
Calculation of the array serial number of Likou brush questions (one question per day 7/28)
【leetcode】剑指 Offer II 008. 和大于等于 target 的最短子数组(滑动窗口,双指针)
JMeter笔记5 |Badboy使用和录制
虚拟机vmware设置nat模式上网
【木马免杀】
(十六)51单片机——红外遥控
ERROR: You don‘t have the SNMP perl module installed.
软件测试基本流程有哪些?权威的第三方软件检测机构推荐
高性能计算软件与开源生态| ChinaOSC
LeetCode 1374. 生成每种字符都是奇数个的字符串
消除对特权账户的依赖使用Kaniko构建镜像
Line the last time the JVM FullGC make didn't sleep all night, collapse
阿洛的反思
matplotlib画polygon, circle
FreeRTOS Intermediate
线上一次JVM FullGC搞得整晚都没睡,彻底崩溃
net-snmp私有mib动态加载到snmpd