硬汉嵌入式论坛

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

[有问必答] stack、heap大小问题

  [复制链接]

7

主题

21

回帖

42

积分

新手上路

积分
42
发表于 2019-12-8 22:17:11 | 显示全部楼层 |阅读模式
1、请问下就407为例他的stack、heap最大可设置大多空间?
2、不同的芯片的stack、heap的最大空间是有什么决定的?
3、入门的视频里看到将堆设置为0x00000200也就是512Byte吧,这样的话如果我定义一个1024Byte的全局的数组,那么不就超出堆空间的大小了么?

2.png

3.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106731
QQ
发表于 2019-12-9 08:42:57 | 显示全部楼层
继续学习map和htm视频教程,有讲解到。
回复

使用道具 举报

334

主题

2032

回帖

3039

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3039
发表于 2019-12-9 10:28:03 | 显示全部楼层
堆heap只有在使用malloc函数的时候才会用到。 你自己定义的全局变量不适用堆和栈;局部变量会使用栈。 所以,一般的栈需要大一点,堆可以小一些。
回复

使用道具 举报

2

主题

21

回帖

27

积分

新手上路

积分
27
发表于 2019-12-16 11:38:16 | 显示全部楼层
堆空间和全局数组空间是并列的,全局数组并不会占用堆空间。
一些第三方软件中有大量的动态空间分配,我曾经将整个407的64K ccram作为堆空间来移植代码,很好用。
回复

使用道具 举报

73

主题

1193

回帖

1412

积分

至尊会员

积分
1412
发表于 2019-12-17 14:59:21 | 显示全部楼层
全局数组不在堆的
回复

使用道具 举报

7

主题

21

回帖

42

积分

新手上路

积分
42
 楼主| 发表于 2020-2-15 12:05:22 | 显示全部楼层
eric2013 发表于 2019-12-9 08:42
继续学习map和htm视频教程,有讲解到。

视频看了 但是没见到有说stack、heap最大可设置多大空间,及stack、heap的空间由谁来决定的?
回复

使用道具 举报

7

主题

21

回帖

42

积分

新手上路

积分
42
 楼主| 发表于 2020-2-15 12:15:03 | 显示全部楼层
startup_stm32h743xx.s中的

Stack_Size      EQU     0x00000400
Heap_Size       EQU     0x00000200
即堆栈空间大小

和FreeRTOSConfig.h中
#define configMINIMAL_STACK_SIZE                ( ( unsigned short ) 130 )//单位字
#define configTOTAL_HEAP_SIZE                ( ( size_t ) ( 17 * 1024 ) )//系统所有总的堆大小

他们有啥区别?
qqq.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106731
QQ
发表于 2020-2-15 12:49:33 | 显示全部楼层
FLY 发表于 2020-2-15 12:05
视频看了 但是没见到有说stack、heap最大可设置多大空间,及stack、heap的空间由谁来决定的?

stack大小就是视频教程里面的htm视频部分,给出了最大栈需求(不含中断嵌套)。

heap大小主要是malloc,这个基本完全由你自己写的程序决定。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106731
QQ
发表于 2020-2-15 12:54:49 | 显示全部楼层
FLY 发表于 2020-2-15 12:15
startup_stm32h743xx.s中的

Stack_Size      EQU     0x00000400

系统栈和任务栈。

系统栈:

裸机情况下,凡是用到栈的地方都是用的Stack_Size      EQU     0x00000400
而到了FreeRTOS下,这个系统栈主要是手动入栈的寄存器,中断服务程序里面的局部变量,中断嵌入要用到。

任务栈:
就是 configTOTAL_HEAP_SIZE  定义的大小。
回复

使用道具 举报

7

主题

21

回帖

42

积分

新手上路

积分
42
 楼主| 发表于 2020-2-26 18:10:20 | 显示全部楼层
startup_stm32h743xx.s中的

Stack_Size      EQU     0x00000400
Heap_Size       EQU     0x00000200
即堆栈空间大小

和FreeRTOSConfig.h中
#define configMINIMAL_STACK_SIZE                ( ( unsigned short ) 130 )//单位字
#define configTOTAL_HEAP_SIZE                ( ( size_t ) ( 17 * 1024 ) )//系统所有总的堆大小

这个Stack_Size   、Heap_Size  、   configTOTAL_HEAP_SIZE    最大值应该是受内存限制的吧,那他们是受哪个内存的限制呢? RAM、ROM、FLASH ?         
回复

