硬汉嵌入式论坛

 找回密码
 立即注册
查看: 11833|回复: 7
收起左侧

[有问必答] 启动文件里的Stack_Size和Heap_Size是干什么用的?大小是根据什么定的?

[复制链接]

45

主题

70

回帖

205

积分

高级会员

积分
205
发表于 2020-12-24 16:11:14 | 显示全部楼层 |阅读模式
我只知道是栈和堆,但是不知道这和我们平时写c程序有什么关系啊?它的大小由什么定义呢?是专为启动文件设置的堆栈吗,进入C程序后就销了??
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2020-12-25 09:50:07 | 显示全部楼层
栈(stack)空间,用于局部变量,函数调时现场保护和返回地址,函数的形参等。
堆(heap)空间,主要用于动态内存分配,也就是说用 malloc,calloc, realloc 等函数分配的变量空间
有时间的话,这两个章节学习下,有详细描述:
https://forum.anfulai.cn/forum.p ... &extra=page%3D1

1.png
回复

使用道具 举报

45

主题

70

回帖

205

积分

高级会员

积分
205
 楼主| 发表于 2020-12-25 15:07:57 | 显示全部楼层
eric2013 发表于 2020-12-25 09:50
栈(stack)空间,用于局部变量,函数调时现场保护和返回地址,函数的形参等。
堆(heap)空间,主要用于动态 ...

我是看了这几节的,没找到答案。
我能理解堆栈的用处。但是还有点搞不清除启动文件里的堆栈大小的设置。
Stack_Size      EQU     0x00000400
Heap_Size       EQU     0x00000200

如果裸机情况下,函数调时现场保护和返回地址,函数的形参等能用Stack大小,不能超过Stack_Size吗?那如果是加上rtos呢,应为在初始化线程的时候,需要设置栈大小。

还有堆,如果我自己申请了个比Heap_Size大的数组,作为堆。那启动文件里的Heap_Size又有什么意义呢?
回复

使用道具 举报

45

主题

70

回帖

205

积分

高级会员

积分
205
 楼主| 发表于 2020-12-25 15:27:47 | 显示全部楼层
eric2013 发表于 2020-12-25 09:50
栈(stack)空间,用于局部变量,函数调时现场保护和返回地址,函数的形参等。
堆(heap)空间,主要用于动态 ...

启动文件设定的大小,有什么决定呢?这里设定大小后,是在RAM里占用了多大的空间吗?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2020-12-26 09:47:01 | 显示全部楼层
chinashaoshu 发表于 2020-12-25 15:07
我是看了这几节的,没找到答案。
我能理解堆栈的用处。但是还有点搞不清除启动文件里的堆栈大小的设置。 ...

Q: 如果裸机情况下,函数调时现场保护和返回地址,函数的形参等能用Stack大小,不能超过Stack_Size吗?
A : 对

Q:那如果是加上rtos呢,应为在初始化线程的时候,需要设置栈大小
A :RTOS有自己的任务栈,不再使用这里,仅RTOS启动前和中断以及中断嵌套才使用这里,这里的栈被称为系统栈,而uCOS又略有不同,uCOS把系统栈也接管了。

Q:还有堆,如果我自己申请了个比Heap_Size大的数组,作为堆
A ;申请失败
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2020-12-26 09:48:06 | 显示全部楼层
chinashaoshu 发表于 2020-12-25 15:27
启动文件设定的大小,有什么决定呢?这里设定大小后,是在RAM里占用了多大的空间吗?

二楼教程第10章,重点看如何获取自己工程最大栈需求。
回复

使用道具 举报

45

主题

70

回帖

205

积分

高级会员

积分
205
 楼主| 发表于 2020-12-26 16:06:12 | 显示全部楼层
eric2013 发表于 2020-12-26 09:47
Q: 如果裸机情况下,函数调时现场保护和返回地址,函数的形参等能用Stack大小,不能超过Stack_Size吗?
...

1 最后一个问题,不能申请一个size比Heap_Size的数组??我试了试,可以编译通过啊。
2 还有rtt这种初始化堆的方法,以RAM执行区的未使用的区域的起始地址,作为堆。这样就避开了Heap_Size?

#define STM32_SRAM_BEGIN    (&Image$$RW_IRAM1$$ZI$$Limit)

#define STM32_SRAM_SIZE        (128)
#define STM32_SRAM_END         (0x20000000 + STM32_SRAM_SIZE * 1024)

rt_system_heap_init((void*)STM32_SRAM_BEGIN, (void*)STM32_SRAM_END);
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2020-12-26 16:27:37 | 显示全部楼层
chinashaoshu 发表于 2020-12-26 16:06
1 最后一个问题,不能申请一个size比Heap_Size的数组??我试了试,可以编译通过啊。
2 还有rtt这种初始 ...

1、使用malloc的话,注意返回值是否为null,编译器不管这个。
2、这个与系统堆没有任何关系,这个仅仅是rtt接管了下RAM里面未使用的RAM区
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-16 13:52 , Processed in 0.043671 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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