1.堆和栈大小
) p3 z2 `( f" Y6 H/ N' N
* j* V! e1 t1 I2 {/ m" C- y 定义大小在startup_stm32f2xx.s
( }* ^1 C3 D# d b2 `- Stack_Size EQU 0x00000400
8 c$ g# s8 P4 Q3 G' y: V
; W: I* j& j9 A* m6 u- AREA STACK, NOINIT, READWRITE, ALIGN=3
5 w& ?: ` \! N( ?" s8 z - Stack_Mem SPACE Stack_Size3 O: u7 d! j6 O' x6 [, _% u; _
- __initial_sp
# {, x. w3 ` ]7 b; ^, f4 N
! ]2 m; i! |# l* I
6 n9 \: K. ?# B* L3 z! n- ; <h> Heap Configuration) t9 U4 R/ B. ?6 p2 P
- ; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>0 _! C$ w, F! U0 o1 R
- ; </h>
6 J1 {) ^. j. T: m S' _" S5 @
6 K# c( Y0 Q8 Z; ~ Z7 r) ]- Heap_Size EQU 0x000002005 b9 D1 {7 n7 ]) y6 o
- 2 p0 h1 U( R& i
- AREA HEAP, NOINIT, READWRITE, ALIGN=3
: H' R9 ^. X5 e5 a - __heap_base
5 `) e- _7 r% k' y) s D& i' J
复制代码 4 g0 |# b+ Z2 C9 u( d5 J& f7 y8 E
2.堆和栈位置1 C, t& B- M# }* T, }. g& f" T0 B7 N7 T J
/ a4 y& J3 s M# h$ H
通过MAP文件可知(在目标工程栏-->>双击工程名,就会在keil文件显示框出现map文件); Q& W" u* A, E1 n3 T; @; m: ^9 t
- HEAP 0x200106f8 Section 512 startup_stm32f2xx.o(HEAP)
8 w, t* o4 T" v - STACK 0x200108f8 Section 1024 startup_stm32f2xx.o(STACK)5 b- Y1 A& F5 g5 @* S" E
& X4 |8 X, o# O" R; O; |- __heap_base 0x200106f8 Data 0 startup_stm32f2xx.o(HEAP)
1 i* g# o. M+ e" B# Z - __heap_limit 0x200108f8 Data 0 startup_stm32f2xx.o(HEAP)' F& p& c5 z0 ?/ i# y C
- __initial_sp 0x20010cf8 Data 0 startup_stm32f2xx.o(STACK)
复制代码 显然 Cortex-m3资料可知:__initial_sp是堆栈指针,它就是FLASH的0x8000000地址前面4个字节(它根据堆栈大小,由编译器自动生成). w0 L* v& b2 x& k' ~) P5 `3 k
0 Q a' n& C8 @, {显然堆和栈是相邻的。
4 L3 J7 \5 n( |* a! M. F/ M' E0 E% H: B: T
% b h$ r; N3 K) ^8 S' ]( W
, ]4 d$ A+ C& m( |
- B0 d1 {& F! g8 l3 B( f: a, G$ \! e7 h( w3 d, T) P* m0 C
3.堆和栈空间分配" x( p) s+ N, a( w
! |; e# v: ^1 I! N3 u栈:向低地址扩展
" Q1 P# U0 e4 I& c
% X+ p" z- O: D% u堆:向高地址扩展* c' O, a4 u) ?! H$ }4 y
0 p1 @7 j5 d; z/ C显然如果依次定义变量% X+ _- `: `7 b& I8 _$ T1 ?
* ?( r7 Q$ a0 c) c1 o: W5 N
先定义的栈变量的内存地址比后定义的栈变量的内存地址要大; g) O" o- o1 d/ Y9 B7 u' b+ s
. I+ w- n; i2 c4 B+ G先定义的堆变量的内存地址比后定义的堆变量的内存地址要小
8 i2 o) {+ ~) O+ B
" y( V' k* P! K8 P& H4.堆和栈变量
) M* [3 p, j0 F+ Z- x3 M" R2 y7 W8 b p9 N' O0 p2 C. C$ b
栈:临时变量,退出该作用域就会自动释放3 b. B M8 y3 I' |) W% Y
6 O6 Q) C8 d; {0 u7 z6 [$ g
堆:malloc变量,通过free函数释放, t: K8 |3 m3 ^$ k
}5 ^ U3 W5 T0 ?9 o. B" ~( |$ K U, T& w, K! @. c. Q3 B
; V$ Q( M9 R8 B$ `6 W5 K1 \另外:堆栈溢出,编译不会提示,需要注意2 J# r, u0 N1 A: ]" H' {6 L
6 P* R' d$ ?' ]9 W, w6 P
, y) e6 d) ]: ^# Q8 }
|