c51存储类型与存储模式

timerring timerring     2022-12-01     379

关键词:

在C51中对变量进行定义的格式如下:

【存储种类】数据类型 【存储器类型】 变量名列表;

 其中存储种类和存储器类型是可选项,当变量名列表中的变量不止一个时,用逗号隔开。

存储种类:4种

自动(auto),外部(extern),静态(static)和寄存器(register)

存储器类型:6种 

DATA区、BDATA区、IDATA区、PDATA区、XDATA区、CODE区  指明该变量所处的内存空间

存储模式: 3种

SMALL、COMPACT和LARGE  指明了变量在没有指明存储器类型时默认的存储区域

1、存储种类

自动(auto)变量

当变量的生命周期结束时,它所占的内存单元也就被释放。定义变量时省略存储种类,则该变量默认为自动变量。

int i=10

……



main()

……

add();在调用add()子函数时为i分配内存单元,调用结束后变量i所占用的内存被释放。

……

C51

外部(extern)变量

假设一个变量在函数体外或别的程序中已被定义过,并且在本函数体内要使用该变量,则该变量要在本函数体内用extern 说明。用extern定义的变量称为外部变量。外部变量被定义后,在程序的执行过程中都是有效的。

静态(static)变量

用static定义的变量称为静态变量。静态变量在程序调用结束后其占用的内存单元并不被释放(其值保持不变)。

寄存器(register)变量

用register声明的变量称为寄存器变量。该类变量速度最快,应该存放使用频率最高的变量。通常C51编译器会自动识别程序中使用频率最高的变量,并自动将其作为寄存器变量,程序员无需专门声明。

变量的存储种类和存储器类型是不一样的。存储器类型指明该变量所处的内存空间。单片机内部有程序存储器和数据存储器。数据存储器又分为片内存储器和片外存储器。而片内存储器又分为低128字节和SFR特殊功能寄存器。

C51

      使用不同的存储器类型,程序会有不同的执行效率,在编写C51程序时,推荐指定变量的存储器类型,这样有利于提高程序的执行效率。

若省略存储器类型,编译器将根据使用的存储器模式(SMALL,COMPACT,LARGE)来规定默认的存储器类型。

六种存储器类型

(1) DATA区

      该区速度最快,所以应该存放使用频率最高的变量。但是该区资源有限,除了存放变量外,还包含堆栈和寄存器组。一旦该区资源不够,会使程序发生莫名其妙的错误。

  变量定义举例: char data i[10];

(2) BDATA区

      在该区定义的变量,可以进行位寻址,并且可以声明位变量。它可以单独使用变量的某一位,而不一定要用位变量名引用位变量。

   例如:

unsigned char bdata status;

if(status^5)



…………

C51

   注意该区不允许定义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定义为外部I/O口,其地址为0x8003*/,长度为一个字节。

C51

  • 一旦在头文件或程序中对这些片内外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 */

通用指针总是需要三个字节来存储,第一个字节是用来表示存储

器类型,第二个字节是指针的高字节,第三字节是指针的低字节

C51

存储类型部分代表了该指针所指向的变量的存储器类型,存储类型的代码如下表所示:

C51

通用指针可以用来访问所有类型的变量,而不管变量存储在哪个存储空间中,因而许多库函数都使用通用指针。通用指针很方便,但是也很慢,在所指向目标的存储空间不明确的情况下它们用的最多。

