一、前言
参考文档:《Libraries and Floating Point Support Guide》
二、堆栈分配机制
《Libraries and Floating Point Support Guide》文档中对堆栈描述如下:
堆栈模型有2种:
1、单内存区域模型(堆栈共用一片空间)
2、双内存区域模型(堆和栈都有独立空间)
双内存区域模型开启方法:
1、汇编语言使用语句:IMPORT __use_two_region_memory
2、c语言使用语句:#pragma import(__use_two_region_memory)
三、测试
1、使用STM32CubeMX
生成keil
工程(以STM32F103ZET6
芯片为例)
2、堆栈分配代码在启动文件(startup_stm32f103xe.s)
中,代码如下:
; Amount of memory (in bytes) allocated for Stack
; Tailor this value to your application needs
; <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
; <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
3、启动代码中设置堆栈内存模型
;*******************************************************************************
; User Stack and Heap initialization
;*******************************************************************************
IF :DEF:__MICROLIB
EXPORT __initial_sp
EXPORT __heap_base
EXPORT __heap_limit
ELSE
IMPORT __use_two_region_memory
EXPORT __user_initial_stackheap
__MICROLIB
含义:是否使用microlib
如果定义__MICROLIB
宏,堆栈使用单区域模型,如果没有定义,堆栈使用双区域模型。
4、keil
中microlib
选择方式如下
选中以后,keil
编译时使用microlib
。
5、不选中microlib
,编译后分析map
文件
6、选中microlib
,编译后分析map
文件