这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » AVR 请教AVR的软堆栈设置?!

共4条 1/1 1 跳转至

AVR 请教AVR的软堆栈设置?!

院士
2006-09-17 18:14:16     打赏
AVR 请教AVR的软堆栈设置?!



关键词: 请教     堆栈     设置    

院士
2006-12-22 22:43:00     打赏
2楼
问     在程序开始运行时先要给软堆栈SP赋值,堆栈数据位于SP与0X60之间(MEGE128)而且大小是不确定的,使用片内RAM时要注意存储的数据不能进入堆栈区。那么请教一下从RAM顶部到SP之间的这部分RAM存储什么数据?
    有些资料里称其为硬堆栈,并没说清存的是什么数据。 1: 我一般推到025F 2: 堆栈的范围有多大,是否越大越好 3: AVR是下推堆栈,你不用完内存空间也就废了。 4: SP=0X025F?   那0X025F~0X1100废了? 5: 我是用8515举例,其他的都最好推到顶。 6: 你知道AVR中硬堆栈的含义吗? 7: 堆栈你可以直接设置SP到RAM的顶部 8: 请教AVR的软堆栈设置?!在"iom128v.h"好象有设置堆栈吗???? 9: SP是硬堆栈 10: 说明(128为例)硬堆栈:
即SP,通常汇编中讲的所谓堆栈(用于PC指针等压栈),一般设置从片内RAM的顶部0X10FF开始向下生长,基本上64个足够足够了
软件堆栈:
C编译器自动分配的堆栈,在硬堆栈和全局变量之间的空间,也是向下生长,一般用于局部变量。比如一个子程序定义一个局部变量A[256],那么此空间即在软堆栈中,假设当前软堆栈用到0X800,分派A[256]后,软堆栈用到0X700,A[0]地址为0X700,A[1]地址为0X701 ……,当然如果局部变量较少,用寄存器就可以了,用不着软堆栈了。此子程序退出后软堆栈恢复到0X800。
另:你的C程序编译后,生成的汇编文件中,R28:R29就是软堆栈指针

一般硬堆栈只要在编译选项中设置,软堆栈编译器会自动设置。你只要看看*.mp文件是否合理就可以了。 11: 明白了,多谢! 12: “堆”和“栈”是独立的概念平常说的“堆栈”实际上是两个概念:“堆”和“栈”。在英文中,堆是heap,栈是stack,不知道什么时候,什么原因,在中文里,这两个不同的概念硬是被搞在一起了,所以,围绕这个混合词所发生的误解和争执这几年就没有断过。

“栈”一般是由硬件(CPU)实现的,CPU用栈来保存调用子程序(函数)时的返回地址,高级语言有时也用它作为局部变量的存储空间。

“堆”是个实实在在的软件概念,使用与否完全由编程者“显示地(explicitly)”决定,如malloc。

程序经过编译连接生成执行程序后,堆和栈的起始地址就已经确定了(具体说,是通过“连接程序”),在一个具有反向增长的栈的CPU上,数据空间可表示如下:

低    ->|-----------------|
      | 全局量(所有已初始化量 .data, |
      | 未初始化量 .bss )       |
  堆起始->|-----------------|
      |    堆向高地址增长      |
      |                 |
      |                 |
      |     自由空间        |
      |                 |
      |                 |
      |    栈向低地址增长      |
高 栈起始->|-----------------|

在内存中,“堆”和“栈”共用全部的自由空间,只不过各自的起始地址和增长方向不同,它们之间并没有一个固定的界限,如果在运行时,“堆”和“栈”增长到发生了相互覆盖时,称为“栈堆冲突”,系统肯定垮台。由于开销方面的原因,各种编译在实现中都没有考虑解决这个问题,只有靠设计者自己解决,比如增加内存等。

高工
2023-01-30 22:35:34     打赏
3楼

感谢分享


专家
2023-01-30 22:38:42     打赏
4楼

感谢分享


共4条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]