1.堆和栈大小
6 _4 M9 A! A3 Z) r& }
, D; z) I1 Y2 O4 k5 t- Q; U: z X 定义大小在startup_stm32f2xx.s
Y2 n" ?% \$ W$ v- Stack_Size EQU 0x00000400
1 w- A5 e! c! z ^) g$ a. |4 G - * |, i9 Q- r/ b6 D% r
- AREA STACK, NOINIT, READWRITE, ALIGN=3. i" a/ F/ M- s: ~. f0 O
- Stack_Mem SPACE Stack_Size
" h5 l5 T! T2 `8 v - __initial_sp$ K, V' M) c/ r3 _0 e
% _" `7 k% w8 r& @5 C% z
a3 T7 f3 z% U, L- ; <h> Heap Configuration
" }' N3 ?. R) R" t2 l5 q W6 _ - ; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>6 p9 E7 T4 {9 L" s- A# l
- ; </h>) B# O+ D* L, G0 }
7 b# |7 `: i k6 F2 Z- Heap_Size EQU 0x00000200
0 Z" Z2 L, ^7 y" [0 e5 y+ L
2 |( o* V7 g/ D, U7 N* U- AREA HEAP, NOINIT, READWRITE, ALIGN=3
; J" ]3 C ~! m: H% F1 D - __heap_base) B; q1 Q: {9 w2 }8 e' z. S
复制代码 1 T: q2 ]7 i7 p$ r+ h' ?
2.堆和栈位置
. |) _% Q' r' T; z1 d8 w9 ^' N+ L+ ~2 P# X
通过MAP文件可知(在目标工程栏-->>双击工程名,就会在keil文件显示框出现map文件)$ Y3 V: w5 U, x$ { w
- HEAP 0x200106f8 Section 512 startup_stm32f2xx.o(HEAP)* _8 w. K5 K0 k2 L: i1 K- ?
- STACK 0x200108f8 Section 1024 startup_stm32f2xx.o(STACK)
1 }, ~. Z. S* I+ b8 x - 0 O" N, p( G6 C& r
- __heap_base 0x200106f8 Data 0 startup_stm32f2xx.o(HEAP)
5 t, U) x9 X0 I: y - __heap_limit 0x200108f8 Data 0 startup_stm32f2xx.o(HEAP) _4 F J2 Z$ e; b0 c/ R# q
- __initial_sp 0x20010cf8 Data 0 startup_stm32f2xx.o(STACK)
复制代码 显然 Cortex-m3资料可知:__initial_sp是堆栈指针,它就是FLASH的0x8000000地址前面4个字节(它根据堆栈大小,由编译器自动生成)
7 e9 |! e4 j' z6 U8 h
$ u; l8 }" {6 N, _0 R5 u" q显然堆和栈是相邻的。+ ]. ^1 L! z7 `0 f
" d! J6 @3 M" k0 o
! `8 {3 p1 t* T8 K9 d# G; R6 @1 B
8 f% A$ t W6 X: Z( M) { [/ C6 g: h- s% q! @. W! H5 ]4 F
4 F* ~# @% T y" u6 Z+ ^3.堆和栈空间分配 O: v2 I$ |# o j/ X
, v% y6 E7 m) c- @! K栈:向低地址扩展6 |5 c+ I/ B! b/ u/ P) Q( ?
) j% [, [) r) N
堆:向高地址扩展
& H" K v/ E6 T; X D* s+ l% ` M+ k. I9 W% p+ @
显然如果依次定义变量
9 R+ z9 n/ f, |3 O" o* v1 V0 q
6 ~& N9 v+ @9 u. i* c先定义的栈变量的内存地址比后定义的栈变量的内存地址要大9 c6 i+ d9 z$ U# Z3 o5 E$ i3 z
- |; y9 x! R' e2 S
先定义的堆变量的内存地址比后定义的堆变量的内存地址要小 + E9 L* K5 q9 H. E
6 H4 `! G2 R% A' I1 X$ V3 M1 V9 p
4.堆和栈变量
1 f, ?* t& D9 ]& i; C b2 [5 D ?# X" M$ ^, ?
栈:临时变量,退出该作用域就会自动释放3 O4 z. n: _* \% z
* }( a) K: g) u6 j2 m, C5 k% V堆:malloc变量,通过free函数释放9 B& z3 v$ ^$ [7 [- F K+ d4 W
4 a2 \0 y2 B* V" I# m8 c% c* c ]" Y0 e/ l. \+ E8 H2 i
8 e8 Q/ E; P5 K5 a% @另外:堆栈溢出,编译不会提示,需要注意
$ N: h; `3 M3 C- t6 x$ d6 r8 H6 H) j4 _3 p8 H+ }# @
* C! K% N% y5 B& }1 F& ]
|