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

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

[复制链接]
STMCU小助手 发布时间:2021-12-3 17:00
1.堆和栈大小
) p3 z2 `( f" Y6 H/ N' N
* j* V! e1 t1 I2 {/ m" C- y 定义大小在startup_stm32f2xx.s
( }* ^1 C3 D# d  b2 `
  1. Stack_Size      EQU     0x00000400
    8 c$ g# s8 P4 Q3 G' y: V

  2. ; W: I* j& j9 A* m6 u
  3.                 AREA    STACK, NOINIT, READWRITE, ALIGN=3
    5 w& ?: `  \! N( ?" s8 z
  4. Stack_Mem       SPACE   Stack_Size3 O: u7 d! j6 O' x6 [, _% u; _
  5. __initial_sp
    # {, x. w3 `  ]7 b; ^, f4 N

  6. ! ]2 m; i! |# l* I

  7. 6 n9 \: K. ?# B* L3 z! n
  8. ; <h> Heap Configuration) t9 U4 R/ B. ?6 p2 P
  9. ;   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>0 _! C$ w, F! U0 o1 R
  10. ; </h>
    6 J1 {) ^. j. T: m  S' _" S5 @

  11. 6 K# c( Y0 Q8 Z; ~  Z7 r) ]
  12. Heap_Size       EQU     0x000002005 b9 D1 {7 n7 ]) y6 o
  13. 2 p0 h1 U( R& i
  14.                 AREA    HEAP, NOINIT, READWRITE, ALIGN=3
    : H' R9 ^. X5 e5 a
  15. __heap_base
    5 `) e- _7 r% k' y) s  D& i' J
复制代码
4 g0 |# b+ Z2 C9 u( d5 J& f7 y8 E
2.堆和栈位置1 C, t& B- M# }* T, }. g& f" T0 B7 N7 T  J
/ a4 y& J3 s  M# h$ H
通过MAP文件可知(在目标工程栏-->>双击工程名,就会在keil文件显示框出现map文件); Q& W" u* A, E1 n3 T; @; m: ^9 t
  1. HEAP                                     0x200106f8   Section      512  startup_stm32f2xx.o(HEAP)
    8 w, t* o4 T" v
  2. STACK                                    0x200108f8   Section     1024  startup_stm32f2xx.o(STACK)5 b- Y1 A& F5 g5 @* S" E

  3. & X4 |8 X, o# O" R; O; |
  4. __heap_base                              0x200106f8   Data           0  startup_stm32f2xx.o(HEAP)
    1 i* g# o. M+ e" B# Z
  5. __heap_limit                             0x200108f8   Data           0  startup_stm32f2xx.o(HEAP)' F& p& c5 z0 ?/ i# y  C
  6. __initial_sp                             0x20010cf8   Data           0  startup_stm32f2xx.o(STACK)
复制代码
显然 Cortex-m3资料可知:__initial_sp是堆栈指针,它就是FLASH的0x8000000地址前面4个字节(它根据堆栈大小,由编译器自动生成). w0 L* v& b2 x& k' ~) P5 `3 k

0 Q  a' n& C8 @, {显然堆和栈是相邻的。
4 L3 J7 \5 n( |* a! M. F/ M' E0 E% H: B: T
1337414322_6402.gif

% b  h$ r; N3 K) ^8 S' ]( W
, ]4 d$ A+ C& m( |
- B0 d1 {& F! g8 l3 B( f: a, G$ \! e7 h( w3 d, T) P* m0 C
3.堆和栈空间分配" x( p) s+ N, a( w

! |; e# v: ^1 I! N3 u栈:向低地址扩展
" Q1 P# U0 e4 I& c
% X+ p" z- O: D% u堆:向高地址扩展* c' O, a4 u) ?! H$ }4 y

0 p1 @7 j5 d; z/ C显然如果依次定义变量% X+ _- `: `7 b& I8 _$ T1 ?
* ?( r7 Q$ a0 c) c1 o: W5 N
先定义的栈变量的内存地址比后定义的栈变量的内存地址要大; g) O" o- o1 d/ Y9 B7 u' b+ s

. I+ w- n; i2 c4 B+ G先定义的堆变量的内存地址比后定义的堆变量的内存地址要小
8 i2 o) {+ ~) O+ B
" y( V' k* P! K8 P& H4.堆和栈变量
) M* [3 p, j0 F+ Z- x3 M" R2 y7 W8 b  p9 N' O0 p2 C. C$ b
栈:临时变量,退出该作用域就会自动释放3 b. B  M8 y3 I' |) W% Y
6 O6 Q) C8 d; {0 u7 z6 [$ g
堆:malloc变量,通过free函数释放, t: K8 |3 m3 ^$ k

  }5 ^  U3 W5 T0 ?9 o. B" ~( |$ K  U, T& w, K! @. c. Q3 B

; V$ Q( M9 R8 B$ `6 W5 K1 \另外:堆栈溢出,编译不会提示,需要注意2 J# r, u0 N1 A: ]" H' {6 L
6 P* R' d$ ?' ]9 W, w6 P
, y) e6 d) ]: ^# Q8 }
收藏 评论0 发布时间:2021-12-3 17:00

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版