KEIL中三种编译模式以及对变量空间的影响

发布者:和谐共处最新更新时间:2024-08-02 来源: cnblogs关键字:KEIL  编译模式 手机看文章 扫描二维码
随时随地手机看文章

三条编译模式控制命令:SMALL,COMPACT,LARGE,它们对变量存储器空间的影响如下。


SMALL:所有变量都被定义在8051单片机的片内RAM中,对这种变量的访问速度最快。另外,堆栈也必须位于片内RAM中,而堆栈的长度是很重要的,实际栈长取决与不同函数的嵌套深度。采用SMALL编译模式与定义变量时指定data存储器类型具有相同效果。

COMPACT:所有变量被定义在分页寻址的片外XRAM中,每一页片外XRAM的长度为256字节:即所有变量存储在片外XRAM的某一页中。这时对变量的访问是通过寄存器间接寻址(MOVX @R0,MOVX @R1)进行的,变量的低8位地址由R0和R1确定,变量的高8位地址由P2口确定。采用这种模式时,必须适当改变配置文件STARTUP.A51中的参数:PDATASTART和PDATALEN;同时还必须对uVision2的“Options选项/BL51 Locator 标签页/Pdata框”中键入合适的地址参数,以确保P2口能输出所需要的高8位地址。采用COMPACT编译模式与定义变量时指定pdata存储器类型具有相同效果。

LARGE:所有变量被定义在片外XRAM中(最大可达64KB),使用数据指针DPTR来间接访问变量(MOVX @DPTR),这种编译模式对数据访问的效率最低,而且将增加程序的代码长度。采用LARGE编译模式与定义变量时指定xdata存储器类型具有相同效果。

 

Note:

1、在程序中定义的变量,若不指定其存储区域(data、idata、xdata等),则系统自动存放到上述编译模式指定的存储区。

2、在指定编译器编译模式情况下,要想将变量存放在其他区域,可指定变量修饰类型。(假设指定为small模式,则默认变量存储在片内RAM区,此时可指定变量为idata类型,即可将其存放在片外RAM中)

3、同一段代码,在不同编译模式下,编译出的代码code大小为:small < compact < large。

4、同一编译模式下,变量存储区域不同,编译出的代码code大小为:data < idata < xdata。

 

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

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

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

LARGE模式:可用全部64K空间Small:变量存储在内部ram里;

如果在变量声明时未声明变量的存储器类型,则该变量的存储器类型,由程序的存储模式来决定。
 小模式(small model):默认data区
 紧凑模式(compact model):默认pdata区
 大模式(large model):默认xdata区

Small:变量存储在内部ram里;
       small模式下,再入函数的堆栈是设在idata中的
Compact:变量存储在外部ram里,使用页8位间接寻址;
       compact模式下,再入函数堆栈是设在pdata中的
Large:变量存储在外部Ram里,使用16位间接寻址;


关键字:KEIL  编译模式 引用地址:KEIL中三种编译模式以及对变量空间的影响

上一篇:头文件intrins.h的用法
下一篇:KEIL中程序优化说明

推荐阅读最新更新时间:2026-03-25 16:37

