1.堆和栈大小* b& q% \/ C$ V- W. _1 A# t$ i
! I/ C- O6 d8 |9 h 定义大小在startup_stm32f2xx.s
0 i, E' B4 M u: u" G- Stack_Size EQU 0x00000400
; L1 Q8 Q& g# W - $ V* T' W9 V/ ~1 H6 k
- AREA STACK, NOINIT, READWRITE, ALIGN=30 m& {. S% \3 c0 |
- Stack_Mem SPACE Stack_Size
4 R, f# P2 o! z, L - __initial_sp8 ?, x2 Q* @% E: z' C
- , W+ w/ b2 u( J, R" j( n- J- Z
J/ |% [" S/ e' C7 J# c8 i- ; <h> Heap Configuration
0 `, Y4 U2 y6 a9 W$ E7 v" @% m - ; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
! L T& c8 R6 O - ; </h>! P0 F2 ]( ~- R3 ^9 c
- + h1 ?0 r3 _) o1 \) r, O. g0 Y
- Heap_Size EQU 0x00000200
* K/ N" T3 `/ \- X# J* E9 h" t
0 A( n, m' ?: n2 g- AREA HEAP, NOINIT, READWRITE, ALIGN=3- P/ z1 {$ Z7 `# E
- __heap_base
J$ F3 [6 }% F( }& y
复制代码
4 {$ s6 l6 }# j2.堆和栈位置
5 n9 \4 A) J! M3 e! A/ q$ E0 c! P, m& T
通过MAP文件可知(在目标工程栏-->>双击工程名,就会在keil文件显示框出现map文件)
|3 _+ M9 S r5 E( I( M% E6 L) k9 n2 X% P- HEAP 0x200106f8 Section 512 startup_stm32f2xx.o(HEAP)! C8 u( }. o2 T6 X: \, `: j
- STACK 0x200108f8 Section 1024 startup_stm32f2xx.o(STACK)
# ]1 L/ y. N8 F) V6 {2 T
$ c4 \$ F0 u; B0 u, o @- __heap_base 0x200106f8 Data 0 startup_stm32f2xx.o(HEAP)1 W; `5 [$ w9 G+ v: @; ~8 d! z9 C0 t
- __heap_limit 0x200108f8 Data 0 startup_stm32f2xx.o(HEAP)
- M2 E" E6 V1 Y6 ^ - __initial_sp 0x20010cf8 Data 0 startup_stm32f2xx.o(STACK)
复制代码 显然 Cortex-m3资料可知:__initial_sp是堆栈指针,它就是FLASH的0x8000000地址前面4个字节(它根据堆栈大小,由编译器自动生成), ], P- h% Y+ c% x) b
$ L1 A2 |9 k* e3 u! ~% G
显然堆和栈是相邻的。+ W5 J. k4 C! ?) x6 y( A% B* X
$ C4 r E" Y5 B8 ~5 t, q5 ~# N$ X$ d8 m7 H, K& ^% B3 ^
2 N, l0 m: o3 R) X7 S6 x1 q
" G5 h' K7 x: t" d) y8 t( ?% n: d
6 M" P- {1 f" W/ ^: e) e3 L, N5 i3.堆和栈空间分配
/ n1 j& r. |- D" r$ f6 m
0 z) V9 k- P* B6 f$ K& ~栈:向低地址扩展
1 s, N1 y, g. d/ \0 m) j2 Q+ w' H$ b3 E. S* V/ [/ ~% D
堆:向高地址扩展
) H! E& G B0 v; v4 g) D
. E% w0 s2 v! [7 ~显然如果依次定义变量
# C- M! L1 n, N0 ?& E; v4 g, @5 I! ?( o9 ^' x
先定义的栈变量的内存地址比后定义的栈变量的内存地址要大
1 Z! m) V+ _ M' _5 J# X' [
( v/ z8 [% q5 w; x+ }先定义的堆变量的内存地址比后定义的堆变量的内存地址要小
* O/ m8 [% r9 Y3 W" |( K
) k' M; p$ ~. c9 J+ A8 M4.堆和栈变量1 g+ J! o# W9 u2 t" z
! {. _1 X0 S9 w |3 D5 T, h: J
栈:临时变量,退出该作用域就会自动释放1 d5 ?5 ?+ f0 ^. t) Z
& z, t X" q8 \, t
堆:malloc变量,通过free函数释放
& A" P* c; U- G0 F9 x y, N2 {- j7 g& X1 ^$ B! ^
4 t9 {- f3 ~. ]$ h! H4 I7 _ T7 }4 N+ `: K
另外:堆栈溢出,编译不会提示,需要注意: X0 Q7 a+ j" G& b% M! X+ D7 m( n
) ], L. @& r# Q" b5 \0 t! S+ e# L( ~0 \
|