单片机内程序运行的时候ram空间是如何分配的?

发布者:TranquilWhisper最新更新时间:2017-01-19 来源: eefocus关键字:单片机  程序运行  ram空间 手机看文章 扫描二维码
随时随地手机看文章

我现对一个程序进行减少片内ram的使用的优化,有一些效果,同时也产生了些疑问,在此向各位大虾请教:
一、现象:
1、    我在通过减少全局变量、函数内变量的使用,减少函数间参数传递等手段来优化,发现某些时候我减少一个变量的使用,keil编译的结果就显示data减少了一字节,有时候这样一直减少几个变量的使用,data值一直都不会变,接着再减少变量的使用,又会一个一个的减少,到后来又不减少了。
2、    我屏蔽程序中一些代码之后编译,显示data反而是增加了。
二、疑问:
1、单片机程序运行的时候,内部ram是如果分配管理的,data值由哪些部分组成?
2、之前描述的两个现象如何解释?
3、data值是不包括堆栈空间的,那么程序运行的堆栈空间大概需要多少,和哪些因素有关,能不能预估?
4、单片机片内ram的使用限度是多少?(指keil编译出来的data值最好不要超过多少)  

 

答:单片机内程序运行的时候ram空间是如何分配的
1、RAM的分配是与你选择的编译模式有关,你可以看下编译器的手册,再打开最后产生的分配对照表仔细对照源程序,应该可以找到规律。

2、仍然与编译模式有关,通常全局变量数量的变化可以立即反映在data段的长度上,但如果局部变量是指定用堆栈,就不一定会反映在data段的长度上了。

3、堆栈空间与你的RAM空间的分配有关,这是在连接时确定的,在链接描述文件中指定的。

4、RAM的使用限度当然跟你的单片机RAM的大小有关。

对不起,我对Keil的环境不熟,我不能帮你解释具体到Keil上如何;上面讲的是基本原理,每个C语言的环境都是这样。

 

 

谢谢平常人!若有机会到广佛一带,我请你喝酒!
keil编译模式我选择的small:variables in data模式,大家一般也都应该是这个模式吧。变量都是定义到data/idata区的。
keil编译结果和编译器本身有关,就算是不同的编译器,在内存分配上是不是有共同遵从的方法呢?
或者您能不能介绍其他某个编译器的内存分配方式呢?


通常全局变量数量的变化可以立即反映在data段的长度上,但如果局部变量是指定用堆栈,就不一定会反映在data段的长度上了。
re:你的意思是局部变量占用的空间的使用还不一定包含到编译结果里了?我编译的结果是200多字节的data,由哪些组成?


ram使用限度跟单片机有关,那好比我的单片机片内ram是256的,那我使用的空间(也就是keil编译出来的结果)的限度是多少,或者和哪些有关?也就是通常做法,我要留给堆栈多少空间?

另外再问一下:
同一个程序生成的bin文件和hex文件在大小上有什么关系?
听说bin会是hex的一半?
这两个文件在使用中有什么区别?

 

 

变量在内存的分配方式
通常单片机的RAM区可以分成3类,短地址区、长地址区和外部地址区。

短地址区一般指00-FF之间可以用8位地址访问的区域,长地址区一般指0100-FFFF之间必须用多于8位的地址访问的区域,外部地址区指CPU外部总线访问的区域,不同的区域有不同的指令寻址方式,例如:
MOV A, 40H ;访问短地址区
MOV A, @DPTR ;访问长地址区

一般的51中没有外部地址区。

根据用途还划分了一个堆栈区。

不同的存储分配模式决定了全局变量是放在那个区域,访问短地址区的指令可能比访问长地址区的指令短且快,但长地址区可容纳较多变量,尤其是较大的数组。

局部变量有两种分配策略,一种是放在堆栈中,因为局部变量只在他所在的函数中有效,出了这个函数退栈就可以清理掉局部变量所占空间,空间可重复利用。这种策略下,减少局部变量的使用并反映不出内存占用量的减少,因为内存的占用是动态的。

