打印
[STM8]

STM8的C语言编程(2)-- 变量空间的分配

[复制链接]
634|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
vigous1|  楼主 | 2015-2-26 22:37 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
采用C这样的高级语言,其实可以不用关心变量在存储器空间中是如何具体分配的。但如果了解如何分配,对编程还是有好处的,尤其是在调试时。
例如下面的程序定义了全局变量数组buffer和一个局部变量i,在RAM中如何分配的呢?
/*MAIN.C file
*
*Copyright (c) 2002-2005 STMicroelectronics
*/
unsignedchar buffer[10];      // 定义全局变量
main()
{
   unsigned char i;           //定义局部变量   
   
   for(i=0;i<10;i++)
   {
       buffer = 0x55;
   }        
}
我们可以通过DEBUG中的反汇编窗口,看到如下的对应代码:
从这段代码中可以看到,全局变量buffer被分配到空间从地址0000H到0009H。而局部变量i则在堆栈空间中分配,通过PUSH A指令,将堆栈指针减1,腾出一个字节的空间,而SP+1指向的空间就是分配给局部变量使用的空间。
由此可以得出初步的结论,对于全局变量,内存分配是从低地址0000H开始向上分配的。而局部变量则是在堆栈空间中分配。
另外从上一篇**中,可以知道堆栈指针初始化时为0FFFH。而根据PUSH指令的定义,当压栈后堆栈指针减1。因此堆栈是从上往下使用的。
因此根据内存分配和堆栈使用规则,我们在程序设计时,不能定义过多的变量,免得没有空间给堆栈使用。换句话说,当定义变量时,一定要考虑到堆栈空间,尤其是那些复杂的系统,程序调用层数多,这样就会占用大量的堆栈空间。
总之,在单片机的程序设计时,由于RAM空间非常有限,要充分考虑到全局变量、局部变量、程序调用层数和中断服务调用对空间的占用。

沙发
小浣熊| | 2015-2-28 23:51 | 只看该作者
顶一个!!!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

88

主题

427

帖子

15

粉丝