C51编译器-语言扩展(1)-存储器模型和存储类型

发布者:bln898最新更新时间:2016-11-14 来源: eefocus关键字:C51  编译器  语言扩展  存储器模型  存储类型 手机看文章 扫描二维码
随时随地手机看文章
Cx51对ANSI标准C进行了扩展。这些扩展的大部分是为了支持8051系统的构架。这些扩展有:

8051上的存储器类型和区域

l         存储器模型

l         存储器类型指示

l         变量类型指示

l         位变量和可位寻址数据

l         特殊功能寄存器

l         指针

l         函数属性

关键字

_at_

alien

bdata

bit

code

compact

data

idata

interrupt

large

pdata

_priority_

reentrant

sbit

sfr

sfr16

small

_task_

using

xdata

你可以通过NOEXTEND控制指令禁止使用这些扩展

8051 Memory Areas

8051构架支持一定数量的物理上分开的用于数据和程序的存储器区域或空间。每个存储区域都有其优点和缺点。有的区域是只可读而不可写的,有的区域是可读也可以写的,还有一些区域的读写速度比别的地方快得多。这种多样性的存储器空间是与那种把所有的数据程序和常量都放在计算机内同一个物理空间的大型机小机型和微型机不同的。

Program Memory程序存储器

程序存储器是只读存储器,是不能被写入的。根据8051的变种和硬件设计,程序存储器可以8051CPU内部,也可以在外部,或者两者都有。程序存储器可以达到64K字节。程序代码包括所有的函数和运行时库都放在程序存储器。常量也可以放在程序存储器中。8051只执行入在程序存储器中的程序。

在Cx51中,程序存储器可以通过CODE类型的指示进行访问

Internal Data Memory

内部数据存储存在于8051CPU内部,可以读出也可写入。根据8015不同种类的变种,这个内部数据存储器可以在到256字节。前面的128个字节可以直接寻址也可以间接寻址。后面的128个字节只能通过间接寻址访问。从20h开始的16个字节是可以位寻址的。

由于内部数据存储器的访问可以使用8位地址,所以访问内部的数据存储器是非常快的。然而,内部的数据存储器只有256个字节。

使用Cx51,内部的数据存储器可以分成三个不同的数据类型:data, xdata and bdata

Data存储器指示仅指内部数据存储器的前128字节。放在这个区域的数据采用直接寻址的方法行进行访问。

Idata指所有内部数据存储器的所有256字节;然而,放在这一区域的数据是通过间接寻址进行访问的,这种寻址方法比直接寻址稍慢。

Bdata指从20h开始的16个字节的位寻址空间。这个区域可以声明那种可以位寻址的数据。

External Data Memory

(略)

Special Function Register Memory

(略)

Memory Models存储器模式

存储器模式决定了缺省的函数参数,自动变量和没有声明的内存类型的变量的存储器类型。

注意:除了非常特殊的应用,选用SMALL存储器在类型。这样产生的代码的运行速度更快,效率更高。

Small Model

在这一模式中,所有的变量,缺省的放在8051的内部数据存区。在这种模式下的数据存取效率是非常高的。然而,堆栈也在放在内部的RAM中,这样堆栈的大小要求就很苛刻。如果连接器/编译器被配置为可以覆盖内部的数据存储器,那么这一模式是最优的选择。

Compact Model

在这一模式中,所有的变量都放在外部数据存储器的第一页中。在这一模式中可以存放256字节的变量。这一模式的限制来源于它的寻址方式,这种方式是用寄存器R0和R1来寻址的。这种模式没有small模式效率高,变量的访问也没有那么快。但这种模式比large模式快。

当使用compact 模式时,Cx51用@R0和@R1来访问外部的数据存储器,如果想访问高于256字节的外部数据存器,那么高位字节可以通过Port 2来提供。在这种情况下,你必须正确初始化Port2到外部数据存储器的正确的页码。这些可以startup代码中来实现。你也必须为连接器指明PDATA的起始地址。