另一种策略是分析函数调用关系,把局部变量放在某段特定的内存区,如下例:
func1()
{
CHAR c1, c2;
....
}

func2()
{
CHAR x1, x2, x3;
...
}

main()
{
func1();
func2();
....
}

编译器发现func1与func2没有调用关系,就把c1与x1分配到同一个地址,c2与x2分配到同一个地址,x3分配到另一个地址;这样处理可以比堆栈的方法得到较高的效率。当你减掉c1时,并没有减少内存的总用量。

所以,堆栈的长度要看你程序的调用关系,局部变量的使用策略等因素,根据实际情况决定。

至于bin与hex文件的区别,我的理解bin是用二进制的形式存放可执行代码,而hex文件使用ASCII形式存放可执行代码;如
  0x12, 0x34, 0x56  bin文件
  1 2 3 4 5 6 hex文件

你说他们的大小是什么关系?

对不起,我只能讲这么多了,再讲就可以写一本书了。


关键字:单片机  程序运行  ram空间 引用地址:单片机内程序运行的时候ram空间是如何分配的?

上一篇:单片机HEX文件完全解读
下一篇:怎样利用好单片机上的存储器资源来实现OD的存储与访问

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

循环冗余校验码的单片机及CPLD实现
    摘要: 循环冗余码校验(CRC)是一种可靠性很高的串行数据校验方法。介质循环冗余码校验的基本原理,并分别用单片机和CPLD作了循环冗余码验的软件实现和硬件实现。包括汇编语言和VHDL语言源程序。     关键词: 差错校验 查表法 CPLD 1 基本原理 串行数据的差错检验是保证数据正确的必要手段,通常采用奇遇校验法和循环冗余校验法。这两种方法都是通过冗余数据来提供必要信息。奇偶校验法适用于以字节为单位数据传输。例如用偶校验传送1个ASCII字符时,要附加1个校验位,从而使全部9位中“1”的个数为偶数。奇偶校验简单易行,但当数据崩溃或出现多位错误时,往往不能检验出来,因而可靠性不高。 循环冗余码
