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

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

[复制链接]
STMCU小助手 发布时间:2021-12-3 17:00
1.堆和栈大小
" [6 e2 ^. V; E: Q: Z; I9 e2 f2 x* g8 O1 Z4 L
定义大小在startup_stm32f2xx.s) @5 q" g% ?: i  z* w- ~; i! [
  1. Stack_Size      EQU     0x00000400
    ; v9 {4 P3 q  ]

  2. + ]% d4 c/ V6 {" n; L
  3.                 AREA    STACK, NOINIT, READWRITE, ALIGN=3
    " z; G2 W0 F7 U  ^7 f0 ^4 m) ~
  4. Stack_Mem       SPACE   Stack_Size' I8 ~" F! j3 B1 L7 E$ |8 Y+ T4 x
  5. __initial_sp
    2 r) U) H( i* U* z0 c

  6. . W, c' i; \6 r* V, C& Q$ r
  7. 8 C7 B2 Z& w, C9 [0 `. f% }
  8. ; <h> Heap Configuration/ |9 Z% i" H% Q9 i4 r5 w' U
  9. ;   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>' i& o' |  }* @  |
  10. ; </h>
    . Z2 @* \/ i! d# R3 ~  S5 s
  11. $ G9 u" {6 H: t5 a
  12. Heap_Size       EQU     0x000002000 c  }9 D; X: X/ I0 ?

  13. + p5 D/ Q( j) l% g
  14.                 AREA    HEAP, NOINIT, READWRITE, ALIGN=30 \  f! v% m  Q) x$ R
  15. __heap_base
    / C5 r- r6 B5 M& v4 W
复制代码

7 v- v& J1 `4 G0 V( w2.堆和栈位置
- h( X2 M' E& X
9 y8 L3 v( s3 {# Z, @通过MAP文件可知(在目标工程栏-->>双击工程名,就会在keil文件显示框出现map文件)) b( @$ @3 j$ N; u' M% T8 x
  1. HEAP                                     0x200106f8   Section      512  startup_stm32f2xx.o(HEAP)
    6 D3 Y( j2 {6 J! i
  2. STACK                                    0x200108f8   Section     1024  startup_stm32f2xx.o(STACK)+ `7 g5 {2 n* u" y
  3. , J3 B' d' G  e- x
  4. __heap_base                              0x200106f8   Data           0  startup_stm32f2xx.o(HEAP)6 W; y# M& J  A- [4 ]* l
  5. __heap_limit                             0x200108f8   Data           0  startup_stm32f2xx.o(HEAP): d( z0 ?4 G2 M7 o7 S, C
  6. __initial_sp                             0x20010cf8   Data           0  startup_stm32f2xx.o(STACK)
复制代码
显然 Cortex-m3资料可知:__initial_sp是堆栈指针,它就是FLASH的0x8000000地址前面4个字节(它根据堆栈大小,由编译器自动生成)  A% L1 G9 @- k; D  {' n5 a

4 I3 v( c) H0 H& D" `& c& }/ f显然堆和栈是相邻的。/ f7 ]+ E$ m0 t# t" o" g
/ v& Z  t4 I5 C- v) ^) W
1337414322_6402.gif
- _& N$ q+ L+ X1 _3 d, f) H  w
1 ]# Z% w: ^* }5 O$ _+ f7 j

; T3 X+ \, ?( k1 i3 {# x/ _; F
: X) B8 x- c) ]7 R8 C3.堆和栈空间分配; H! F& V0 A- K4 b, \; r

, f; ~+ v' P' b+ p4 {! O栈:向低地址扩展
. ^/ N- C3 ?4 @& i. F8 l2 o2 n2 ]& {9 G- |: q
堆:向高地址扩展* ^% r# U& K4 H% x
6 z8 s3 ]* y# M; ?
显然如果依次定义变量) C  _: j' p2 ^

- _1 Q! H, F! P  @2 P$ H先定义的栈变量的内存地址比后定义的栈变量的内存地址要大
' |+ Z% y8 _" d8 \4 I; u2 R6 M% E5 T; G& F( t: J
先定义的堆变量的内存地址比后定义的堆变量的内存地址要小
, W# h2 d! D' l6 V  E$ ?8 Z) _& ?7 K& u, @  a
4.堆和栈变量
, \& t' f- P8 F# p* Y  L: j  q; P) \- Y. ]7 b0 _
栈:临时变量,退出该作用域就会自动释放
2 j7 G# j* k/ b; o$ r0 a0 U' }. _* l3 Z- g/ s  P0 i
堆:malloc变量,通过free函数释放
" }$ U! s5 q( x- t! p1 Q% q/ ?6 c! y1 H: F

* F3 o$ W; e: {- \4 ]* t
& n' p" W1 e& d( L另外:堆栈溢出,编译不会提示,需要注意% t7 h# a/ F' w  J, ^& e2 [- }

0 k8 j, [& Y$ j* G8 ?& p3 Q
& z& `- F$ @4 l, r# Z' {# l
收藏 评论0 发布时间:2021-12-3 17:00

举报

0个回答

所属标签

相似技术帖

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