Large Model

在large模式下,所有的变量都放在外部的数据存储区(可以达到64K字节)。数据指针(DPTR)用来寻址。存储器的访问通过这个数据指针时效率是不商的,尤其是对于变量的数据目大于2个字节时。这种访问方式比small和compact方式要产生的代码要多。

Memory Types存储器类型

Cx51编译器明确地支持8051构架及基变种,而且提供了对所有8051存储区域的访问方式。每个变量都可以明确地分配给一个特定的存储器空间

Explicitly Declared Memory Types明确声明存储器类型

通过在声明中包含存储器类型标识符,可以指定变量的存储区域。

 

类型

 

描述

 

code

 

数据存储器(64K字节),通过movc @a+dptr 访问

 

data

 

直接寻址的内部数据存储器,最快地寻址变量

 

idata

 

间接寻址地的内部数据存储器,寻址内部的256字节

 

bdata

 

内部的可位寻址区域,可以位寻址和字节寻址(16字节)

 

xdata

 

外部数据存储器,通过mov @dptr寻址

 

pdata

 

寻址外部的一页(256字节)数据存储器,通过movx @Rn寻址

 

通过signed和unsigned属性,你可以在变量声明时包含存储区类型标识

char data var1;

char code text[] = "ENTER PARAMETER:";

unsigned long xdata array[100];

float idata x,y,z;

unsigned int pdata dimension;

unsigned char xdata vector[10][4][4];

char bdata flags;

注意:在以前的版本中

data char x;

等同于

char data x;

然而,在以后的版本的Cx51编译器,这一特点将不再支持

Implicit Memory Types默认存储器类型

如果在声时变量缺省存储器类型标识符,则自动选择默认的存储器类型。不能放在寄存器中的函数参数或自动变量也存放在缺省的存储器区域。

缺省的存储器类型由编译器根据SMALL,COMPACT和LARGE的设置决定。

关键字:C51  编译器  语言扩展  存储器模型  存储类型 引用地址:C51编译器-语言扩展(1)-存储器模型和存储类型

上一篇:C51编译器-语言扩展(2)-数据类型
下一篇:2路DS18B20控制

推荐阅读最新更新时间:2024-03-16 15:20

