C51编译器支持3种内存模型
- Small Model
- Compact Model
- Large Model
函数参数、automatic变量在声明时,如果没有指定内存类型,C51编译器会根据内存模型进行隐式声明;
内存模型 | 函数参数/自动变量 | 默认全局变量 | 默认常数变量 | 默认指针定义 | 默认指针大小 |
---|---|---|---|---|---|
small | data | data | data | * | 3 bytes |
compact | pdata | pdata | pdata | * | 3bytes |
large | xdata | xdata | xdata | * | 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设计、开发平台、软件工具等知识分享。
欢迎转发,请注明出处及作者。关注微信公众号,获取最新文章动态。