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

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

[复制链接]
STMCU小助手 发布时间:2021-12-3 17:00
1.堆和栈大小
( G7 v: N% v+ O% F# b! u" u9 Y2 N% C) U9 @# k
定义大小在startup_stm32f2xx.s
  W9 R1 x- i  e4 T
  1. Stack_Size      EQU     0x00000400
    2 t; y3 \1 o$ j( I
  2. 3 L; ?, ]* {  m/ F& O! M
  3.                 AREA    STACK, NOINIT, READWRITE, ALIGN=3& a3 ^% p+ t1 s2 Y4 K/ z+ k
  4. Stack_Mem       SPACE   Stack_Size
    7 i6 B6 B* A: _) O6 j- M' h
  5. __initial_sp
    ! m$ x! l4 U8 V' L+ `
  6. 5 Y6 u6 p! X. w' R+ K6 h; A% a0 L
  7. , |5 J0 I6 d0 N7 k7 j
  8. ; <h> Heap Configuration6 Q# R, [3 m0 C" v' {! v
  9. ;   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
    ( s1 `- x1 R, M: W, Y
  10. ; </h>
    , R2 P8 z) l% {% v3 o3 o% V

  11. + o. b( }$ R9 x( H  |9 v
  12. Heap_Size       EQU     0x000002009 v1 t) k$ [& L' K  \1 x3 g! z1 a5 Y

  13. 4 n* D7 `9 H6 `& |
  14.                 AREA    HEAP, NOINIT, READWRITE, ALIGN=3
    % N# c9 P/ i7 d- T3 r! |
  15. __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
  1. HEAP                                     0x200106f8   Section      512  startup_stm32f2xx.o(HEAP)6 Z' g* }8 }" Q, x
  2. STACK                                    0x200108f8   Section     1024  startup_stm32f2xx.o(STACK)& i  k3 p# [8 O' R( k+ @+ r$ x
  3. ; S) P5 A$ n% P. N/ O
  4. __heap_base                              0x200106f8   Data           0  startup_stm32f2xx.o(HEAP)5 w: r6 s. l- R3 i8 S. o, z
  5. __heap_limit                             0x200108f8   Data           0  startup_stm32f2xx.o(HEAP)
    & d1 z  I! m$ W% H
  6. __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
1337414322_6402.gif

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
收藏 评论0 发布时间:2021-12-3 17:00

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版