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

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

[复制链接]
STMCU小助手 发布时间:2021-12-3 17:00
1.堆和栈大小
% g1 Z; R, I# R; X: `  y7 Y8 k; X
* q; |8 V" ]4 C 定义大小在startup_stm32f2xx.s
# I6 Y+ ^$ C1 g- q
  1. Stack_Size      EQU     0x000004001 v! |8 E, z7 _( F

  2. + u4 S$ a0 \" x: H( r: [8 p
  3.                 AREA    STACK, NOINIT, READWRITE, ALIGN=3
      ]) m: B4 W  U+ V4 X1 _
  4. Stack_Mem       SPACE   Stack_Size/ ~* Z$ E% W2 f/ t7 @
  5. __initial_sp
    9 h1 X, i: E0 b( K9 @: w

  6. 5 V. R2 z* O  y6 [

  7. & E( G2 s8 S, X& l, D4 h
  8. ; <h> Heap Configuration) H# W& ?, j# p' n$ `
  9. ;   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
    + N3 K" Z8 H4 J: d) v/ d! e
  10. ; </h>% |* @2 R# o$ M' a: l$ W$ s
  11. 7 n+ n. S: S* r1 \5 C3 V6 t
  12. Heap_Size       EQU     0x00000200
    5 @( V. f, c3 F' N: Y3 |7 T1 n
  13. " }+ q/ T" N+ B9 g& f4 O
  14.                 AREA    HEAP, NOINIT, READWRITE, ALIGN=30 [9 ^" X' Z( t* i
  15. __heap_base+ e5 r* I5 ?7 Q6 [$ k
复制代码
" E0 x, S- f5 ?4 Q; }% L1 r4 |
2.堆和栈位置
) J, W$ H  g9 a9 J$ Q
! N  E: c* A8 B: e/ q0 }通过MAP文件可知(在目标工程栏-->>双击工程名,就会在keil文件显示框出现map文件)- V2 c' T) [  H! \7 O; L
  1. HEAP                                     0x200106f8   Section      512  startup_stm32f2xx.o(HEAP)
    3 d4 l) |+ y3 R+ c* Z; s
  2. STACK                                    0x200108f8   Section     1024  startup_stm32f2xx.o(STACK)+ N/ w( D6 s7 q* q! {0 w' b& E

  3. ; r9 ^  s) [% B& i% ]* Q
  4. __heap_base                              0x200106f8   Data           0  startup_stm32f2xx.o(HEAP)
    9 f- }9 M2 O* Z2 z% L( e
  5. __heap_limit                             0x200108f8   Data           0  startup_stm32f2xx.o(HEAP)! q0 i6 r  ^1 x  }/ S$ {
  6. __initial_sp                             0x20010cf8   Data           0  startup_stm32f2xx.o(STACK)
复制代码
显然 Cortex-m3资料可知:__initial_sp是堆栈指针,它就是FLASH的0x8000000地址前面4个字节(它根据堆栈大小,由编译器自动生成)
9 T* K; Z. f  L3 P1 O+ _# c9 F9 c: O9 N! J  F1 ~
显然堆和栈是相邻的。
' `- p! e. K# w% l1 H- D) r$ L5 ]6 j* x% D
1337414322_6402.gif

4 B+ r! X/ o/ ?+ L# M: C
* g# d1 u' R9 B$ r% a/ N+ c
$ z% f& h3 f. o
! d* C; o9 I/ b: l- t3.堆和栈空间分配& R* s3 m7 k2 b  N" I( S
8 m8 z+ [- ?8 R5 s, `: U# L: K3 X
栈:向低地址扩展  `2 u/ p# Z; t

/ U& Q5 F' h! F0 U& h6 K' {, q# g堆:向高地址扩展. h2 e$ R$ T* T& o2 S  t

2 U6 k; H9 K% g+ X9 _2 U% U显然如果依次定义变量# A( ]% @& z2 O: M8 M8 m

( h! H! d, P3 r5 ?: d7 m: q先定义的栈变量的内存地址比后定义的栈变量的内存地址要大) s8 t. w9 m5 ]& h
/ B$ v7 I4 z* s" d0 u
先定义的堆变量的内存地址比后定义的堆变量的内存地址要小
6 k/ z# v  Q  A/ c/ ?8 w5 y7 W
& k+ R, [* s( ~3 |$ n+ k4.堆和栈变量
+ s* r  n+ t- ^" `  l8 m  J) ^4 f+ |5 N4 R
栈:临时变量,退出该作用域就会自动释放
1 G  u& G% \" Y% w# {" S3 M, C7 F" e0 q# w( O
堆:malloc变量,通过free函数释放
8 p+ H1 G/ p( A' l2 g, d6 D. e# v5 m4 s: @
% W. A+ K! A/ h# F! w/ n8 ]3 G, O* {5 ]# d4 N: `  ~+ [. R0 o

2 k# l/ I; E) U另外:堆栈溢出,编译不会提示,需要注意9 L$ a8 t8 o" D5 [% \# I+ h+ o

5 A  v% {% {/ I* R
" c( y7 X! M9 B  ?
赞 收藏 评论0 发布时间:2021-12-3 17:00

举报

0个回答

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版