8051单片机基础3:C51内存模型(small, compact和large)

C51编译器支持3种内存模型

  • Small Model
  • Compact Model
  • Large Model

函数参数、automatic变量在声明时,如果没有指定内存类型,C51编译器会根据内存模型进行隐式声明;

内存模型函数参数/自动变量默认全局变量默认常数变量默认指针定义默认指针大小
smalldatadatadata*3 bytes
compactpdatapdatapdata*3bytes
largexdataxdataxdata*3 bytes

使用内存模型的方式

1. 在源文件中使用#pragma来指定内存模型

#pragma large		/* 以下代码默认使用large内存模型 */
int a;
int *p;

void function(int arg, int *p)
{
	/* user code */
}

2. 在声明/定义函数时,后面加上small/compact/large对单个函数进行指定

int mtest (int i, int y)            /* Small model */
{
  return (i * y + y * i + func(-1, 4.75));
}


int large_func (int i, int k) large /* Large model */
{
  return (mtest (i, k) + 2);
}

3. 配置编译器/Keil,进行全局设置内存模型
在这里插入图片描述

1. Small Model

在small模型中,默认所有变量都隐式声明存放在8051内部RAM data区域(低128字节),和使用data进行显示声明效果一样;

使用small模式时,必须注意预留给堆栈的空间大小,所需堆栈空间大小取决于函数的嵌套层数;

一般情况下,Keil会默认使用small模式,因为这个模式生成的代码量小,访问速度快;

2. Compact Model

在Compact模型中,默认所有变量都隐式声明存放在8051扩展RAM的低256字节区域,和使用pdata进行显示声明效果一样。

读写这个区域时通过R0, R1寄存器进行间接访问。

Compact模式不如small模式更快、更高效,但是比Large模式更快一点;

3. Large Model

在Large模型中,默认所有变量都隐式声明存放在8051扩展RAM(最大支持64K字节),和使用xdata进行显示声明效果一样。

使用xdata读写扩展RAM区域时,通过数据指针寄存器(DPRT)进行间接寻址,因此读写速度慢,特别时读写大于2个字节变量时。

Large模式下,编译生成的代码最大,因为生成汇编代码时需要更多的操作步骤。


本文完~

关于作者

微信公众号:萤火虫的电子笔记

分享电子产品开发软、硬件方面知识,51单片机、STM32、ARM、AltiumDesigner PCB设计、开发平台、软件工具等知识分享。

欢迎转发,请注明出处及作者。关注微信公众号,获取最新文章动态。
在这里插入图片描述

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值