当前位置:   article > 正文

stm32堆栈详解_total_heap_size

total_heap_size

一、Stack—栈

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

Stack_Size		EQU     0x400

                AREA    STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem       SPACE   Stack_Size
__initial_sp
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

​ 栈的作用是用于局部变量、函数形参、函数调用时的现场保护和返回地址,以及进入中断函数前和中断嵌套等的开销,栈的大小不能超过内部SRAM 的大小。如果编写的程序比较大,定义的局部变量很多,那么就需要修改栈的大小。如果某一天,你写的程序出现了莫名奇怪的错误,并进入了硬fault 的时候,这时你就要考虑下是不是栈不够大,溢出了

二、Heap 堆

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

Heap_Size      EQU     0x200

                AREA    HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem        SPACE   Heap_Size
__heap_limit
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

堆主要用来动态内存的分配,像malloc() 函数申请的内存就在堆上面。这个在STM32 里面用的比较少。

所以,在跑裸机程序时,如果没有用到标准库的malloc,就是废物,纯属浪费内存,直接设置为0都没事,但是如果用到了,一定要谨慎,别忘了释放内存。

​ 在跑RTOS时,保持默认即可。

三、FreeRTOS Memory

TOTAL_HEAP_SIZE:内存分配时需要的堆空间总量,我一般直接设置为2k。如果分配(内存)不够大,可能引起FreeRTOS运行异常。主要用在哪?看第四条

四、任务栈

在这里插入图片描述

而这个任务栈的空间来源就是第三条的TOTAL_HEAP_SIZE;TOTAL_HEAP_SIZE除了用于分配任务栈, 信号量、 消息队列、 事件标志组、 互斥信号量、 软件定时器组等需要的 RAM 空间都来自于TOTAL_HEAP_SIZE。

注意:任务执行的过程中发送中断的话,有 8 个通用寄存器和 18 个浮点寄存器是自动入栈的,这个栈是任务栈,

进入中断以后其余通用寄存器和浮点寄存器入栈以及发生中断嵌套都是用的上面第一条启动文件里面的栈大小。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/75931
推荐阅读
相关标签
  

闽ICP备14008679号