STM32的地址空间映射:
首先STM32的堆栈是存放在片上静态SRAM中的,地址分配可以见Keil的编译map文件:
HEAP 0x200106f8 Section 512 startup_stm32f2xx.o(HEAP)
STACK 0x200108f8 Section 1024 startup_stm32f2xx.o(STACK)
__heap_base 0x200106f8 Data 0 startup_stm32f2xx.o(HEAP)
__heap_limit 0x200108f8 Data 0 startup_stm32f2xx.o(HEAP)
__initial_sp 0x20010cf8 Data 0 startup_stm32f2xx.o(STACK)
上面节选中, __heap_base 是堆的基地址,__initial_sp 是栈指针 。示意图如下:
堆和栈的大小在启动文件startup_stm32f2xx.s中设置:
Stack_Size EQU 0x00000400
AREA STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size
__initial_sp
; Heap Configuration
; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
Heap_Size EQU 0x00000200
AREA HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
注意:
堆和栈,一般堆是由低地址往上增长,栈是由往下减少。都是连续的,C语言不提供内存保护机制类似的功能,如果一直堆一直增长,栈一直申请,然后就会导致栈溢出,程序崩溃。
————————————————
版权声明:本文为CSDN博主「qlexcel」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qlexcel/article/details/78886157
来源:oschina
链接:https://my.oschina.net/u/3874841/blog/3171004