1.堆和栈大小
" [6 e2 ^. V; E: Q: Z; I9 e2 f2 x* g8 O1 Z4 L
定义大小在startup_stm32f2xx.s) @5 q" g% ?: i z* w- ~; i! [
- Stack_Size EQU 0x00000400
; v9 {4 P3 q ]
+ ]% d4 c/ V6 {" n; L- AREA STACK, NOINIT, READWRITE, ALIGN=3
" z; G2 W0 F7 U ^7 f0 ^4 m) ~ - Stack_Mem SPACE Stack_Size' I8 ~" F! j3 B1 L7 E$ |8 Y+ T4 x
- __initial_sp
2 r) U) H( i* U* z0 c
. W, c' i; \6 r* V, C& Q$ r- 8 C7 B2 Z& w, C9 [0 `. f% }
- ; <h> Heap Configuration/ |9 Z% i" H% Q9 i4 r5 w' U
- ; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>' i& o' | }* @ |
- ; </h>
. Z2 @* \/ i! d# R3 ~ S5 s - $ G9 u" {6 H: t5 a
- Heap_Size EQU 0x000002000 c }9 D; X: X/ I0 ?
+ p5 D/ Q( j) l% g- AREA HEAP, NOINIT, READWRITE, ALIGN=30 \ f! v% m Q) x$ R
- __heap_base
/ C5 r- r6 B5 M& v4 W
复制代码
7 v- v& J1 `4 G0 V( w2.堆和栈位置
- h( X2 M' E& X
9 y8 L3 v( s3 {# Z, @通过MAP文件可知(在目标工程栏-->>双击工程名,就会在keil文件显示框出现map文件)) b( @$ @3 j$ N; u' M% T8 x
- HEAP 0x200106f8 Section 512 startup_stm32f2xx.o(HEAP)
6 D3 Y( j2 {6 J! i - STACK 0x200108f8 Section 1024 startup_stm32f2xx.o(STACK)+ `7 g5 {2 n* u" y
- , J3 B' d' G e- x
- __heap_base 0x200106f8 Data 0 startup_stm32f2xx.o(HEAP)6 W; y# M& J A- [4 ]* l
- __heap_limit 0x200108f8 Data 0 startup_stm32f2xx.o(HEAP): d( z0 ?4 G2 M7 o7 S, C
- __initial_sp 0x20010cf8 Data 0 startup_stm32f2xx.o(STACK)
复制代码 显然 Cortex-m3资料可知:__initial_sp是堆栈指针,它就是FLASH的0x8000000地址前面4个字节(它根据堆栈大小,由编译器自动生成) A% L1 G9 @- k; D {' n5 a
4 I3 v( c) H0 H& D" `& c& }/ f显然堆和栈是相邻的。/ f7 ]+ E$ m0 t# t" o" g
/ v& Z t4 I5 C- v) ^) W
- _& N$ q+ L+ X1 _3 d, f) H w
1 ]# Z% w: ^* }5 O$ _+ f7 j
; T3 X+ \, ?( k1 i3 {# x/ _; F
: X) B8 x- c) ]7 R8 C3.堆和栈空间分配; H! F& V0 A- K4 b, \; r
, f; ~+ v' P' b+ p4 {! O栈:向低地址扩展
. ^/ N- C3 ?4 @& i. F8 l2 o2 n2 ]& {9 G- |: q
堆:向高地址扩展* ^% r# U& K4 H% x
6 z8 s3 ]* y# M; ?
显然如果依次定义变量) C _: j' p2 ^
- _1 Q! H, F! P @2 P$ H先定义的栈变量的内存地址比后定义的栈变量的内存地址要大
' |+ Z% y8 _" d8 \4 I; u2 R6 M% E5 T; G& F( t: J
先定义的堆变量的内存地址比后定义的堆变量的内存地址要小
, W# h2 d! D' l6 V E$ ?8 Z) _& ?7 K& u, @ a
4.堆和栈变量
, \& t' f- P8 F# p* Y L: j q; P) \- Y. ]7 b0 _
栈:临时变量,退出该作用域就会自动释放
2 j7 G# j* k/ b; o$ r0 a0 U' }. _* l3 Z- g/ s P0 i
堆:malloc变量,通过free函数释放
" }$ U! s5 q( x- t! p1 Q% q/ ?6 c! y1 H: F
* F3 o$ W; e: {- \4 ]* t
& n' p" W1 e& d( L另外:堆栈溢出,编译不会提示,需要注意% t7 h# a/ F' w J, ^& e2 [- }
0 k8 j, [& Y$ j* G8 ?& p3 Q
& z& `- F$ @4 l, r# Z' {# l |