1.堆和栈大小
" M3 D4 x9 z0 _+ x: N& W$ E3 ^' H7 I* ]5 ^
定义大小在startup_stm32f2xx.s3 o7 g2 @( j9 D8 K: n& Z$ M" C
- Stack_Size EQU 0x000004007 U% w. p- ]4 |. D, I- Y9 x
# z0 c( M6 x4 }9 o: L, ~- AREA STACK, NOINIT, READWRITE, ALIGN=3' r, Q0 L% w8 R4 r' p9 m
- Stack_Mem SPACE Stack_Size
6 q$ P% e9 H% ]# ~, a7 X. ] - __initial_sp
6 ]; n, \- f1 e u/ E U. |
: D4 X# }2 J Z- {+ \0 p6 t
3 L% S: l. p, Y; t. @$ g- ; <h> Heap Configuration
) i2 r: l9 K$ Y2 z6 |( r' I& h/ @ - ; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>9 a9 e& x# D4 c* ] d9 w
- ; </h>
$ c1 K5 C3 ?; ~5 i8 a. x$ `
! v, F2 G( n8 r K8 z8 ^4 h- Heap_Size EQU 0x00000200
( h: y( F, h: l6 I' x o/ u
8 S4 o @ [ K2 A; \* f. W% i- AREA HEAP, NOINIT, READWRITE, ALIGN=3" s1 s/ a9 U* o$ ^1 C5 s
- __heap_base* r3 V& v5 K. Y. _
复制代码
$ Z0 P! Z: D5 \ p0 ~% k2.堆和栈位置) g/ W( z2 u8 u u
: D. ?7 }/ S" s, ^! Z
通过MAP文件可知(在目标工程栏-->>双击工程名,就会在keil文件显示框出现map文件)
" M/ D0 f3 V6 W, D8 t4 ~5 z- HEAP 0x200106f8 Section 512 startup_stm32f2xx.o(HEAP)
4 F+ X) Q" Q4 e4 N5 _+ ^2 K$ O1 D1 x5 i - STACK 0x200108f8 Section 1024 startup_stm32f2xx.o(STACK)
- }/ g* W+ z, {# L6 h0 r
( D6 G0 R0 Q% c4 z- __heap_base 0x200106f8 Data 0 startup_stm32f2xx.o(HEAP)1 ]4 f( O& \' {% w- u
- __heap_limit 0x200108f8 Data 0 startup_stm32f2xx.o(HEAP)+ V; t% c2 d( A; W& G1 m
- __initial_sp 0x20010cf8 Data 0 startup_stm32f2xx.o(STACK)
复制代码 显然 Cortex-m3资料可知:__initial_sp是堆栈指针,它就是FLASH的0x8000000地址前面4个字节(它根据堆栈大小,由编译器自动生成)) U% l3 b5 u. Q; X
2 W; l% x4 I; {# ~+ t; ~, {9 I
显然堆和栈是相邻的。
; l D- I* \0 ~* \+ Z+ w0 T9 w6 Z, X/ w
* k4 ?& `- k- h) m% o
& I; |- B/ W7 F# K' T7 Z1 a
d) d3 m C7 Y" r" @& }* [3 z+ F7 j* T0 k
3.堆和栈空间分配
. d4 V! Q! a0 G6 g- ~6 x
1 M+ i: s) x8 B8 A栈:向低地址扩展1 @& ^' ~' A5 D& d( c- ~
/ T. `' a2 g& z8 I8 H8 {6 k堆:向高地址扩展8 h2 j( W; j" d# m$ N- a Z
1 y. x# [ x, m. F& @# X显然如果依次定义变量% K% i. ^. i. I3 y
: M* |- t! `. E# t先定义的栈变量的内存地址比后定义的栈变量的内存地址要大
0 }& f4 V; C0 L. E
7 T& Q" K8 @" C7 W先定义的堆变量的内存地址比后定义的堆变量的内存地址要小
) C2 T- \* O2 ^' r
# \4 o. r% ^1 X& W6 L E4.堆和栈变量2 D5 w/ w$ m, Y& B P7 d; f# ~5 M
% ?2 O) h) |7 n4 ^! n. s/ x1 t栈:临时变量,退出该作用域就会自动释放- C1 ^$ W* v+ O( E: R/ t5 _
5 \( E5 R, c% i T- a
堆:malloc变量,通过free函数释放
: `" R( j/ j) ^0 O8 s3 D. X; n7 T
0 ~& @; K# @# D- {
6 o8 k2 q( d/ [2 |: W& B, a/ V! J5 F9 s: G
另外:堆栈溢出,编译不会提示,需要注意4 o" |& Z% Z. l. b. a
3 Y: ]" Y+ \6 i6 d
# K9 P; G+ L' L, q& C5 f1 E |