(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的存储器指针用两个字节保存,使用存储器指针比通用指针效率要高,速度要快。

存储器指针与通用指针实例比较

C51

基础知识c51单片机变量定义(代码片段)

【基础知识】C51单片机变量定义摘自《IAP15W4K58S4单片机的存储器与应用编程》主编:丁向荣;主审:姚永平;在使用一个变量或常量之前,必须先定义该变量或常量,指出其数据类型和存储器类型,以便编译系统为其分配相应的... 查看详情

80c51存储器与c51内存优化

80C51在物理结构上有四个存储空间:片内程序存储器、片外程序存储器、片内数据存储器和片外数据存储器。但在逻辑上,即从用户使用的角度上,80C51有三个存储空间:片内外统一编址的64KB的程序存储器地址空间(用16位地址... 查看详情

存储与数据库无关的模式

】存储与数据库无关的模式【英文标题】:StoringDatabase-AgnosticSchema【发布时间】:2010-10-0318:09:56【问题描述】:我们有一组应用程序可以与包括SqlServer和Access在内的多个数据库引擎一起工作。每个模式都是单独维护的,不以文本... 查看详情

c# 泛型类型和存储库模式

】c#泛型类型和存储库模式【英文标题】:c#generictypesandrepositorypattern【发布时间】:2015-10-0613:27:09【问题描述】:我正在使用存储库模式开发C#MVC应用程序。我使用Unity作为我的IoC,以便在MVC应用程序中实现我的存储库。我创建... 查看详情

大端模式与小端模式的理解以及判断方法(代码片段)

...式和小端模式在计算机中,我们知道数据是按照字节存储的,如果数据都是单字节存储,就不涉及存储顺序的问题。但是,大多数情况下,数据不是按照单字节的方式存储的,例如会有类似于int,double... 查看详情

存储库模式与“智能”业务对象 [关闭]

】存储库模式与“智能”业务对象[关闭]【英文标题】:Repositorypatternvs."smart"businessobjects[closed]【发布时间】:2010-10-2716:44:14【问题描述】:在.NET(Winforms、WPF、ASP.NET)上创建大型企业级应用程序时,我看到了两个主要的... 查看详情

数据类型与分布式存储

数据类型与分布式存储================================================================================概述:================================================================================数据类型 1.结构化数据★定义:结构化数据即 查看详情

materializedview模式

...持高效的查询和数据提取,提高应用程序的性能。问题在存储数据时,开发人员和数据管理员考虑的第一优先级通常集中在如何存储数据,而不是如何读取数据。所选择的存储格式通常与数据的格式、管理数据大小和数据完整性... 查看详情

将存储库模式与文档数据库一起使用是不是有意义?

】将存储库模式与文档数据库一起使用是不是有意义?【英文标题】:Doesitmakesensetousetherepositorypatternwithadocumentdatabase?将存储库模式与文档数据库一起使用是否有意义?【发布时间】:2011-11-2119:33:19【问题描述】:我目前正在试... 查看详情

C# 数据处理设计模式:通过 ORM 存储在 DB 中的对象,直接与数据库一起工作?

】C#数据处理设计模式:通过ORM存储在DB中的对象,直接与数据库一起工作?【英文标题】:C#Datahandlingdesignpattern:ObjectsstoredinDBviaORM,workdirectlywiththedatabase?【发布时间】:2012-03-1210:26:18【问题描述】:考虑一个存储商店库存的应用... 查看详情

Laravel Eloquent 与存储库/服务设计模式的关系

】LaravelEloquent与存储库/服务设计模式的关系【英文标题】:LaravelEloquentRelationshipswithRepository/ServiceDesignPattern【发布时间】:2015-03-0807:36:09【问题描述】:我目前正在开发一个使用存储库/服务层设计模式设置的Web应用程序,即我... 查看详情

oracle————存储过程与函数

存储过程存储过程参数模式包括IN、OUT、INOUT。IN(默认参数模式):表示当存储过程别调用时,实参值被传递给形参;形参起变量作用,只能读该参数,而不能修改该参数。IN模式参数可以是变量或表达式。OUT:表示当存储过程被... 查看详情

oracle————存储过程与函数

存储过程存储过程参数模式包括IN、OUT、INOUT。IN(默认参数模式):表示当存储过程别调用时,实参值被传递给形参;形参起变量作用,只能读该参数,而不能修改该参数。IN模式参数可以是变量或表达式。OUT:表示当存储过程被... 查看详情

大小端存储模式精解(代码片段)

...唯一的对应着1个字节(8bit)。这可以应对char类型数据的存储要求,因为char类型长度刚好是1个字节,但是有些类型的长度是超过1个字节的(字符串虽然是多字节的,但它本质是由一个个char类型组成的类似数组的结构而已),... 查看详情

存储库模式 - 如何理解它以及它如何与“复杂”实体一起使用?

】存储库模式-如何理解它以及它如何与“复杂”实体一起使用?【英文标题】:RepositoryPattern-Howtounderstanditandhowdoesitworkwith"complex"entities?【发布时间】:2015-09-2702:28:43【问题描述】:我很难理解存储库模式。关于这个话题... 查看详情

spring-data-jpa 存储库模式与 Querydsl 查询模式有啥区别?

】spring-data-jpa存储库模式与Querydsl查询模式有啥区别?【英文标题】:Whatisthedifferencebetweenspring-data-jpaRepositorypatternVsQuerydslquerypattern?spring-data-jpa存储库模式与Querydsl查询模式有什么区别?【发布时间】:2016-03-0113:22:29【问题描述... 查看详情

将存储库模式(和查询范围)与关系一起使用

】将存储库模式(和查询范围)与关系一起使用【英文标题】:UsingtheRepositoryPattern(andQueryScopes)withRelations【发布时间】:2014-08-0822:42:32【问题描述】:在Laravel4中,查询范围可用于所有查询(包括由关系查询生成的查询)。这意... 查看详情

c语言之数据的存储(整型数据)

一、整型数据在内存中的存储1.1整型数据家族char,short,intlong(每种类型又分为unsigned和signed,例如,signedchar,unsignedchar)1.2整型数据的存储对于整型数据,其在计算机内存当中,存储的是整型数据的补码但是对于不同类型的电脑,其补... 查看详情