你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32学习笔记之堆栈空间

[复制链接]
STMCU小助手 发布时间:2021-12-3 17:00
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
  1. Stack_Size      EQU     0x00000400
    ; L1 Q8 Q& g# W
  2. $ V* T' W9 V/ ~1 H6 k
  3.                 AREA    STACK, NOINIT, READWRITE, ALIGN=30 m& {. S% \3 c0 |
  4. Stack_Mem       SPACE   Stack_Size
    4 R, f# P2 o! z, L
  5. __initial_sp8 ?, x2 Q* @% E: z' C
  6. , W+ w/ b2 u( J, R" j( n- J- Z

  7.   J/ |% [" S/ e' C7 J# c8 i
  8. ; <h> Heap Configuration
    0 `, Y4 U2 y6 a9 W$ E7 v" @% m
  9. ;   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
    ! L  T& c8 R6 O
  10. ; </h>! P0 F2 ]( ~- R3 ^9 c
  11. + h1 ?0 r3 _) o1 \) r, O. g0 Y
  12. Heap_Size       EQU     0x00000200
    * K/ N" T3 `/ \- X# J* E9 h" t

  13. 0 A( n, m' ?: n2 g
  14.                 AREA    HEAP, NOINIT, READWRITE, ALIGN=3- P/ z1 {$ Z7 `# E
  15. __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
  1. HEAP                                     0x200106f8   Section      512  startup_stm32f2xx.o(HEAP)! C8 u( }. o2 T6 X: \, `: j
  2. STACK                                    0x200108f8   Section     1024  startup_stm32f2xx.o(STACK)
    # ]1 L/ y. N8 F) V6 {2 T

  3. $ c4 \$ F0 u; B0 u, o  @
  4. __heap_base                              0x200106f8   Data           0  startup_stm32f2xx.o(HEAP)1 W; `5 [$ w9 G+ v: @; ~8 d! z9 C0 t
  5. __heap_limit                             0x200108f8   Data           0  startup_stm32f2xx.o(HEAP)
    - M2 E" E6 V1 Y6 ^
  6. __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 ~
1337414322_6402.gif
# 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 \
收藏 评论0 发布时间:2021-12-3 17:00

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版