请选择 进入手机版 | 继续访问电脑版

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

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

[复制链接]
STMCU小助手 发布时间:2021-12-3 17:00
1.堆和栈大小
- D2 a3 S/ ?7 n- F6 {3 C! F! ^
) a: m4 Y* g( V 定义大小在startup_stm32f2xx.s
% c' t' @' S1 h
  1. Stack_Size      EQU     0x00000400
    4 |1 \9 s+ h! L3 _4 i4 ?

  2. 9 p" C1 Q  T$ }/ s. @: |& o" W
  3.                 AREA    STACK, NOINIT, READWRITE, ALIGN=3
    . I' g/ ^9 |2 n, J7 a: ?6 E
  4. Stack_Mem       SPACE   Stack_Size
    . ?# ?' n. U$ n3 r5 F4 t
  5. __initial_sp# ]- i- ]" `# F. M
  6. ' v1 {7 S. c) G

  7. 0 `) i4 m) e0 H+ I8 H2 q" i/ Y
  8. ; <h> Heap Configuration
    - S, X5 b  k2 k2 ^+ N- c
  9. ;   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
    + Y7 r; j  s( r3 [1 X' h
  10. ; </h>
      d2 u% v* L0 ?, C: \/ k4 Q  x
  11. : l. v6 b- g$ l$ T3 M8 R
  12. Heap_Size       EQU     0x00000200
    # ^3 d8 o& j! K3 L+ ?& B

  13. 0 K# `# N/ m* @1 O# E4 H+ P; Z
  14.                 AREA    HEAP, NOINIT, READWRITE, ALIGN=34 `0 J2 z- k5 ~
  15. __heap_base
      g: ?, U0 F# G
复制代码

9 ^. s% j, F1 _( V7 Y& n2.堆和栈位置
1 c: x6 Y/ P# e* b! Q1 n) t- n4 ?! H4 K
通过MAP文件可知(在目标工程栏-->>双击工程名,就会在keil文件显示框出现map文件)
1 d! o$ _% {8 Y! n# U
  1. HEAP                                     0x200106f8   Section      512  startup_stm32f2xx.o(HEAP)9 d: o) }4 `) Z0 b& Z
  2. STACK                                    0x200108f8   Section     1024  startup_stm32f2xx.o(STACK)
    + K  r, |; X1 b& @
  3. 3 H. C! Q) X& _+ v
  4. __heap_base                              0x200106f8   Data           0  startup_stm32f2xx.o(HEAP)0 @- l; [3 J+ U7 I# O9 R7 y
  5. __heap_limit                             0x200108f8   Data           0  startup_stm32f2xx.o(HEAP)* Q1 c9 ?2 R) {# K
  6. __initial_sp                             0x20010cf8   Data           0  startup_stm32f2xx.o(STACK)
复制代码
显然 Cortex-m3资料可知:__initial_sp是堆栈指针,它就是FLASH的0x8000000地址前面4个字节(它根据堆栈大小,由编译器自动生成)
2 z" l8 b9 ]* x* k
- _" X, U- F3 {: S显然堆和栈是相邻的。
! j8 s9 C" i' @. R+ S( I+ c* k* Z  ~9 \9 s) H0 N! t: H2 ]
1337414322_6402.gif
# @6 X0 a& L8 u9 |2 m
( R; \  L' i& L* ^# ]
9 F0 v8 S4 E( J" g" {9 \

, O9 T, p( ?$ q% W6 K$ N7 |3.堆和栈空间分配
4 u% g. C; b7 S( z4 x6 Q  ~$ K7 h) T
栈:向低地址扩展9 y$ s/ e1 t2 ]2 d
3 s( }6 ~( y' }
堆:向高地址扩展
! a# E( X0 G5 f: _5 t. Z/ E6 V% |6 [7 K# r1 S6 I
显然如果依次定义变量3 [$ O- X4 ?* c* l" u
* }: c; J/ H, p5 _2 G- M% E( S
先定义的栈变量的内存地址比后定义的栈变量的内存地址要大" x- t6 L$ D. E% Q) g: Q
) e2 o4 n8 i* q" s1 d
先定义的堆变量的内存地址比后定义的堆变量的内存地址要小
" M# U0 a* l5 z# x8 B" D3 ]! J  S; y/ u* a$ L7 X1 d2 {
4.堆和栈变量6 ^/ C( v* R$ p( g8 R. G

5 L0 `% e9 I$ W& v8 I; k. t栈:临时变量,退出该作用域就会自动释放
8 u8 h* k# Q; J1 k8 t; p# ?
1 |0 o, t( p4 F堆:malloc变量,通过free函数释放- X4 b6 }3 R* p9 `- y/ v
8 g# ]/ u3 d+ `" ]
. a. ^: W0 D" N) p9 k# B  D5 @( L. f
# ~5 B; V! j8 k4 z
另外:堆栈溢出,编译不会提示,需要注意2 B- U4 M/ n7 O$ s1 x/ G- Y
, j' h9 n4 w7 c) O  r: A

; Z+ h0 g8 s$ w" X2 u4 D
收藏 评论0 发布时间:2021-12-3 17:00

举报

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