当前位置:网站首页>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的存储器指针用两个字节保存,使用存储器指针比通用指针效率要高,速度要快。
存储器指针与通用指针实例比较
边栏推荐
猜你喜欢
async 和 await 原来这么简单
【飞控开发高级教程6】疯壳·开源编队无人机-AI语音控制
MySQL 主从,6 分钟带你掌握!
Detailed AST abstract syntax tree
宁德时代2号人物黄世霖辞任副董事长:身价1370亿
Golang死信队列的使用
按需视觉识别:愿景和初步方案
JS 内置构造函数 扩展 prototype 继承 借用构造函数 组合式 原型式creat 寄生式 寄生组合式 call apply instanceof
Reveal how the five operational management level of hundreds of millions of easily flow system
【统计机器学习】线性回归模型
随机推荐
汉源高科8光口12电口交换机千兆8光8电12电16电网管型工业以太网交换机
Internet Download Manager简介及下载安装包,IDM序列号注册问题解决方法
极验深知v2分析
机器学习中专业术语的个人理解与总结(纯小白)
钱江摩托某型号产品ECU货不对版 消费者知情权应如何保障?
EasyCVR平台海康摄像头语音对讲功能配置的3个注意事项
使用 ReportLab 绘制 PDF
怎么将自己新文章自动推送给自己的粉丝(巨简单,学不会来打我)
【木马免杀】
倒计时2天,“文化数字化战略新型基础设施暨文化艺术链生态建设发布会”启幕在即
百利药业IPO过会:扣非后年亏1.5亿 奥博资本是股东
149. The largest number on a straight line, and check the set
FreeRTOS中级篇
建模该从哪一步开始?给你分析,给零基础的你一些学习建议
MySQL基础
揭秘5名运维如何轻松管理数亿级流量系统
1-php学习笔记之数据类型
dpkg强制安装软件
node版本切换工具NVM以及npm源管理器nrm
Hinton2022年RobotBrains访谈记录