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

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

[复制链接]
STMCU小助手 发布时间:2021-12-3 17:00
1.堆和栈大小
" M3 D4 x9 z0 _+ x: N& W$ E3 ^' H7 I* ]5 ^
定义大小在startup_stm32f2xx.s3 o7 g2 @( j9 D8 K: n& Z$ M" C
  1. Stack_Size      EQU     0x000004007 U% w. p- ]4 |. D, I- Y9 x

  2. # z0 c( M6 x4 }9 o: L, ~
  3.                 AREA    STACK, NOINIT, READWRITE, ALIGN=3' r, Q0 L% w8 R4 r' p9 m
  4. Stack_Mem       SPACE   Stack_Size
    6 q$ P% e9 H% ]# ~, a7 X. ]
  5. __initial_sp
    6 ]; n, \- f1 e  u/ E  U. |

  6. : D4 X# }2 J  Z- {+ \0 p6 t

  7. 3 L% S: l. p, Y; t. @$ g
  8. ; <h> Heap Configuration
    ) i2 r: l9 K$ Y2 z6 |( r' I& h/ @
  9. ;   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>9 a9 e& x# D4 c* ]  d9 w
  10. ; </h>
    $ c1 K5 C3 ?; ~5 i8 a. x$ `

  11. ! v, F2 G( n8 r  K8 z8 ^4 h
  12. Heap_Size       EQU     0x00000200
    ( h: y( F, h: l6 I' x  o/ u

  13. 8 S4 o  @  [  K2 A; \* f. W% i
  14.                 AREA    HEAP, NOINIT, READWRITE, ALIGN=3" s1 s/ a9 U* o$ ^1 C5 s
  15. __heap_base* r3 V& v5 K. Y. _
复制代码

$ Z0 P! Z: D5 \  p0 ~% k2.堆和栈位置) g/ W( z2 u8 u  u
: D. ?7 }/ S" s, ^! Z
通过MAP文件可知(在目标工程栏-->>双击工程名,就会在keil文件显示框出现map文件)
" M/ D0 f3 V6 W, D8 t4 ~5 z
  1. HEAP                                     0x200106f8   Section      512  startup_stm32f2xx.o(HEAP)
    4 F+ X) Q" Q4 e4 N5 _+ ^2 K$ O1 D1 x5 i
  2. STACK                                    0x200108f8   Section     1024  startup_stm32f2xx.o(STACK)
    - }/ g* W+ z, {# L6 h0 r

  3. ( D6 G0 R0 Q% c4 z
  4. __heap_base                              0x200106f8   Data           0  startup_stm32f2xx.o(HEAP)1 ]4 f( O& \' {% w- u
  5. __heap_limit                             0x200108f8   Data           0  startup_stm32f2xx.o(HEAP)+ V; t% c2 d( A; W& G1 m
  6. __initial_sp                             0x20010cf8   Data           0  startup_stm32f2xx.o(STACK)
复制代码
显然 Cortex-m3资料可知:__initial_sp是堆栈指针,它就是FLASH的0x8000000地址前面4个字节(它根据堆栈大小,由编译器自动生成)) U% l3 b5 u. Q; X
2 W; l% x4 I; {# ~+ t; ~, {9 I
显然堆和栈是相邻的。
; l  D- I* \0 ~* \+ Z+ w0 T9 w6 Z, X/ w
1337414322_6402.gif
* k4 ?& `- k- h) m% o

& I; |- B/ W7 F# K' T7 Z1 a
  d) d3 m  C7 Y" r" @& }* [3 z+ F7 j* T0 k
3.堆和栈空间分配
. d4 V! Q! a0 G6 g- ~6 x
1 M+ i: s) x8 B8 A栈:向低地址扩展1 @& ^' ~' A5 D& d( c- ~

/ T. `' a2 g& z8 I8 H8 {6 k堆:向高地址扩展8 h2 j( W; j" d# m$ N- a  Z

1 y. x# [  x, m. F& @# X显然如果依次定义变量% K% i. ^. i. I3 y

: M* |- t! `. E# t先定义的栈变量的内存地址比后定义的栈变量的内存地址要大
0 }& f4 V; C0 L. E
7 T& Q" K8 @" C7 W先定义的堆变量的内存地址比后定义的堆变量的内存地址要小
) C2 T- \* O2 ^' r
# \4 o. r% ^1 X& W6 L  E4.堆和栈变量2 D5 w/ w$ m, Y& B  P7 d; f# ~5 M

% ?2 O) h) |7 n4 ^! n. s/ x1 t栈:临时变量,退出该作用域就会自动释放- C1 ^$ W* v+ O( E: R/ t5 _
5 \( E5 R, c% i  T- a
堆:malloc变量,通过free函数释放
: `" R( j/ j) ^0 O8 s3 D. X; n7 T
0 ~& @; K# @# D- {
6 o8 k2 q( d/ [2 |: W& B, a/ V! J5 F9 s: G
另外:堆栈溢出,编译不会提示,需要注意4 o" |& Z% Z. l. b. a
3 Y: ]" Y+ \6 i6 d

# K9 P; G+ L' L, q& C5 f1 E
收藏 评论0 发布时间:2021-12-3 17:00

举报

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