简单例子解析C语言编译器配置文件,驱动文件,驱动程序
配置文件,驱动文件,驱动程序对初学单片机C语言的童鞋来说极易搞昏,今天本人将以己昏昏,使人昭昭。 以LED动态扫描为例,看配置文件有什么: # include reg8052.h #ifndef __LED_DISPLAY_CFG_H #define __LED_DISPLAY_CFG_H //如果没有定义此文件,则定义此文件 # define __LED_DIN1_ON() p1^1=0 # define __LED_DIN1_OFF() p1^1=1 .......... ........... #define__LED-SEG(DATA) p0=DATA #endif 综上,所谓配置是定义了I/O口的作用。 驱动文件
[单片机]
51单片机驱动ADC0808电路图C51及汇编程序
这两天刚刚完成了一个用C编写的程序,这是我第一个用C语言编写的程序,并且调试成功。 第一个C程序,值得纪念,也值得以后参考。 本程序的功能是: 1.ADC0808转换功能;    2.数据16进制显示; 3.串行通信数据。 C51程序:工程文件下载: http://www.51hei.com/f/0808_c.rar #include absacc.h # inc lude reg51.h #define uchar unsigned char #define uint unsigned int sbit START=P3^6; //启动转换 sbit OE=P3^
[单片机]
51单片机驱动ADC0808电路图<font color='red'>C51</font>及汇编程序
C51之74HC595的使用
/* 名称:74HC595的使用 说明:74HC595是一个8位串行输入、并行输出的位移缓存器:并行输出为三态输出。在SCK 的上升沿,串行数据由SDL输入到内部的8位位移缓存器,并由Q7’输出,而并行输出则是在LCK的上升沿将在8位位移缓存器的数据存人到8位并行输出缓存器。当串行数据输入端OE的控制信号为低使能时,并行输出端的输出值等于并行输出缓存器所存储的值。而当OE为高电位,也就是输出关闭时,并行输出端会维持在高阻抗状态。 这里需要注意一点的就是,在芯片需要产生上升沿或者下降沿的时候:本质上就是将其对应引脚进行高低电平的转换。当然中间需要根据需要保持一定的时间(可以用空指令)。 具体引脚及使用说明见:百度百 (
[单片机]
Keil C51单片机中变量的使用方法解析
8051内核单片机是一种通用单片机,在国内占有较大的市场份额。在将C语言用于51内核单片机的研究方面,Keil公司做得最为成功。由于51内核单片机的存储结构的特殊性,Keil C51中变量的使用与标准C有所不同。正确地使用变量,有利于获得高效的目标代码。下面详细介绍Keil C51中变量的使用方法。 一、CPU存储结构与变量的关系 变量都需要有存储空间,存储空间的不同使得变量使用时的工作效率也不同。 标准C的典型运行环境是8086(含IA-32系列)内核,其存储结构是CPU内部有寄存器,外部有存储器,寄存器的访问速度大大高于存储器的访问速度。在标准C中,不加特别定义的变量是放在存储器中的,使用register可以强制变量存储在
[单片机]
Keil <font color='red'>C51</font>单片机中变量的使用方法解析
C51单片机学习笔记(六)——液晶显示屏的使用
1.LCD1602的认识 液晶显示屏简称液晶、LCD。各种型号的液晶通常是按显示字符的行数或液晶点阵的行、列进行命名的。1602的意思就是每一行显示16个字符,共可以显示2行,常见的液晶还有0801、0802、1601等,这类液晶是字符型液晶,只能显示ASCII码字符。而LCD12864属于图形型液晶,由128*64个像素点构成,可以显示各种图形包括汉字。 LCD1602可显示2行ASCII码字符,每行包括16个5*10点阵(像素),有16个引脚,其实物图如下所示: 2.LCD1602的引脚及其功能 3.LCD模块的内部结构 LCD1602模块的内部结构分为三部分:LCD控制器、LCD驱动器、LCD显示器 LCD控制器
[单片机]
<font color='red'>C51</font>单片机学习笔记(六)——液晶显示屏的使用
c51编程中sbit 和bit有什么区别
首先,bit和sbit都是C51扩展的变量类型 sbit一般用来定义特殊功能寄存器的位变量,以方便对寄存器的某位进行操作的 例如:sbit TXD=P3^0; 这样就定义了TXD为位变量,并且这个sbit量有确定的地址 bit则与一般的变量差不多,只不过bit定义的变量只有两种值存在0或是1 例如:bit p=0;编译器在编译过程将分配地址,所分配的地址是随机的
[单片机]
Portland 集团宣布PGI Visual Fortran即将上市
PGI 推出针对多核心 x64 处理器优化的 Fortran 并行编译器及开发工具 , 新产品集成 Microsoft Visual Studio 2005开发环境 意法半导体旗下子公司、世界领先的独立的高性能计算技术编译器及开发工具供应商 Portland Group (PGI) , 今天宣布 PGI Visual Fortran (PVF ) 全面上市销售。 PVF 将 PGI 的高性能 64 位及 32 位 Fortran 并行编译器及开发工具套件与 Microsoft Visual Studio 2005 整合在一起 , 为科学工作者和工程师从 32 位升级到
[新品]
51单片机读写AT29C040的C51程序
给大家介绍一个51单片机读写AT29C040的c51程序 #include 《reg51.h》 #include 《intrins.h》 unsigned char time; void int_t0(void) interrupt 1 { time++; } unsigned char d; //rec data bit rec(void) { TH0=0;time=0; while (!RI) {if (time》1) return(1);} RI=0; d=SBUF; return(0); } void sen(unsigned char dd) { SBUF=dd; while (!TI) {} TI=0; } voi
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved