当前位置:网站首页>C51 存储类型与存储模式
C51 存储类型与存储模式
2022-07-29 14:01: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的存储器指针用两个字节保存,使用存储器指针比通用指针效率要高,速度要快。
存储器指针与通用指针实例比较
边栏推荐
猜你喜欢
How to merge the code when there is a code conflict in the collaborative development of multiple people?
The Location object of BOM series
中国互联网科技企业群狼围攻,谷歌终于遭受重挫导致利润大跌,它为推动鸿蒙的发展而后悔...
[10:00 Open Class]: Application Exploration of Kuaishou GPU/FPGA/ASIC Heterogeneous Platform
国内helm快速安装和添加常用charts仓库
国产手机将用户变成它们的广告肉鸡,难怪消费者都买iPhone了
Work Efficiency - Fifteen minutes allows you to quickly learn Markdown syntax to proficient in typesetting practice notes
【pytorch】1.6 tensor 基本运算
Domestic mobile phones turn users into their advertising broilers, no wonder consumers are buying iPhones
系列文章|云原生时代下微服务架构进阶之路 - Boris
随机推荐
电视处理器a53和a55哪个厉害(cortexa55处理器好吗)
How to merge the code when there is a code conflict in the collaborative development of multiple people?
PHP代码审计得这样由浅入深地学
Domestic mobile phones turn users into their advertising broilers, no wonder consumers are buying iPhones
没遇到过这三个问题都不好意思说用过Redis
题目 1125: C语言训练-委派任务*
1192. 奖金
Children's programming electronics (graphical programming Scratch secondary level exam parsing (choice) in June 2022
【JS高级】js之闭包对象_04
浅谈如何在渗透测试中快速搞定webshell
Google Cloud X Kyligence|如何从业务视角管理数据湖?
How to Improve Embedded Programming with MISRA
EA&UML日拱一卒-活动图::StartClassifierBehavior和StartObjectBehavior
Understand the yolov7 network structure
国内helm快速安装和添加常用charts仓库
Chinese Internet technology companies were besieged by wolves. Google finally suffered a severe setback and its profits fell sharply. It regretted promoting the development of Hongmeng...
这么多年了,还搞不懂正则语法?
如何编辑CAD图库里的图纸
【微信小程序】全局配置
函数柯里化