FLY 发表于 2019-12-8 22:17:11

stack、heap大小问题

1、请问下就407为例他的stack、heap最大可设置大多空间?
2、不同的芯片的stack、heap的最大空间是有什么决定的?
3、入门的视频里看到将堆设置为0x00000200也就是512Byte吧,这样的话如果我定义一个1024Byte的全局的数组,那么不就超出堆空间的大小了么?




eric2013 发表于 2019-12-9 08:42:57

继续学习map和htm视频教程,有讲解到。

caicaptain2 发表于 2019-12-9 10:28:03

堆heap只有在使用malloc函数的时候才会用到。 你自己定义的全局变量不适用堆和栈;局部变量会使用栈。 所以,一般的栈需要大一点,堆可以小一些。

xiaokang2009 发表于 2019-12-16 11:38:16

堆空间和全局数组空间是并列的,全局数组并不会占用堆空间。
一些第三方软件中有大量的动态空间分配,我曾经将整个407的64K ccram作为堆空间来移植代码,很好用。

wdliming 发表于 2019-12-17 14:59:21

全局数组不在堆的

FLY 发表于 2020-2-15 12:05:22

eric2013 发表于 2019-12-9 08:42
继续学习map和htm视频教程,有讲解到。

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

FLY 发表于 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 ) )//系统所有总的堆大小

他们有啥区别?

eric2013 发表于 2020-2-15 12:49:33

FLY 发表于 2020-2-15 12:05
视频看了 但是没见到有说stack、heap最大可设置多大空间,及stack、heap的空间由谁来决定的?

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

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

eric2013 发表于 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定义的大小。

FLY 发表于 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 ?         

FLY 发表于 2020-2-28 07:12:05

FLY 发表于 2020-2-26 18:10
startup_stm32h743xx.s中的

Stack_Size      EQU   0x00000400


这个问题呢? 请教下?

eric2013 发表于 2020-2-28 09:56:08

FLY 发表于 2020-2-28 07:12
这个问题呢? 请教下?

RAM.

wdliming 发表于 2020-2-28 21:09:00

eric2013 发表于 2020-2-15 12:54
系统栈和任务栈。

系统栈:


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

FLY 发表于 2020-2-29 11:50:26

eric2013 发表于 2020-2-28 09:56
RAM.

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

eric2013 发表于 2020-2-29 13:48:53

FLY 发表于 2020-2-29 11:50
那为啥我把这个改成110K, 即 #define configTOTAL_HEAP_SIZE    ( ( size_t ) ( 110* 1024 ) ),就报错 ...

超了。

18776743354 发表于 2023-6-29 21:09:51

eric2013 发表于 2020-2-29 13:48
超了。

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

CofMilk 发表于 2023-6-30 08:57:30

18776743354 发表于 2023-6-29 21:09
这个是超过芯片的RAM吗?那按理说stack最大可以设置成和芯片的RAM一样?

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

fman0562 发表于 2023-8-10 15:59:23

FreeRTOS中的堆栈,并没有占用系统启动文件中的堆栈空间大小。两者在空间分配上互不影响,需要单独设置。并且FreeRTOS有自己的内存申请函数pvPortMalloc()以及一系列的内存管理函数。

fman0562 发表于 2023-8-10 16:01:34

FreeRTOS中的堆栈,并没有占用系统启动文件中的堆栈空间大小。两者在空间分配上互不影响,需要单独设置。并且FreeRTOS有自己的内存申请函数pvPortMalloc()以及一系列的内存管理函数。stm32407 常规内存128K 看着分配就行。

2360985396 发表于 2023-8-15 14:22:39

系统的
栈+堆+全局变量区 = ram
ram大小总和不变 建议多查查手册

飒戾 发表于 2024-4-6 02:10:50

fman0562 发表于 2023-8-10 16:01
FreeRTOS中的堆栈,并没有占用系统启动文件中的堆栈空间大小。两者在空间分配上互不影响,需要单独设置。并 ...

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

eric2013 发表于 2024-4-6 08:01:10

飒戾 发表于 2024-4-6 02:10
我的stm32h743芯片SRAM有1060KB,结果config_TOTAL_HEAP_SIZE设置为300k就不行了,调试也会卡在启动文件 ...

这个应该是没有移植好,FreeRTOS启动前什么都不要做,特别是各种外设初始化。main函数里面仅仅是创建第1个启动任务,看看还有问题没,还有问题就是没移植好。
页: [1]
查看完整版本: stack、heap大小问题