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

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

[复制链接]
STMCU小助手 发布时间:2021-12-3 17:00
1.堆和栈大小
6 _4 M9 A! A3 Z) r& }
, D; z) I1 Y2 O4 k5 t- Q; U: z  X 定义大小在startup_stm32f2xx.s
  Y2 n" ?% \$ W$ v
  1. Stack_Size      EQU     0x00000400
    1 w- A5 e! c! z  ^) g$ a. |4 G
  2. * |, i9 Q- r/ b6 D% r
  3.                 AREA    STACK, NOINIT, READWRITE, ALIGN=3. i" a/ F/ M- s: ~. f0 O
  4. Stack_Mem       SPACE   Stack_Size
    " h5 l5 T! T2 `8 v
  5. __initial_sp$ K, V' M) c/ r3 _0 e

  6. % _" `7 k% w8 r& @5 C% z

  7.   a3 T7 f3 z% U, L
  8. ; <h> Heap Configuration
    " }' N3 ?. R) R" t2 l5 q  W6 _
  9. ;   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>6 p9 E7 T4 {9 L" s- A# l
  10. ; </h>) B# O+ D* L, G0 }

  11. 7 b# |7 `: i  k6 F2 Z
  12. Heap_Size       EQU     0x00000200
    0 Z" Z2 L, ^7 y" [0 e5 y+ L

  13. 2 |( o* V7 g/ D, U7 N* U
  14.                 AREA    HEAP, NOINIT, READWRITE, ALIGN=3
    ; J" ]3 C  ~! m: H% F1 D
  15. __heap_base) B; q1 Q: {9 w2 }8 e' z. S
复制代码
1 T: q2 ]7 i7 p$ r+ h' ?
2.堆和栈位置
. |) _% Q' r' T; z1 d8 w9 ^' N+ L+ ~2 P# X
通过MAP文件可知(在目标工程栏-->>双击工程名,就会在keil文件显示框出现map文件)$ Y3 V: w5 U, x$ {  w
  1. HEAP                                     0x200106f8   Section      512  startup_stm32f2xx.o(HEAP)* _8 w. K5 K0 k2 L: i1 K- ?
  2. STACK                                    0x200108f8   Section     1024  startup_stm32f2xx.o(STACK)
    1 }, ~. Z. S* I+ b8 x
  3. 0 O" N, p( G6 C& r
  4. __heap_base                              0x200106f8   Data           0  startup_stm32f2xx.o(HEAP)
    5 t, U) x9 X0 I: y
  5. __heap_limit                             0x200108f8   Data           0  startup_stm32f2xx.o(HEAP)  _4 F  J2 Z$ e; b0 c/ R# q
  6. __initial_sp                             0x20010cf8   Data           0  startup_stm32f2xx.o(STACK)
复制代码
显然 Cortex-m3资料可知:__initial_sp是堆栈指针,它就是FLASH的0x8000000地址前面4个字节(它根据堆栈大小,由编译器自动生成)
7 e9 |! e4 j' z6 U8 h
$ u; l8 }" {6 N, _0 R5 u" q显然堆和栈是相邻的。+ ]. ^1 L! z7 `0 f

" d! J6 @3 M" k0 o
1337414322_6402.gif

! `8 {3 p1 t* T8 K9 d# G; R6 @1 B
8 f% A$ t  W6 X: Z( M) {  [/ C6 g: h- s% q! @. W! H5 ]4 F

4 F* ~# @% T  y" u6 Z+ ^3.堆和栈空间分配  O: v2 I$ |# o  j/ X

, v% y6 E7 m) c- @! K栈:向低地址扩展6 |5 c+ I/ B! b/ u/ P) Q( ?
) j% [, [) r) N
堆:向高地址扩展
& H" K  v/ E6 T; X  D* s+ l% `  M+ k. I9 W% p+ @
显然如果依次定义变量
9 R+ z9 n/ f, |3 O" o* v1 V0 q
6 ~& N9 v+ @9 u. i* c先定义的栈变量的内存地址比后定义的栈变量的内存地址要大9 c6 i+ d9 z$ U# Z3 o5 E$ i3 z
- |; y9 x! R' e2 S
先定义的堆变量的内存地址比后定义的堆变量的内存地址要小 + E9 L* K5 q9 H. E
6 H4 `! G2 R% A' I1 X$ V3 M1 V9 p
4.堆和栈变量
1 f, ?* t& D9 ]& i; C  b2 [5 D  ?# X" M$ ^, ?
栈:临时变量,退出该作用域就会自动释放3 O4 z. n: _* \% z

* }( a) K: g) u6 j2 m, C5 k% V堆:malloc变量,通过free函数释放9 B& z3 v$ ^$ [7 [- F  K+ d4 W

4 a2 \0 y2 B* V" I# m8 c% c* c  ]" Y0 e/ l. \+ E8 H2 i

8 e8 Q/ E; P5 K5 a% @另外:堆栈溢出,编译不会提示,需要注意
$ N: h; `3 M3 C- t6 x$ d6 r8 H6 H) j4 _3 p8 H+ }# @
* C! K% N% y5 B& }1 F& ]
收藏 评论0 发布时间:2021-12-3 17:00

举报

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