C51中定义变量时如果省略存储器类型,Keil C51编译系统则会按编译模式SMALL、COMPACT和LARGE所规定的默认存储器类型去指定变量的存储区域,无论什么存储模式都可以声明变量在任何的8051存储区范围i,但是把最常用的命令如循环计数器和队列索引放在内部数据区可以显著地提高系统性能。以下介绍一下Keil编译选项Target中的Memory Model和Code Rom Size的设置。

Memory Model(存储器模式)

SMALL模式
  在本模式中所有的变量在缺省的情况下位于8051系统的内部数据区(这和用data存储类型标识符明确声明的一样,因此对这种变量的访问数据最快),在本模式中,变量访问非常有效,然而所有的东西包括堆栈必须放在内部RAM中,堆栈大小是不确定的,它取决于函数嵌套的深度。典型的,如果连接/定位器配置为内部数据区变量可覆盖,SMALL模式是最好的模式,但是SMALL模式的地址空间受限,在写小型的应用程序时,变量和数据放在Data内部数据存储器中是很好的,因为访问速度快,但在较大的程序中Data区最好只存放小的变量、数据或常用的变量(如循环计数、数据索引),而大的数据则放在别的存储区域,否则Data区就容易溢出。

COMPACT模式

  COMPACT模式把变量都定位在MCS-51系统的外部数据存储器中,外部数据存储段可有最多256字节(一页 ),这是对变量的访问是通过寄存器间接寻址(MOVX @Ri)进行的。采用这种编译模式时,变量的高8位地址由P2口确定,因此,在采用这种模式的同时,必须适当改变启动程序STARTUP.A51中的参数PDATASTART和PDATALEN,用L51进行连接时还必须采用连接控制命令PDATA来对P2口地址进行定位,这样才能确保P2口为所需的高8位地址。

LARGE模式

  LARGE模式中,所有函数和过程的变量以及局部变量数据段都被定义在51系统的外部数据存储器中,外部数据存储器最多可有64K,这要求用DPTR数据指针来间接地访问数据,因此,这种访问效率并不高,尤其是对2个或多个字节的变量,用这种模式访问数据程序的代码将会很大。

Code Rom Size(设置ROM空间的使用)

SMALL模式:只用低于2K的程序空间

COMPACT模式:单个函数的代码量不能超过2K,整个程序可以使用64K的程序空间

LARGE模式:可用全部64K空间

Keil中Memory Model和Code Rom Size说明的更多相关文章

  1. Keil中 Program Size: Code RO-data RW-data ZI-data

    一般 MCU 包含的存储空间有:片内 Flash 与片内 RAM,RAM 相当于内存,Flash 相当于硬盘. 现在我们就一个STM32的工程为例子 linking... Program Size: ...

  2. Keil 中 Program Size: Code RO-data RW-data ZI-data 所代表的意思

    在Keil中编译工程成功后,在下面的Bulid Ouput窗口中会输出下面这样一段信息: Program Size: Code=6320 RO-data=4864 RW-data=44 ZI-data ...

  3. keil中的memory model

    这两天仿真遇到的怪事真的是一大堆. 还是读写Flash的代码.keil编译OK,但是仿真就是莫名其妙地挂掉出现一些乱七八糟的事情. 后面发现是keil 中的memory model勾选错了,勾选的是l ...

  4. RW RO ZI ROM keil中的含义

    编译的一个ARM的程序,会得到这样的信息: ============================================================================== ...

  5. Keil中的code关键字

    一般说来,我们在C语言中定义的每一个变量初始化后都会占用一定的内存(RAM)空间.但是在keil中提供了一个特殊的关键字“code”,这个关键字在标准C中是没有的.其语法举例如下: unsigned ...

  6. 关于keil中data,idata,xdata,pdata,code的问题

    转自关于keil中data,idata,xdata,pdata,code的问题 ‍从数据存储类型来说,8051系列有片内.片外程序存储器,片内.片外数据存储器,片内程序存储器还分直接寻址区和间接寻址类 ...

  7. 内存模型 Memory model 内存分布及程序运行中(BSS段、数据段、代码段、堆栈

    C语言中内存分布及程序运行中(BSS段.数据段.代码段.堆栈) - 秦宝艳的个人页面 - 开源中国 https://my.oschina.net/pollybl1255/blog/140323 Mem ...

  8. 1、MVC和EF中的 Model First 和 Code First

    准备:先引入MVC和EF的dll包 *命令方法:打开工具——库程序包管理器——程序包管理器控制台,选择自己的项目 a)     Install-Package EntityFramework -Ver ...

  9. MVC和EF中的 Model First 和 Code First

    准备:先引入MVC和EF的dll包 *命令方法:打开工具——库程序包管理器——程序包管理器控制台,选择自己的项目 a)     Install-Package EntityFramework -Ver ...

随机推荐

  1. 使用StreamReader与StreamWriter进行文本文件读写

    namespace filetest { class FileUtil { public static void WriteFile(string file) { using (FileStream ...

  2. AQS详解

    一.概述 谈到并发,不得不谈ReentrantLock:而谈到ReentrantLock,不得不谈AbstractQueuedSynchronized(AQS)! 类如其名,抽象的队列式的同步器,AQ ...

  3. Mac OS X Mavericks使用手册

    基本信息 作者: 施威铭研究室 出版社:清华大学出版社 ISBN:9787302386018 上架时间:2014-12-30 出版日期:2015 年1月 开本:16 版次:1-1 所属分类: 计算机 ...

  4. Mysql 创建用户并对其赋予操作权限

    授权命令GRANT 语句的语法如下: GRANT privileges (columns) ON what TO user IDENTIFIEDBY "password" WITH ...

  5. 【HDU1231】How Many Tables(并查集基础题)

    什么也不用说,并查集裸题,直接盲敲即可. #include <iostream> #include <cstring> #include <cstdlib> #in ...

  6. Java I/O 模型的演进

    什么是同步?什么是异步?阻塞和非阻塞又有什么区别?本文先从 Unix 的 I/O 模型讲起,介绍了5种常见的 I/O 模型.而后再引出 Java 的 I/O 模型的演进过程,并用实例说明如何选择合适的 ...

  7. pyqt说明

    我是个PHP程序员,不过有时候觉得需要写些小软件,对于我这种不太熟悉桌面软件开发的人来说,界面问题最让我头痛.听说Qt很强大,而且是跨平台,所以决定学习它用来弥补我写桌面软件的不足. Qt一般是通过C ...

  8. Eclipse代理设置

    这段时间公司实行代理上网,不仅通过浏览器上网须要不停的输入username和password,在本地调试程序时候Eclipse居然也弹出框让输入username和password. 如图: 解决的方法 ...

  9. What is NetApp's Cluster File System?

    Data ONTAP GX: A Scalable Storage Cluster www.usenix.org/event/fast07/tech/full_papers/eisler/eisler ...

  10. Android应用程序发送广播(sendBroadcast)的过程分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6744448 前面我们分析了Android应用程 ...