1.堆和栈大小
% g1 Z; R, I# R; X: ` y7 Y8 k; X
* q; |8 V" ]4 C 定义大小在startup_stm32f2xx.s
# I6 Y+ ^$ C1 g- q- Stack_Size EQU 0x000004001 v! |8 E, z7 _( F
+ u4 S$ a0 \" x: H( r: [8 p- AREA STACK, NOINIT, READWRITE, ALIGN=3
]) m: B4 W U+ V4 X1 _ - Stack_Mem SPACE Stack_Size/ ~* Z$ E% W2 f/ t7 @
- __initial_sp
9 h1 X, i: E0 b( K9 @: w
5 V. R2 z* O y6 [
& E( G2 s8 S, X& l, D4 h- ; <h> Heap Configuration) H# W& ?, j# p' n$ `
- ; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
+ N3 K" Z8 H4 J: d) v/ d! e - ; </h>% |* @2 R# o$ M' a: l$ W$ s
- 7 n+ n. S: S* r1 \5 C3 V6 t
- Heap_Size EQU 0x00000200
5 @( V. f, c3 F' N: Y3 |7 T1 n - " }+ q/ T" N+ B9 g& f4 O
- AREA HEAP, NOINIT, READWRITE, ALIGN=30 [9 ^" X' Z( t* i
- __heap_base+ e5 r* I5 ?7 Q6 [$ k
复制代码 " E0 x, S- f5 ?4 Q; }% L1 r4 |
2.堆和栈位置
) J, W$ H g9 a9 J$ Q
! N E: c* A8 B: e/ q0 }通过MAP文件可知(在目标工程栏-->>双击工程名,就会在keil文件显示框出现map文件)- V2 c' T) [ H! \7 O; L
- HEAP 0x200106f8 Section 512 startup_stm32f2xx.o(HEAP)
3 d4 l) |+ y3 R+ c* Z; s - STACK 0x200108f8 Section 1024 startup_stm32f2xx.o(STACK)+ N/ w( D6 s7 q* q! {0 w' b& E
; r9 ^ s) [% B& i% ]* Q- __heap_base 0x200106f8 Data 0 startup_stm32f2xx.o(HEAP)
9 f- }9 M2 O* Z2 z% L( e - __heap_limit 0x200108f8 Data 0 startup_stm32f2xx.o(HEAP)! q0 i6 r ^1 x }/ S$ {
- __initial_sp 0x20010cf8 Data 0 startup_stm32f2xx.o(STACK)
复制代码 显然 Cortex-m3资料可知:__initial_sp是堆栈指针,它就是FLASH的0x8000000地址前面4个字节(它根据堆栈大小,由编译器自动生成)
9 T* K; Z. f L3 P1 O+ _# c9 F9 c: O9 N! J F1 ~
显然堆和栈是相邻的。
' `- p! e. K# w% l1 H- D) r$ L5 ]6 j* x% D
4 B+ r! X/ o/ ?+ L# M: C
* g# d1 u' R9 B$ r% a/ N+ c
$ z% f& h3 f. o
! d* C; o9 I/ b: l- t3.堆和栈空间分配& R* s3 m7 k2 b N" I( S
8 m8 z+ [- ?8 R5 s, `: U# L: K3 X
栈:向低地址扩展 `2 u/ p# Z; t
/ U& Q5 F' h! F0 U& h6 K' {, q# g堆:向高地址扩展. h2 e$ R$ T* T& o2 S t
2 U6 k; H9 K% g+ X9 _2 U% U显然如果依次定义变量# A( ]% @& z2 O: M8 M8 m
( h! H! d, P3 r5 ?: d7 m: q先定义的栈变量的内存地址比后定义的栈变量的内存地址要大) s8 t. w9 m5 ]& h
/ B$ v7 I4 z* s" d0 u
先定义的堆变量的内存地址比后定义的堆变量的内存地址要小
6 k/ z# v Q A/ c/ ?8 w5 y7 W
& k+ R, [* s( ~3 |$ n+ k4.堆和栈变量
+ s* r n+ t- ^" ` l8 m J) ^4 f+ |5 N4 R
栈:临时变量,退出该作用域就会自动释放
1 G u& G% \" Y% w# {" S3 M, C7 F" e0 q# w( O
堆:malloc变量,通过free函数释放
8 p+ H1 G/ p( A' l2 g, d6 D. e# v5 m4 s: @
% W. A+ K! A/ h# F! w/ n8 ]3 G, O* {5 ]# d4 N: ` ~+ [. R0 o
2 k# l/ I; E) U另外:堆栈溢出,编译不会提示,需要注意9 L$ a8 t8 o" D5 [% \# I+ h+ o
5 A v% {% {/ I* R
" c( y7 X! M9 B ? |