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

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

[复制链接]
STMCU小助手 发布时间:2021-12-3 17:00
1.堆和栈大小
) x- W( E7 |; o$ [1 Q/ T$ N/ V8 A" I- j. G! N/ V4 T( W
定义大小在startup_stm32f2xx.s, `# |% G2 A! a2 Q* S9 g
  1. Stack_Size      EQU     0x00000400
    0 T* M* q4 {2 g" U+ s
  2. * n' C2 c: n4 O0 _
  3.                 AREA    STACK, NOINIT, READWRITE, ALIGN=3
    & s1 f( F. `* \8 H
  4. Stack_Mem       SPACE   Stack_Size% }) t( I) x: ~
  5. __initial_sp
    ! `' p! g$ Q8 X$ Z3 U

  6. 3 t0 |2 l9 G1 D* b  d% M
  7. - L7 o+ U5 m2 w" b3 Y
  8. ; <h> Heap Configuration
    6 E2 L5 g  ]7 G# j4 ?6 @  s
  9. ;   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
    " p, ~" [( J) {. J8 P
  10. ; </h>. Q7 K5 ~0 c; [5 x& }

  11. . W; C4 W: N/ H- Z% ~4 u
  12. Heap_Size       EQU     0x00000200* y% b* g& c4 ^, C" Z4 _
  13. " {( S3 M8 V' m1 w
  14.                 AREA    HEAP, NOINIT, READWRITE, ALIGN=3
    $ Z/ w( W' c8 {& \- b1 ]
  15. __heap_base
    + M# {& Z7 \2 J2 @
复制代码
! O& W0 e& v1 n% |9 L
2.堆和栈位置
( w! l7 r: w8 [( _5 c
$ P" c! k* o3 G; S通过MAP文件可知(在目标工程栏-->>双击工程名,就会在keil文件显示框出现map文件)% M: Y0 Q" L" p. J9 d
  1. HEAP                                     0x200106f8   Section      512  startup_stm32f2xx.o(HEAP)
      s1 P( ~$ K! j& ]5 }4 A5 O
  2. STACK                                    0x200108f8   Section     1024  startup_stm32f2xx.o(STACK)0 L  ^" x7 [& B" |/ k

  3. : G, I" u7 R9 O8 S: O
  4. __heap_base                              0x200106f8   Data           0  startup_stm32f2xx.o(HEAP)6 G9 w7 C  D: m- h
  5. __heap_limit                             0x200108f8   Data           0  startup_stm32f2xx.o(HEAP)
    : g# u7 d) F- b9 [2 _$ I
  6. __initial_sp                             0x20010cf8   Data           0  startup_stm32f2xx.o(STACK)
复制代码
显然 Cortex-m3资料可知:__initial_sp是堆栈指针,它就是FLASH的0x8000000地址前面4个字节(它根据堆栈大小,由编译器自动生成)
4 A3 J9 Z) {' p, q/ g1 Z% Y( l8 k( \$ e' P! b9 Z3 Z) t, M3 H
显然堆和栈是相邻的。
3 d3 D( }; x* O. `, s& \  r8 g7 `0 M4 r: e# W9 O0 B/ V
1337414322_6402.gif

' R, |# H" G' H3 t9 b# i, q& h5 L; G
% L, g! v# v$ a" N- Q/ r+ y
: n0 e2 j4 w; G% I
3.堆和栈空间分配% U- u- F5 I$ ^% Q

+ X) f9 R2 h$ I, B' [1 W栈:向低地址扩展
/ h3 ]8 w7 z  @: h( J
3 B" H- R3 y! P, i& O# n* j( s堆:向高地址扩展# O1 t1 ~& l, S6 I& Z
+ @$ X( ]: H) {$ F* i
显然如果依次定义变量
6 Q1 o3 g# P3 _" v  p
; x: ]3 l$ M$ i2 Y先定义的栈变量的内存地址比后定义的栈变量的内存地址要大" G: `0 h, _# R- r

8 X, Q  t' Y/ A% z; ^1 i; ^先定义的堆变量的内存地址比后定义的堆变量的内存地址要小
5 M3 V' z( D# G3 P  o" V5 A2 G
9 v! h) l6 `2 u9 g# b/ d  D4.堆和栈变量& y. I$ `* t. c& f- @  S

) _8 A% T% y0 _% ]' e栈:临时变量,退出该作用域就会自动释放' y! N9 Y- q) H8 J. `$ ^4 O0 G

5 ?9 D: n9 q! R) a6 e% y* F堆:malloc变量,通过free函数释放
" \1 g# y' n- h2 T" L- {5 \" U0 L& i& k1 V4 V! B& `. W
# a" i% j8 J2 [' V, z0 T
2 K8 b- ~) a9 I/ s  |! }2 ^
另外:堆栈溢出,编译不会提示,需要注意" R7 Y6 X8 M4 Z% C& a, t7 f
+ _  R8 Y3 Q3 M7 @. f" `% x6 e

2 i7 s+ {8 Y. f$ W$ u
收藏 评论0 发布时间:2021-12-3 17:00

举报

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