OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 19335|回复: 18

stm32堆空间和栈空间大小计算?Stack_Size 和 Heap_Size

[复制链接]

11

主题

60

帖子

0

精华

初级会员

Rank: 2

积分
128
金钱
128
注册时间
2015-10-9
在线时间
24 小时
发表于 2016-8-29 18:23:19 | 显示全部楼层 |阅读模式
20金钱
QQ截图20160829181915.jpg

裸机程序里面这两个值  在程序中我要怎么计算才能知道分配多少合适?

最佳答案

查看完整内容[请看2#楼]

1,Stack Size,一般小工程0X400足够,我们综合实验才设置0X1000就够用,所以默认无需设置太大。2,Heap Size,如果没有用到标准库的malloc,就是废物,纯属浪费内存,所以直接设置为0即可。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-8-29 18:23:20 | 显示全部楼层
1,Stack Size,一般小工程0X400足够,我们综合实验才设置0X1000就够用,所以默认无需设置太大。2,Heap Size,如果没有用到标准库的malloc,就是废物,纯属浪费内存,所以直接设置为0即可。
回复

使用道具 举报

54

主题

372

帖子

0

精华

高级会员

Rank: 4

积分
980
金钱
980
注册时间
2016-6-15
在线时间
474 小时
发表于 2016-8-29 20:01:53 | 显示全部楼层
Stack_Size的值根据你程序中局部变量最大尺寸计算,Heap_Size的值如果程序中没有用到动态内存malloc就默认不用管。
回复

使用道具 举报

6

主题

1097

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3571
金钱
3571
注册时间
2014-12-2
在线时间
365 小时
发表于 2016-8-29 20:06:41 | 显示全部楼层
我习惯栈大小原则上四分之一RAM,堆没用过(对动态分配内存不太感冒)。栈不能弄小了,否则可能在运行中的某一时刻发生莫名其妙的问题
回复

使用道具 举报

6

主题

1097

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3571
金钱
3571
注册时间
2014-12-2
在线时间
365 小时
发表于 2016-8-29 20:07:00 | 显示全部楼层
shuaigew88 发表于 2016-8-29 20:01
Stack_Size的值根据你程序中局部变量最大尺寸计算,Heap_Size的值如果程序中没有用到动态内存malloc就默认 ...

函数嵌套也要消耗栈
坚决不用寄存器,拒绝重复造轮子。
回复

使用道具 举报

54

主题

372

帖子

0

精华

高级会员

Rank: 4

积分
980
金钱
980
注册时间
2016-6-15
在线时间
474 小时
发表于 2016-8-29 20:12:40 | 显示全部楼层
本帖最后由 shuaigew88 于 2016-8-29 20:15 编辑
xkwy 发表于 2016-8-29 20:07
函数嵌套也要消耗栈

一般如果没有局部大数组堆和栈的值都不用修改,如果局部经常定义大数组可以根据最大数组尺寸计算,如UINT8 buf[0x10000]; 那么Stack_Size  EQU 0x00000400 +0x10000就ok了,
默认0x00000400  //1024字节已经很多了,很多单片机的RAM都很小,51=256bytes,STM8,AVR =1K ?不都运行的很健康。
回复

使用道具 举报

6

主题

1097

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3571
金钱
3571
注册时间
2014-12-2
在线时间
365 小时
发表于 2016-8-29 21:05:18 | 显示全部楼层
shuaigew88 发表于 2016-8-29 20:12
一般如果没有局部大数组堆和栈的值都不用修改,如果局部经常定义大数组可以根据最大数组尺寸计算,如UINT ...

这么小的RAM就另当别论了,我用的单片机一般来说都16k起步了,闲着也是闲着,不如拿来做堆栈,反正又没什么坏处是不是?
坚决不用寄存器,拒绝重复造轮子。
回复

使用道具 举报

54

主题

372

帖子

0

精华

高级会员

Rank: 4

积分
980
金钱
980
注册时间
2016-6-15
在线时间
474 小时
发表于 2016-8-30 08:31:10 | 显示全部楼层
xkwy 发表于 2016-8-29 21:05
这么小的RAM就另当别论了,我用的单片机一般来说都16k起步了,闲着也是闲着,不如拿来做堆栈,反正又没什 ...

坏处当然是没有,如果有空闲的RAM放在堆栈那里也没什么。
回复

使用道具 举报

11

主题

60

帖子

0

精华

初级会员

Rank: 2

积分
128
金钱
128
注册时间
2015-10-9
在线时间
24 小时
 楼主| 发表于 2016-8-31 15:09:15 | 显示全部楼层
shuaigew88 发表于 2016-8-29 20:12
一般如果没有局部大数组堆和栈的值都不用修改,如果局部经常定义大数组可以根据最大数组尺寸计算,如UINT ...

我是把所有的局部大数组都加上?    全局变量不需要去管是吗?
回复

使用道具 举报

54

主题

372

帖子

0

精华

高级会员

Rank: 4

积分
980
金钱
980
注册时间
2016-6-15
在线时间
474 小时
发表于 2016-8-31 15:13:31 | 显示全部楼层
本帖最后由 shuaigew88 于 2016-8-31 15:14 编辑
xiaoyehack 发表于 2016-8-31 15:09
我是把所有的局部大数组都加上?    全局变量不需要去管是吗?

不同时运行的局部变量就不用累加,全局变量不用管。
回复

使用道具 举报

11

主题

60

帖子

0

精华

初级会员

Rank: 2

积分
128
金钱
128
注册时间
2015-10-9
在线时间
24 小时
 楼主| 发表于 2016-9-8 18:13:45 | 显示全部楼层
好的   谢谢原子哥   
回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-10-18 21:57:08 | 显示全部楼层
标记下
回复

使用道具 举报

9

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
103
金钱
103
注册时间
2013-5-4
在线时间
9 小时
发表于 2016-10-25 17:24:30 | 显示全部楼层
但是用了malloc 也没有设置Heap Size会怎么样呢?   好像也没事啊!!??
回复

使用道具 举报

62

主题

903

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3566
金钱
3566
注册时间
2016-1-8
在线时间
544 小时
发表于 2017-4-26 15:56:40 | 显示全部楼层
Heap Size 大小设置成0XFFF0FFFF都不会出错,512K的f103
回复

使用道具 举报

11

主题

60

帖子

0

精华

初级会员

Rank: 2

积分
128
金钱
128
注册时间
2015-10-9
在线时间
24 小时
 楼主| 发表于 2017-5-19 17:59:50 | 显示全部楼层
Sun_Fly 发表于 2017-4-26 15:56
Heap Size 大小设置成0XFFF0FFFF都不会出错,512K的f103

128 k
回复

使用道具 举报

5

主题

27

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
214
金钱
214
注册时间
2017-6-26
在线时间
49 小时
发表于 2017-7-20 15:52:29 | 显示全部楼层
Sun_Fly 发表于 2017-4-26 15:56
Heap Size 大小设置成0XFFF0FFFF都不会出错,512K的f103

别瞎搞,我heap设了14000,程序挂了
回复

使用道具 举报

1

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
172
金钱
172
注册时间
2018-4-20
在线时间
24 小时
发表于 2018-12-14 11:49:23 | 显示全部楼层
正点原子 发表于 2016-8-29 18:23
1,Stack Size,一般小工程0X400足够,我们综合实验才设置0X1000就够用,所以默认无需设置太大。2,Heap Si ...

请问下,我理解是
1-没有使用malloc的情况下,没有使用到heap,然后在startup.s文件中初始化的heap都被删除掉,在map文件中只显示stack的大小,没有heap。
2-但是我在一个工程中,发现其占用的ram很大,heap也没有删除,在map文件中STACK和HEAP都存在

    0x200008b0        -       0x00000200   Zero   RW          509    HEAP                startup_stm32f10x_hd.o
    0x20000ab0        -       0x00000400   Zero   RW          508    STACK               startup_stm32f10x_hd.o


请问,这是什么原因造成的呢??
回复

使用道具 举报

1

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
172
金钱
172
注册时间
2018-4-20
在线时间
24 小时
发表于 2018-12-14 12:04:52 | 显示全部楼层
正点原子 发表于 2016-8-29 18:23
1,Stack Size,一般小工程0X400足够,我们综合实验才设置0X1000就够用,所以默认无需设置太大。2,Heap Si ...

对了,补充下问题描述,那个工程是IAP工程......
那HEAP不释放,是和“USART_RX_BUF[USART_REC_LEN] __attribute__ ((at(0X20001000)))”这有关吗?

如何理解?谢谢。
回复

使用道具 举报

4

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2018-9-10
在线时间
16 小时
发表于 2019-3-26 10:48:27 | 显示全部楼层
你好,内存分配给堆栈后剩余的空间如何使用?malloc只能申请heap定义的内存吗?
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-24 04:03

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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