1.堆和栈大小
! f4 V8 ?$ D B9 z& M X3 W2 ^
0 N$ ?: N4 q2 `, n* U! q 定义大小在startup_stm32f2xx.s0 L% N) Q8 P7 S0 @( H( v# c1 E4 k
- Stack_Size EQU 0x00000400
# r' {" k! y' _' L5 W w
1 h% }; Y7 p5 Y1 I- AREA STACK, NOINIT, READWRITE, ALIGN=3
' U" o$ b& f. p - Stack_Mem SPACE Stack_Size
' ^% x% Z+ W, w' z# W$ N - __initial_sp
! p$ T, G* @' V- J: h7 f; @* ] - % C& n; Z* d. \
o( A. x+ ~. f$ u- F- ; <h> Heap Configuration9 f$ h8 e& P. ^
- ; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>2 e3 h5 u$ }" O1 W; f$ b L
- ; </h>
1 U* j4 B& n9 [" h4 E# x
' w# o' l! M- L- Heap_Size EQU 0x00000200% W) q( O* I6 b$ N+ [1 a
- 9 \* s# A$ m$ Z, A( E
- AREA HEAP, NOINIT, READWRITE, ALIGN=3: G) A6 X4 i4 @
- __heap_base
0 @! E- m" H7 l- {+ t0 Q1 b- y
复制代码 \ \+ o/ F$ _4 J6 d! P8 P
2.堆和栈位置/ r6 W& {8 c3 o4 }/ ?. W
6 R9 c: y0 v! O0 \1 S& t# }通过MAP文件可知(在目标工程栏-->>双击工程名,就会在keil文件显示框出现map文件)% f) i' e" r6 m2 z3 W7 N; ?5 l
- HEAP 0x200106f8 Section 512 startup_stm32f2xx.o(HEAP)9 y) J/ O2 G1 @. F# P
- STACK 0x200108f8 Section 1024 startup_stm32f2xx.o(STACK)/ T t9 o" h" |2 O' j! m: }$ _/ _
" X: _+ K$ R8 Y$ f# X' c% ]9 _0 ~& X3 ~- __heap_base 0x200106f8 Data 0 startup_stm32f2xx.o(HEAP)0 j1 c$ w. D& s& b" [
- __heap_limit 0x200108f8 Data 0 startup_stm32f2xx.o(HEAP)+ C$ U/ w; ~) R$ ~) ?* D
- __initial_sp 0x20010cf8 Data 0 startup_stm32f2xx.o(STACK)
复制代码 显然 Cortex-m3资料可知:__initial_sp是堆栈指针,它就是FLASH的0x8000000地址前面4个字节(它根据堆栈大小,由编译器自动生成)2 T$ W. o" a, y4 l9 b
/ |: V8 J/ \% H4 O6 i显然堆和栈是相邻的。
6 I- I$ l1 |+ w) {- M7 b5 {' v" B4 @6 f
0 K. v6 |/ Y2 E' S8 Z( j9 E T9 c* b
: k* O2 ?3 B# G6 K; h: H, x2 S$ v6 h
3.堆和栈空间分配
8 h- w9 p8 g) d4 L& m: k2 b% |6 e& d9 v. n) Y& C
栈:向低地址扩展
' X3 X; Y% S4 m9 J* T$ Q4 A
- u5 U8 k6 c/ G+ J* e堆:向高地址扩展
) l" Z% i% U0 I, u
. e n4 _1 u7 U( i" P& f n显然如果依次定义变量
7 y# N! Q% D. P0 L3 F5 A! N# ^; d0 C9 ^" O% o
先定义的栈变量的内存地址比后定义的栈变量的内存地址要大
, t: R8 B8 u4 Z1 a% A9 r1 _6 n( f+ X, _* R; n
先定义的堆变量的内存地址比后定义的堆变量的内存地址要小
6 |( Y8 o9 E& _: G" l* F0 J0 d- Z# ?. l* `9 v1 g4 A x
4.堆和栈变量0 y8 G- t1 G* r5 j/ g# n% Z
, A8 z8 h6 R7 z5 w栈:临时变量,退出该作用域就会自动释放
p/ B$ w* q# o% J4 g
% c0 P* N7 |& X A0 \9 J, g堆:malloc变量,通过free函数释放; v( L# i9 P+ d7 Q
% w; \ {5 O. |) S5 \3 H. I3 w& ]3 @
$ |/ Z0 R0 X# [$ u3 I+ ]; Y另外:堆栈溢出,编译不会提示,需要注意
3 S) y9 J4 _0 I' f- n3 _+ h
6 J* C1 p4 t' R2 `. b
! }; W( D) Q1 \6 d) t" e( X) N- I |