赞
踩
; <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
栈的作用是用于局部变量、函数形参、函数调用时的现场保护和返回地址,以及进入中断函数前和中断嵌套等的开销,栈的大小不能超过内部SRAM 的大小。如果编写的程序比较大,定义的局部变量很多,那么就需要修改栈的大小。如果某一天,你写的程序出现了莫名奇怪的错误,并进入了硬fault 的时候,这时你就要考虑下是不是栈不够大,溢出了。
; <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
堆主要用来动态内存的分配,像malloc() 函数申请的内存就在堆上面。这个在STM32 里面用的比较少。
所以,在跑裸机程序时,如果没有用到标准库的malloc,就是废物,纯属浪费内存,直接设置为0都没事,但是如果用到了,一定要谨慎,别忘了释放内存。
在跑RTOS时,保持默认即可。
TOTAL_HEAP_SIZE:内存分配时需要的堆空间总量,我一般直接设置为2k。如果分配(内存)不够大,可能引起FreeRTOS运行异常。主要用在哪?看第四条
而这个任务栈的空间来源就是第三条的TOTAL_HEAP_SIZE;TOTAL_HEAP_SIZE除了用于分配任务栈, 信号量、 消息队列、 事件标志组、 互斥信号量、 软件定时器组等需要的 RAM 空间都来自于TOTAL_HEAP_SIZE。
注意:任务执行的过程中发送中断的话,有 8 个通用寄存器和 18 个浮点寄存器是自动入栈的,这个栈是任务栈,
进入中断以后其余通用寄存器和浮点寄存器入栈以及发生中断嵌套都是用的上面第一条启动文件里面的栈大小。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。