搜索
bottom↓
回复: 14

ARM的启动文件中堆栈的一些问题,求解

[复制链接]

出0入0汤圆

发表于 2013-10-29 16:43:30 | 显示全部楼层 |阅读模式
Stack_Size      EQU     0x00000200

                AREA    STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem       SPACE   Stack_Size
__initial_sp

; <h> Heap Configuration
;   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>

Heap_Size       EQU     0x00008000

                AREA    HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem        SPACE   Heap_Size
__heap_limit

在所有的ARM启动文件中都会有这一段,这里的堆栈的含义是什么呢?
1.预分配的堆栈的大小吗?所有程序的堆栈都从这里申请吗?
2.在程序执行的过程中可以重新申请的其它的堆栈区?
3.如果程序中使用的栈大小超过了启动文件中定义的0x00000200或堆大小超过了 0x00008000,是不是程序就崩掉了?

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2013-10-29 16:46:33 | 显示全部楼层
栈的溢出肯定程序就飞了。堆的使用是通过malloc来获取的,如果空间不够,则返回失败,不会导致崩溃。

出0入0汤圆

 楼主| 发表于 2013-10-29 16:51:58 | 显示全部楼层
lcofjp 发表于 2013-10-29 16:46
栈的溢出肯定程序就飞了。堆的使用是通过malloc来获取的,如果空间不够,则返回失败,不会导致崩溃。 ...

那是不是程序中所有正在运行函数的栈的总和不能超过启动文件中预定义的Stack_Size (0x00000200)?

出0入0汤圆

发表于 2013-10-29 17:16:18 | 显示全部楼层
wangxiaofei6485 发表于 2013-10-29 16:51
那是不是程序中所有正在运行函数的栈的总和不能超过启动文件中预定义的Stack_Size (0x00000200)? ...

是的,不过这个值是可以随便调整的。

出0入0汤圆

发表于 2013-10-30 00:19:24 | 显示全部楼层
堆跟栈是两个不同的东西- -

出0入0汤圆

发表于 2013-10-30 08:41:35 | 显示全部楼层
1.预分配的堆栈的大小吗?所有程序的堆栈都从这里申请吗?
不是,这里只是把对应的地址段的内存声明为“堆栈”,堆栈的使用在于函数的“增长”。

2.在程序执行的过程中可以重新申请的其它的堆栈区?
可以,操作系统就是这么做的,手动初始化一块内存,并且将该内存的最高地址赋给SP,这是你的“栈”。

3.如果程序中使用的栈大小超过了启动文件中定义的0x00000200或堆大小超过了 0x00008000,是不是程序就崩掉了?
不会,堆栈满了会溢出,一般“栈”的起始都是在RAM的最高地址,向下生长,“栈”溢出以后,依然正常运行,只是会覆盖“栈”以外的内存空间,而这些内存空间是未知的,在函数返回以后会照成何种影响也是未知的。

出0入0汤圆

发表于 2013-11-5 15:03:41 | 显示全部楼层
堆栈向上生长还是向下生长是谁决定的?
头像被屏蔽

出0入0汤圆

发表于 2013-11-12 18:18:04 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

发表于 2014-2-11 15:37:39 | 显示全部楼层
启动文件,纠结!

出0入0汤圆

发表于 2014-2-14 09:15:36 | 显示全部楼层
我也想问一句:堆是需要使用者自己申请的,由自己管理自己释放;而栈是由系统管理的,
堆用于保存临时变量;栈用于保存程序?
不知道我上面的理解是不是正确的,请指导,谢谢!

出0入0汤圆

 楼主| 发表于 2014-3-3 21:19:10 | 显示全部楼层
sinc_mark 发表于 2014-2-14 09:15
我也想问一句:堆是需要使用者自己申请的,由自己管理自己释放;而栈是由系统管理的,
堆用于保存临时变量 ...

栈是用来保存寄存器变量,函数参数等,如果你还不懂的话,可以看一下操作系统的移植,里面会有栈的初始化过程,看看入栈的都有哪些参数,就知道栈的作用了

出0入0汤圆

 楼主| 发表于 2014-3-3 21:23:34 | 显示全部楼层
sinc_mark 发表于 2014-2-14 09:15
我也想问一句:堆是需要使用者自己申请的,由自己管理自己释放;而栈是由系统管理的,
堆用于保存临时变量 ...

UCOS ,FREERTOS都有这段程序,这个是freertos的

portSTACK_TYPE *pxPortInitialiseStack( portSTACK_TYPE *pxTopOfStack, pdTASK_CODE pxCode, void *pvParameters )
{
        *pxTopOfStack = portINITIAL_XPSR;  /* 程序状态寄存器*/
pxTopOfStack--;
*pxTopOfStack = ( portSTACK_TYPE ) pxCode;  /* 任务的入口点*/
pxTopOfStack--;
*pxTopOfStack = 0;  /* LR */
pxTopOfStack -= 5;  /* R12, R3, R2 and R1. */
*pxTopOfStack = ( portSTACK_TYPE ) pvParameters;  /* 任务的参数*/
pxTopOfStack -= 8;  /* R11, R10, R9, R8, R7, R6, R5 and R4. */
return pxTopOfStack;
}

出0入0汤圆

发表于 2014-4-16 19:20:13 来自手机 | 显示全部楼层
看不懂,谢了

出0入0汤圆

发表于 2014-5-18 21:13:16 | 显示全部楼层
没看清楚  等待清新的解答

出0入0汤圆

发表于 2014-5-19 13:42:00 | 显示全部楼层
这个只是用户模式下面的堆栈设置,ARM每个模式都有自己的堆栈寄存器,中断模式下一般堆栈设置在0-8K,用户模式下设置在DRAM区,STARTUP文件里面需要对STACK寄存器赋值,详情可以查看ATPCS文档,对汇编和ARM编程有帮助
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-25 22:11

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表