使用道具 举报

7

主题

21

回帖

42

积分

新手上路

积分
42
 楼主| 发表于 2020-2-28 07:12:05 | 显示全部楼层
FLY 发表于 2020-2-26 18:10
startup_stm32h743xx.s中的

Stack_Size      EQU     0x00000400

这个问题呢? 请教下?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106731
QQ
发表于 2020-2-28 09:56:08 | 显示全部楼层
FLY 发表于 2020-2-28 07:12
这个问题呢? 请教下?

RAM.
回复

使用道具 举报

73

主题

1193

回帖

1412

积分

至尊会员

积分
1412
发表于 2020-2-28 21:09:00 | 显示全部楼层
eric2013 发表于 2020-2-15 12:54
系统栈和任务栈。

系统栈:

不错, 学习到了,温故而知新
回复

使用道具 举报

7

主题

21

回帖

42

积分

新手上路

积分
42
 楼主| 发表于 2020-2-29 11:50:26 | 显示全部楼层

那为啥我把这个改成110K, 即 #define configTOTAL_HEAP_SIZE    ( ( size_t ) ( 110* 1024 ) ),就报错了,难道是我MPU这个内存管理这块弄得不对?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106731
QQ
发表于 2020-2-29 13:48:53 | 显示全部楼层
FLY 发表于 2020-2-29 11:50
那为啥我把这个改成110K, 即 #define configTOTAL_HEAP_SIZE    ( ( size_t ) ( 110* 1024 ) ),就报错 ...

超了。
回复

使用道具 举报

3

主题

10

回帖

19

积分

新手上路

积分
19
发表于 2023-6-29 21:09:51 | 显示全部楼层

这个是超过芯片的RAM吗?那按理说stack最大可以设置成和芯片的RAM一样?
回复

使用道具 举报

0

主题

9

回帖

9

积分

新手上路

积分
9
发表于 2023-6-30 08:57:30 | 显示全部楼层
18776743354 发表于 2023-6-29 21:09
这个是超过芯片的RAM吗?那按理说stack最大可以设置成和芯片的RAM一样?

我觉得你可以查查内存里都有什么分区,,或者程序里变量都是怎么占用内存的,,应该就能明白一点吧
回复

使用道具 举报

0

主题

4

回帖

4

积分

新手上路

积分
4
发表于 2023-8-10 15:59:23 | 显示全部楼层
FreeRTOS中的堆栈,并没有占用系统启动文件中的堆栈空间大小。两者在空间分配上互不影响,需要单独设置。并且FreeRTOS有自己的内存申请函数pvPortMalloc()以及一系列的内存管理函数。
回复

使用道具 举报

0

主题

4

回帖

4

积分

新手上路

积分
4
发表于 2023-8-10 16:01:34 | 显示全部楼层
FreeRTOS中的堆栈,并没有占用系统启动文件中的堆栈空间大小。两者在空间分配上互不影响,需要单独设置。并且FreeRTOS有自己的内存申请函数pvPortMalloc()以及一系列的内存管理函数。stm32407 常规内存128K 看着分配就行。
回复

使用道具 举报

22

主题

67

回帖

133

积分

初级会员

积分
133
发表于 2023-8-15 14:22:39 | 显示全部楼层
系统的
栈+堆+全局变量区 = ram
ram大小总和不变 建议多查查手册
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2024-4-6 02:10:50 来自手机 | 显示全部楼层
fman0562 发表于 2023-8-10 16:01
FreeRTOS中的堆栈,并没有占用系统启动文件中的堆栈空间大小。两者在空间分配上互不影响,需要单独设置。并 ...

我的stm32h743芯片SRAM有1060KB,结果config_TOTAL_HEAP_SIZE设置为300k就不行了,调试也会卡在启动文件里,有大佬知道为什么吗
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106731
QQ
发表于 2024-4-6 08:01:10 | 显示全部楼层
飒戾 发表于 2024-4-6 02:10
我的stm32h743芯片SRAM有1060KB,结果config_TOTAL_HEAP_SIZE设置为300k就不行了,调试也会卡在启动文件 ...

这个应该是没有移植好,FreeRTOS启动前什么都不要做,特别是各种外设初始化。main函数里面仅仅是创建第1个启动任务,看看还有问题没,还有问题就是没移植好。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-2 17:51 , Processed in 0.478239 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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