[应用]
基于8031单片机的自动计量进料系统
1 引言 某糖果厂于1985年从德国SIMON电子公司引进带微电脑的计量进料器116EM型生产线,用于糖果生产。由于引进时间较长、图纸资料不全、外方维护不便等原因,时有因电脑控制部分发生故障而影响生产的情况发生。从提高设备国产化比重、节约外汇、方便维护、保证生产出发,本文应厂方要求,在对进口装置的设备性能和电气信号时序透彻分析的基础上,开发了基于8031的嵌入式的微机自动计量进料系统,该系统从性能要求、信号时序到外观尺寸都与进口装置完全匹配,成功地实现了进口设备控制系统国产化。 2 计量进料器的称量和计量进料原理 启动预先设置的计量进料程序后,计量系统首先称量并存储称量锅皮重,然后依次控制各种配料如牛奶、砂
[工业控制]
基于8031<font color='red'>单片机</font>的自动计量进料系统
51单片机在片设备与中断(1)
并行端口要点 MCS-51单片机内部有4个8位的并行I/O口P0、P1、P2、P3。其中P3口、P2口、P1口为准双向口,P0口为双向的三态数据线口。各端口均由端口锁存器、输出驱动器、输入缓冲器等构成。各端口除可进行字节的输入/输出外,每个位口线还可单独用作输入/输出,实际应用非常方便。 对并行I/O口的 读 修改 写 类指令(例如 CPL P0.0、ANL P1,#0FH等)实际是读出对应的端口锁存器的内容,执行修改后再写回到端口锁存器中。之所以是 读锁存器 而不是 读引脚 ,是为了避免因引脚外部电路的原因而使引脚的状态发生改变而造成误读。 P0口是一个三态双向I/O口,在需要进行外部ROM、RAM等扩展时,采用分时复用的
[单片机]
MSP430单片机型号资料
MSP430单片机的发展 德州仪器1996年到2000年初,先后推出了31x、32x、33x等几个系列,这些系列具有LCD驱动模块,对提高系统的集成度较有利。每一系列有ROM 型(C)、OTP 型(P)、和 EPROM 型(E)等芯片。EPROM 型的价格昂贵,运行环境温度范围窄,主要用于样机开发。这也表明了这几个系列的开发模式,即:用户可以用 EPROM 型开发样机;用OTP型进行小批量生产;而ROM型适应大批量生产的产品。 2000 年推出了11x/11x1系列。这个系列采用20脚封装,内存容量、片上功能和 I/O 引脚数比较少,但是价格比较低廉。 这个时期的MPS430已经显露出了它的特低功耗等的一系列技术特点,
[单片机]
msp430单片机程序升级的方法有哪些
最近在搞430的FLASH的自定义法(利用串口)程序烧写,烧写完成后断电复位,reset按键就可以运行新的程序。但是和学长交流了一下,这种方法不够好,希望有一种软复位的方式。于是百度了一下,都是些对看门狗进行写入特殊值使得430的cpu复位。反正个人是没有采用。 因为在搞程序的烧写下载,所以看了一下430的BSL。看到里面有一段话,关于从C代码中启动BSL的方法。如下: 从一个外部应用中启动BSL 将程序计数器设定到内存为位置0x1000 来启动BSL。堆栈一直被复位,而RAM 被清空。应该注意的是,GIE 位未被禁用,所以如果不需要中断的话,这一步应该通过调用应用来完成,并且如果它们被使用的话,这一步应该从“返回BSL”返
[单片机]
msp430<font color='red'>单片机</font><font color='red'>程序</font>升级的方法有哪些
51单片机软件三重监视抗干扰技术
应用于工业过程控制和智能化仪器仪表的单片机,由于现场条件往往十分恶劣,不可避免地会受到各种各样的电磁干扰。当串入系统的干扰作用于单片机内部的CPU部件时,后果更加严重,将导致系统失控。最典型的失控故障是破坏程序计数器PC的状态,导致程序在地址空间内“乱飞”,或者陷入“死循环”。因此,尽可能早地发现程序失控,并采取相应的补救措施,是单片机应用系统抗干扰设计的重要内容。 使程序从“乱飞”状态纳入正轨的方法称为程序拦截技术,包括指令冗余技术、软件陷阱技术等。使程序摆脱“死循环”,通常多采用硬件电路实现的监视技术,又称“看门狗”技术(Watchdog)。常见的硬件“看门狗”电路有单稳态型“看门狗”电路、计数器型“看门狗”电路、微处理器监
[单片机]
MCS-51单片机的堆栈怎样设置的?
程序设计时,往往需要一个后进先了的RAM区,以保存CPU的现场。这种后进先出的缓冲区,就称为堆栈。 MCS-51单片机的堆栈原则上设在内部RAM的任意区域内 。但是,一般设在31H~7FH的范围之间,栈顶的位置由栈指针SP指出。
[单片机]
7课:单片机的特殊功能寄存器
通过前面的学习,我们已知单片机的内部有ROM、有RAM、有并行I/O口,那么,除了这些东西之外,单片机内部究竟还有些什么,这些个零碎的东西怎么连在一起的,让我们来对单片机内部的寄存器作一个完整的功能分析吧! 下图中我们能看出,在51单片机内部有一个CPU用来运算、控制,有四个并行I/O口,分别是P0、P1、P2、P3,有ROM,用来存放程序,有RAM,用来存放中间结果,此外还有定时/计数器,串行I/O口,中断系统,以及一个内部的时钟电路。在一个51单片机的内部包含了这么多的东西。 对上面的图进行进一步的分析,我们已知,对并行I/O口的读写只要将数据送入到对应I/O口的锁存器就能了,那么对于定时/计数器,串行I/O口等怎么用
[单片机]
7课:<font color='red'>单片机</font>的特殊功能寄存器
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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