KUKA机器人smartPAD屏上空间鼠标的相关变量介绍
空间鼠标操作显示: 选项卡鼠标 激活运行模式 “ 空间鼠标 ” 配置 空间鼠标 用空间鼠标选择运行的坐标系 轴、全局、基坐标 或 工具 复选框 同步: 未勾选 (默认):在选项卡 按键 和 鼠标 中可以选择不同的坐标系。 勾选:在选项卡 按键 和 鼠标 中只能选择一个相同的坐标系。如果在一个选项卡中更改了坐标系,则另一个选项卡中的设置会自动调整。 审核编辑:刘清
[机器人]
stm32专题三十七:自动分配变量到指定 SRAM 空间
当有多个内存块时,MDK 优先使用空间更大的内存。 使用 sct 文件来进行内存管理: 编程要点: 1 取消勾选Use Memory Layout from Target Dialog,然后直接点击 edit 来编辑工程的 sct 文件: sct 文件的默认配置如下所示: 看一下此时的 map 文件。可以看到,HEAP 和 STACK 都位于IRAM1 区域。 接下来,我们将64 KB的内存空间分成两块,如下所示(直接复制,然后修改): 我们将 64 KB 的内部SRAM,人为的分成了 20 + 28 KB,按照 MDK 优先使用大容量的空间进行存储,我们预计结果会是保存在ERAM1中,map文件证实
[单片机]
stm32专题三十七:自动分配<font color='red'>变量</font>到指定 SRAM <font color='red'>空间</font>
不同内存空间定义变量在51单片机编程中的注意事项
不同内存空间(data xdata bdata)定义变量在51单片机编程中的注意事项 减小字体 增大字体 1、data区空间小,所以只有频繁用到或对运算速度要求很高的变量才放到data区内,比如for循环中的计数值。 2、data区内最好放局部变量。 因为局部变量的空间是可以覆盖的(某个函数的局部变量空间在退出该函数是就释放,由别的函数的局部变量覆盖),可以提高内存利用率。当然静态局部变量除外,其内存使用方式与全局变量相同 3、确保你的程序中没有未调用的函数。 在Keil C里遇到未调用函数,编译器就将其认为可能是中断函数。函数里用的局部变量的空间是不释放,也就是同全局变量一样处理。这一点Keil C做得很愚蠢,但也没办
[单片机]
STM32全局变量占用程序存储空间
全局变量是否占用最终程序的存储空间,这个问题其实早在我们学习C语言的时候就已经告诉我们答案了。我隐约记得初学C语言的时候,书本上告诉我们: 全局自动变量 保存在读写数据段 全局静态变量 保存在读写数据段 全局常量 保存在只读数据段 局部自动变量 保存在栈空间里的 而我们在做单片机程序的时候,由于都是用的C编程,所以数据的存储也是一样的。上面的读写数据段在单片机里就是RW-data段,上面的只读数据段在单片机里就是RO-data,还有一个零初始化数据段ZI-data段(由此可见,RW-data加上ZI-data就是总共要分配的RAM空间大小),最后一个Code段就不用介绍了,大家都明白。 那么究竟一个STM32程序编译链接完
[单片机]
STM32全局<font color='red'>变量</font>占用程序存储<font color='red'>空间</font>吗
在C51中变量空间分配几个方法
1、data区空间小,所以只有频繁用到或对运算速度要求很高的变量才放到data区内,比如for循环中的计数值。 2、data区内最好放局部变量。 因为局部变量的空间是可以覆盖的(某个函数的局部变量空间在退出该函数是就释放,由别的函数的局部变量覆盖),可以提高内存利用率。当然静态局部变量除外,其内存使用方式与全局变量相同; 3、确保你的程序中没有未调用的函数。 在Keil C里遇到未调用函数,编译器就将其认为可能是中断函数。函数里用的局部变量的空间是不释放,也就是同全局变量一样处理。这一点Keil C做得很愚蠢,但也没办法。 4、程序中遇到的逻辑标志变量可以定义到bdata中,可以大大降低内存占用空间。 在51系列芯片中
[单片机]
华为Mate20系列迎重磅更新:月亮模式与方舟编译器加入
今天华为产品经理宣布华为的Mate20系列迎来重磅更新,月亮模式与方舟编译器两大重量级功能加入其中。 具体适配的机型为:Mate 20 全网通版 HMA-AL00、Mate 20移动定制版 HMA-TL00、Mate 20 Pro 全网通版 LYA-AL00、LYA-AL10、Mate 20 Pro 移动定制版 LYA-TL00、Mate 20 RS 保时捷设计 LYA-AL00、Mate 20 X 全网通版 EVR-AL00、Mate 20 X移动定制版 EVR-TL00。 升级注意事项有五点: 1、 因版本限制,请各位花粉务必先升级到 9.1.0.120 或9.0.0.200(Mate 20和Mate 20 X)/9.0
[手机便携]
华为Mate20系列迎重磅更新:月亮<font color='red'>模式</font>与方舟<font color='red'>编译</font>器加入
新手入门proteus与keil5软件仿真stm32的手把手超简单教程
软件版本号: keil版本号: keil软件版本 proteus版本号: proteus软件版本 下载: 相关keil源代码和proteus文件下载链接如下: 链接:https://pan.baidu.com/s/1RuYRmrCz-q4vhpFdMRe7xA?pwd=voq9 提取码:voq9 解压: 下载之后解压缩即可得到相对应的文件(建议直接解压在D盘的子目录下以防止中文路径带来的不知名bug)。 解压缩后: 打开【D:keil_led_lightProjectkeil_led_light.uvprojx】文件后,再打开【D:keil_led_lightDocREADME.txt】文件即可得到非常简单的说明,按
[单片机]
【51单片机】矩阵键盘逐行扫描法〈C语言+Keil5+Proteus仿真〉
一、环境 我用的是Keil5做编译工具,用proteus仿真。除了Keil5不知道有没有其他好用的能生成.hex文件的软件(要单片机运行是需要生成.hex文件的),Proteus则是一款很好用的仿真软件,原件很多。当然,之前有试过multisim14,也是非常不错的软件,自带有可以编写代码的文本编辑器,但没找到我想要的原件。所以选择了Proteus。 二、硬件部分 我们可以先打开Proteus: 1. Proteus新建工程 点击开始界面的创建工程,先创建一个Proteus的工程。 (注意:最好每个项目单独一个文件夹,后期的文件很乱很杂) 工程名写好,选择好文件夹,后面的可以一直下一步。 2. 添加元件 可以直接
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved