1.堆和栈大小
) x- W( E7 |; o$ [1 Q/ T$ N/ V8 A" I- j. G! N/ V4 T( W
定义大小在startup_stm32f2xx.s, `# |% G2 A! a2 Q* S9 g
- Stack_Size EQU 0x00000400
0 T* M* q4 {2 g" U+ s - * n' C2 c: n4 O0 _
- AREA STACK, NOINIT, READWRITE, ALIGN=3
& s1 f( F. `* \8 H - Stack_Mem SPACE Stack_Size% }) t( I) x: ~
- __initial_sp
! `' p! g$ Q8 X$ Z3 U
3 t0 |2 l9 G1 D* b d% M- - L7 o+ U5 m2 w" b3 Y
- ; <h> Heap Configuration
6 E2 L5 g ]7 G# j4 ?6 @ s - ; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
" p, ~" [( J) {. J8 P - ; </h>. Q7 K5 ~0 c; [5 x& }
. W; C4 W: N/ H- Z% ~4 u- Heap_Size EQU 0x00000200* y% b* g& c4 ^, C" Z4 _
- " {( S3 M8 V' m1 w
- AREA HEAP, NOINIT, READWRITE, ALIGN=3
$ Z/ w( W' c8 {& \- b1 ] - __heap_base
+ M# {& Z7 \2 J2 @
复制代码 ! O& W0 e& v1 n% |9 L
2.堆和栈位置
( w! l7 r: w8 [( _5 c
$ P" c! k* o3 G; S通过MAP文件可知(在目标工程栏-->>双击工程名,就会在keil文件显示框出现map文件)% M: Y0 Q" L" p. J9 d
- HEAP 0x200106f8 Section 512 startup_stm32f2xx.o(HEAP)
s1 P( ~$ K! j& ]5 }4 A5 O - STACK 0x200108f8 Section 1024 startup_stm32f2xx.o(STACK)0 L ^" x7 [& B" |/ k
: G, I" u7 R9 O8 S: O- __heap_base 0x200106f8 Data 0 startup_stm32f2xx.o(HEAP)6 G9 w7 C D: m- h
- __heap_limit 0x200108f8 Data 0 startup_stm32f2xx.o(HEAP)
: g# u7 d) F- b9 [2 _$ I - __initial_sp 0x20010cf8 Data 0 startup_stm32f2xx.o(STACK)
复制代码 显然 Cortex-m3资料可知:__initial_sp是堆栈指针,它就是FLASH的0x8000000地址前面4个字节(它根据堆栈大小,由编译器自动生成)
4 A3 J9 Z) {' p, q/ g1 Z% Y( l8 k( \$ e' P! b9 Z3 Z) t, M3 H
显然堆和栈是相邻的。
3 d3 D( }; x* O. `, s& \ r8 g7 `0 M4 r: e# W9 O0 B/ V
' R, |# H" G' H3 t9 b# i, q& h5 L; G
% L, g! v# v$ a" N- Q/ r+ y
: n0 e2 j4 w; G% I
3.堆和栈空间分配% U- u- F5 I$ ^% Q
+ X) f9 R2 h$ I, B' [1 W栈:向低地址扩展
/ h3 ]8 w7 z @: h( J
3 B" H- R3 y! P, i& O# n* j( s堆:向高地址扩展# O1 t1 ~& l, S6 I& Z
+ @$ X( ]: H) {$ F* i
显然如果依次定义变量
6 Q1 o3 g# P3 _" v p
; x: ]3 l$ M$ i2 Y先定义的栈变量的内存地址比后定义的栈变量的内存地址要大" G: `0 h, _# R- r
8 X, Q t' Y/ A% z; ^1 i; ^先定义的堆变量的内存地址比后定义的堆变量的内存地址要小
5 M3 V' z( D# G3 P o" V5 A2 G
9 v! h) l6 `2 u9 g# b/ d D4.堆和栈变量& y. I$ `* t. c& f- @ S
) _8 A% T% y0 _% ]' e栈:临时变量,退出该作用域就会自动释放' y! N9 Y- q) H8 J. `$ ^4 O0 G
5 ?9 D: n9 q! R) a6 e% y* F堆:malloc变量,通过free函数释放
" \1 g# y' n- h2 T" L- {5 \" U0 L& i& k1 V4 V! B& `. W
# a" i% j8 J2 [' V, z0 T
2 K8 b- ~) a9 I/ s |! }2 ^
另外:堆栈溢出,编译不会提示,需要注意" R7 Y6 X8 M4 Z% C& a, t7 f
+ _ R8 Y3 Q3 M7 @. f" `% x6 e
2 i7 s+ {8 Y. f$ W$ u |