当前位置:网站首页>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的存储器指针用两个字节保存,使用存储器指针比通用指针效率要高,速度要快。
存储器指针与通用指针实例比较

边栏推荐
- The core principles of electronic games
- 搞直播啦,千视超高清4K NDI编解码器8月3日19:00准时开播
- 为什么 ThreadLocal 可以做到线程隔离?
- 打卡广汽本田喜悦安全驾驶中心,体验最刁钻的场地训练
- 数据库mysql的执行顺序(sql语句大全实例教程)
- Gdb debugging common concepts finishing
- rosbag data plotting MATLAB
- 国内helm快速安装和添加常用charts仓库
- 尚硅谷大叔培训:揭秘Flink四种执行图——ExecutionGraph和物理执行图
- PytestFixture实战应用+Pytest.ini与conftest.py应用详解+Fixture及yield实现用例前置后置
猜你喜欢

2022开放原子全球开源峰会数据库分论坛圆满召开

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...

R错误:缺少值不允许写在下面的作业的数据帧

打卡广汽本田喜悦安全驾驶中心,体验最刁钻的场地训练

human pose estimation-DEKR2021CVPR

中国互联网科技企业群狼围攻,谷歌终于遭受重挫导致利润大跌,它为推动鸿蒙的发展而后悔...

Violence recursion to dynamic programming 02 (very clever game of CARDS)

【JS面试题】面试官问我:遍历一个数组用 for 和 forEach 哪个更快?

How to merge the code when there is a code conflict in the collaborative development of multiple people?

即时通讯移动端开发之网络连接优化
随机推荐
Interfaces and Abstractions
Violence recursion to dynamic programming 02 (very clever game of CARDS)
EA&UML日拱一卒-活动图::CallOperationAction(续)
新来技术总监:谁在用 isXxx 形式定义布尔类型,明天不用来了!
即时通讯移动端开发之网络连接优化
题目 1125: C语言训练-委派任务*
升级openssl1.1.1(mix2s哪个版本不断流)
无线传感器网络定位综述
还在开发短信验证码登录?试试(本机号码一键登录)
【10点公开课】:快手GPU/FPGA/ASIC异构平台的应用探索
通过二维顺序表实现杨辉三角
蚂蚁三面滑铁卢!遭分布式截胡,靠这些笔记潜修30天,挺进京东
项目经理:不错啊!SSO单点登录代码写出来了,把时序图也画一下?
trivy如何从非关系型数据库查询数据
验证二叉树的前序序列化[抽象前序遍历]
关于内部类
The key to cracking AI full-process development problems
Work Efficiency - Fifteen minutes allows you to quickly learn Markdown syntax to proficient in typesetting practice notes
gdb调试常用概念整理
C#实现线程管理类