1.堆和栈大小
( G7 v: N% v+ O% F# b! u" u9 Y2 N% C) U9 @# k
定义大小在startup_stm32f2xx.s
W9 R1 x- i e4 T- Stack_Size EQU 0x00000400
2 t; y3 \1 o$ j( I - 3 L; ?, ]* { m/ F& O! M
- AREA STACK, NOINIT, READWRITE, ALIGN=3& a3 ^% p+ t1 s2 Y4 K/ z+ k
- Stack_Mem SPACE Stack_Size
7 i6 B6 B* A: _) O6 j- M' h - __initial_sp
! m$ x! l4 U8 V' L+ ` - 5 Y6 u6 p! X. w' R+ K6 h; A% a0 L
- , |5 J0 I6 d0 N7 k7 j
- ; <h> Heap Configuration6 Q# R, [3 m0 C" v' {! v
- ; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
( s1 `- x1 R, M: W, Y - ; </h>
, R2 P8 z) l% {% v3 o3 o% V
+ o. b( }$ R9 x( H |9 v- Heap_Size EQU 0x000002009 v1 t) k$ [& L' K \1 x3 g! z1 a5 Y
4 n* D7 `9 H6 `& |- AREA HEAP, NOINIT, READWRITE, ALIGN=3
% N# c9 P/ i7 d- T3 r! | - __heap_base
' x, M: h. V; s3 F! R+ a
复制代码 ) y- M6 X1 \( h3 i
2.堆和栈位置
3 B# V" f. \& n! T: T3 Y/ p3 O& i3 |1 F: Z& i# \2 h6 M9 X$ W5 K
通过MAP文件可知(在目标工程栏-->>双击工程名,就会在keil文件显示框出现map文件)
9 s2 [/ B7 V8 a$ P. M4 J- HEAP 0x200106f8 Section 512 startup_stm32f2xx.o(HEAP)6 Z' g* }8 }" Q, x
- STACK 0x200108f8 Section 1024 startup_stm32f2xx.o(STACK)& i k3 p# [8 O' R( k+ @+ r$ x
- ; S) P5 A$ n% P. N/ O
- __heap_base 0x200106f8 Data 0 startup_stm32f2xx.o(HEAP)5 w: r6 s. l- R3 i8 S. o, z
- __heap_limit 0x200108f8 Data 0 startup_stm32f2xx.o(HEAP)
& d1 z I! m$ W% H - __initial_sp 0x20010cf8 Data 0 startup_stm32f2xx.o(STACK)
复制代码 显然 Cortex-m3资料可知:__initial_sp是堆栈指针,它就是FLASH的0x8000000地址前面4个字节(它根据堆栈大小,由编译器自动生成). r2 S0 L9 E4 P ~" |
3 i% C! R% Z3 k( u' U* |1 ?显然堆和栈是相邻的。
( m- O9 d5 h( H& X# Z7 Q
% T: [ {( q* @$ v. H
2 O' n1 m% G/ V0 k: c4 W+ L! i& f F+ T
+ E) [+ c- X/ h! q8 S1 n4 ]
( R$ Q0 B' y- v' g+ a) t) u
3.堆和栈空间分配
1 n2 P9 X3 m0 c2 |: A; K% K7 x+ C+ N% {0 R) t' ^
栈:向低地址扩展
m$ r1 ~ V- \6 f' Q
9 n# {& R2 x+ S$ w) T) j' u6 ?1 F堆:向高地址扩展' o9 E2 ]; n$ e. B6 t9 J
* O% r* T8 M8 ?; \& D M显然如果依次定义变量( C+ B. `$ I& U$ b. q
3 F, B1 H3 b2 F4 Y* q, Q \* T6 Y先定义的栈变量的内存地址比后定义的栈变量的内存地址要大
2 G$ m! R( q6 a2 s$ a+ w. J5 V- r. H6 M( c: a6 `. z
先定义的堆变量的内存地址比后定义的堆变量的内存地址要小
6 ?: }) S2 \1 G' x, q! g
/ o" w. S ]& ]( A, P- ^+ P! I# t4.堆和栈变量1 d* W, ?+ ^$ W! y" C- ^7 q
% R Q. L& {8 Y0 G" {3 m栈:临时变量,退出该作用域就会自动释放2 F; m' C# g1 J' u- \& s( k3 B% ?
1 n9 l2 z2 H' N
堆:malloc变量,通过free函数释放
! t! t( \4 p. j+ k: i" ?( h# `+ ^; w Y* t* V
4 i( k9 H% C; h6 W) O, Y9 Y
( U1 ~: u. M. w另外:堆栈溢出,编译不会提示,需要注意/ R8 j- o7 P7 a- u0 h
9 M M& I. `2 s. O1 Q: F, X' E! |
3 ]# I5 u7 q# a/ j C* a, j
|