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

【经验分享】MDK5之.map文件解析

[复制链接]
STMCU小助手 发布时间:2022-3-8 10:33
一、.map文件总览
& {7 `  v, @  D0 S) `( t- |Project -> Options for Target -> Listing:会看到如下配置界面- c* G1 O0 H+ i& |% ?
. C7 x  E4 x3 L: f* S& v$ @
K%GLXKQWHT~UP$Z@%6MR7@2.png
4 ~" g  {0 Q. Z5 g  S2 X
- {9 _4 d# @2 [$ J; X里面的内容如下图:5 Z1 r! t9 Q/ P1 o) }

* P3 E3 i3 t9 B) L 6 E: v" [3 L! S

, G& h6 M  U, w* U/ _map文件里面内容大致分为五大类(按照map文件分类的顺序):
2 Y& M9 Y; S1 J' r, ]7 B/ S7 W8 w. E0 o' p. f
1.Section Cross References:模块、段(入口)交叉引用;; R; D% @1 i, u& I6 i+ b" Q2 I6 c

. ~' b4 l4 f/ }  T( D2.Removing Unused input sections from the image:移除未使用的模块;) U0 \& o. c4 a/ S% q
3 o$ {; b3 h  e
3.Image Symbol Table:映射符号表;
5 `- o; c1 J) q. D; a, R
8 k0 t' f2 Y( O- y  c% T$ p6 I4.Memory Map of the image:内存(映射)分布;
2 l( u2 V* ^: A+ @5 k  \0 l. d; c  G$ ~* @% ^+ q( f, X2 h
5.Image component sizes:存储组成大小。
% Q1 a# \1 ]4 T- j9 o
6 D  _3 t* {' n二、详细介绍
. E5 p" v' z! w/ S* J% @1、Section Cross References:模块、段(入口)交叉引用/ C6 [" B4 ^5 R
8 ?$ S5 S0 E0 C* i
E3JEYNN{[PC0T(MN)81L)@B.png
2 `4 Y- ~1 p; @0 }; m
# L* {& f* q) p% o8 _& @
配置中需勾选上:Cross Reference
# H( q9 i( y6 N! r7 P
6 R; d, z% K8 x% ]" \) K7 [; `Section Cross References:模块、段(入口)交叉引用,指的是各个源文件生成的模块、段(定义的入口)之间相互引用的关系。
" s& \( G+ W! }& ~
6 `; k* o" r8 h比如:7 h4 n& I* j' A( X! Z5 M
4 e& m- U: U% g
main.o(i.System_Initializes) refers to bsp.o(i.BSP_Initializes) for BSP_Initializes1 G' s! p( C9 u) Z
7 \7 Y+ Y: O. ]0 b1 N) f
意思是:" M. ]6 M$ v/ t/ C! e  P7 A

& L+ `7 X+ i7 Y) T  i* nmain模块(main.o)中的System_Initializes函数(i.System_Initializes),引用(或者说调用)了bsp模块(bsp.o)中的BSP_Initializes函数。% e" k# d4 z" E" d+ |

& J5 t# b+ v6 C6 a1 T8 c% y# N提示:8 J) P7 M) g- ]/ `( w3 ~

8 F2 D% r8 [5 N$ hmain.o是main.c源文件生成的目标文件模块;
; [* r  Q7 \4 d+ p) w* S
+ b- x, y* D9 l  V; N: D& S* ~4 qI.System_Initializes是System_Initializes函数的入口。2 \9 [3 P8 ~8 h# m4 h2 a( q3 R

5 j9 a; T: n# x+ o: S, L9 @. c# S# X2 a1 B& I3 u/ p' j: m  |
2、Removing Unused input sections from the image:移除未使用的模块
/ r- W1 n1 I' T+ O. P) [9 ]
' M; `, K  E$ R4 a- c3 U M}ONO}WFAEY`BMC6OU4K13S.png 3 e: b3 N3 A: \+ M# T) k
  I! }1 q# d6 t' K* B
配置中需勾选上:Unuaed Sections Info/ q8 r% u7 d& e9 p

( X" O. ^9 b+ y2 X; Q这一选项很好理解,就是我们工程代码中,没有被调用的模块。
" Q6 ?6 P8 C3 h! |$ N1 a0 j% w: Y2 O) B6 S1 F
最后还有一个统计信息:
' f( `4 V3 g' ~  d& _! s
/ Q; g/ ~0 I2 E6 a52 unused section(s) (total 2356 bytes) removed from the image.1 ^( m8 F0 P  w  }1 b

- s* z+ H! b- F' [. V1.总共有52段没有被调用;: P. ?, N, O( |

$ P% y$ M$ i  T) R2.没有被调用的大小为2356 字节# i( G/ z# N& P- O: U
" l; s! F! F. ?( E( C$ k: f/ `2 j

5 ~4 E: S9 Q, m5 w$ h) T/ ^6 a, o( o  m3、Image Symbol Table:映射符号表
$ Z% d1 [/ |/ b' S: L$ H
. G, A% Z  P( X! V8 y
K%]%E(5R@]D_7AR610DZJZ9.png
. N9 V& `8 f/ A! p& {5 j9 \! T( C8 D$ ~* X! I- N, z! [& u3 j) W
配置中需勾选上:Symbols9 y) v4 J. o/ \0 g. f: B6 s7 k- u" {
1 z7 g) D, R% A- ^6 y' r8 N
Image Symbol Table:映射符号表,也就是各个段所存储对应地址的表(这一项比较重要)。. b" M& L7 m; q1 W; ^* p3 D0 j

! w$ C7 [+ Z+ k1 [9 I+ |Symbols分为两大类) G9 S5 b8 o/ s3 Z

- X) ]* A' _) |1.Local Symbols局部: s) b% U0 o) n& p
" I  q8 [% o0 ^2 C7 b
2.Global Symbols全局, @% a+ \0 K/ U6 P0 g9 X

" Z3 h' T2 O$ C/ X+ L2 w% ~+ t内容要点
  B3 S& u; a5 B+ j: p6 Q8 t+ ]
  w- `1 Z( `' n4 W9 `①.Symbol Name:符号名称
# n# W; u- Z) e# W- h- M2 N) O+ [8 y9 @, M5 d
②.Value:存储对应的地址;
. J9 G* K1 I" `3 ?/ q# n. Y- e' w  M3 S" U8 t
大家会发现有0x0800xxxx、0x2000xxxx这样的地址。9 H2 w# |5 I' V6 X) R
" Y& |2 b5 q4 c6 `; Y2 Z  Q* T
0x0800xxxx指存储在FLASH里面的代码、变量等。
" ]* ], J+ m- u5 N/ }" w5 F7 s4 l5 O1 H3 x: P7 u2 f- ?3 e
0x2000xxxx指存储在内存RAM中的变量Data等。
; f# p5 K# \' n* U% O( R$ _
& Y, i( v: p9 o6 d% ?* M③.Ov Type:符号对应的类型5 D. q2 n; @0 j

( t+ F8 y# y+ b; _符号类型大概有几种:Number、Section、Thumb Code、Data等;
& @$ k% Z6 i7 J" K: Y+ s+ t2 H1 T3 |. G9 k
细心的朋友会发现:全局、静态变量等位于0x2000xxxx的内存RAM中。
5 t0 L8 |8 y  l* [" ]7 T4 \; h, z6 E5 \$ F0 o4 L% f" r
④.Size:存储大小
4 o# H- @  W9 z, \
5 d& ?' b9 N: o  r3 x) S这个容易理解,我们怀疑内存溢出,可以查看代码存储大小来分析。; n# e' ]( s# g% h& |

1 R& ?$ t2 |" s⑤.Object(Section):段目标: U8 o- |* A9 D1 U& E
' I& B, ~9 r  L; O
这里一般指所在模块(所在源文件)。/ [' A9 }' d! j

8 q3 J+ z: Q" C' q4、Memory Map of the image:内存(映射)分布$ Q, \* v! A3 i# F2 J
' ]% N! J" {" ^/ ]3 G
_MGE~BMXC_%GM140W)@@RQJ.png " |' O1 W! H' j0 ^/ g# L7 G0 y4 [

$ [! E* C! f7 J( a  ]: O6 r* |% m配置中需勾选上:Memory Map& u0 Z5 C; L# y( O9 F' A
# b# C+ {' w: Z
Memory Map of the image:内存(映射)分布,内容相对较多,也是比较重要的一项。9 {; N8 v; I5 d5 r

8 T7 z8 c7 I" C$ Q7 ]1 T! IImage Entry point : 0x08000131:指映射入口地址。
$ k% z# k3 v/ J2 v+ ^: |1 N: J! F
/ K$ [; t) H6 G% Q- ~) ?) M1 w/ zLoad Region LR_IROM1 (Base: 0x08000000, Size: 0x000004cc, Max: 0x00080000, ABSOLUTE):
1 V9 p9 M: |3 _' n+ P; J& R: m  o; ^. x7 Z( a, M! y
指加载区域位于LR_IROM1开始地址0x08000000,大小有0x000004cc,这块区域最大为0x00080000.2 T# s+ k* {# {0 T
+ A1 w6 y/ J1 J8 @
执行区域:7 c. P8 G( @" m' E; @

: M7 y) l2 {- g& }: XExecution Region ER_IROM1# M3 Q; K( [3 x# h- Q
' g* Q$ N# n- B, N1 J; e$ w; j/ }
Execution Region RW_IRAM1
8 J$ A7 a; e8 F5 N9 m# d) I5 A- z" h
这个区域,其实就是对应我们目标配置中的区域,如下如
& {1 E, `; |7 [9 p- e! a& U* I( [6 ]+ Z# u
0R@}9FN[GJLHS9LN@R%FRC6.png 8 X/ v' F% B+ v, I! d4 F3 i
7 O- v" R3 Z9 j: f7 D) e1 n7 M
内容要点
7 g$ O  {* {# Z5 S8 f( I
2 I# s' D8 y6 P( V: u& O# t①.Base Addr:存储地址
4 d# u0 t- }8 X' V3 S
; K% Q# E. [+ N* x0 v' M0x0800xxxxFLASH地址和0x2000xxxx内存RAM地址。
$ p- I; a, m+ y* l6 E1 m0 G
3 j# ]" H+ B: G②.Size:存储大小& {& F& e8 R8 L' _

4 T6 B0 @9 Q$ `* |3 `6 f2 `, ?③.Type:类型9 m6 ?* d( s5 b/ g7 S8 T
. J/ m' E3 A( t+ h
Data:数据类型
8 r8 M6 B3 m! J$ N  U4 U
* i. [% d+ h/ V, [5 h; }5 nCode:代码类型) [2 a$ F4 C5 J' R  \# c

) j6 ?) a- K6 X0 RZero:未初始化变量类型9 s/ G2 G$ ^: N* D+ p1 f! b6 `9 J

& Z  z! g; S' I2 @) i4 L0 \PAD:这个类型在map文件中放在这个位置,其实它不能算这里的类型。要翻译的话,只能说的“补充类型”。
) k; n  U% F$ g& y! S+ x) c
& F+ {2 Q! s9 B5 ]4 ~" t7 SARM处理器是32位的,如果定义一个8位或者16位变量就会剩余一部分,这里就是指的“补充”的那部分,会发现后面的其他几个选项都没有对应的值。
: }  c5 \2 r: b/ a- v3 D6 Q/ a& q) n; h* `
④.Attr:属性
8 A. H+ r0 Q9 K
4 S9 w0 }6 M; DRO:存储与ROM中的段; V  q8 i% f8 Y; M/ E

5 l4 V+ A# Z" A2 {- P: JRW:存储与RAM中的段
  r, w5 S" J: |( c# @$ w
# a6 l$ b7 \4 B⑤.Section Name:段名
! u4 @& R% ~& A9 Z/ a" |, ~8 T7 R
  p, p8 M, H- b4 W/ p, i/ S5 Q" ^这里也可以说为入口分类名,与第一章节“Section Cross References”指的模块、段一样。: m  [1 S2 w5 v8 b

, W! T( J1 W  [: v大概包含:RESET、.ARM、 .text、 i、 .data、 .bss、 HEAP、 STACK等。
: n& @+ j, |! l9 E
* E" G+ B! j1 ?& U7 B⑥.Object:目标
- E; Y' n" H" A8 w
$ ^, S2 d! V1 B; j* a8 j, f5、Image component sizes:存储组成大小
7 j4 A* Z3 V2 C1 U. ~7 o2 ~! i& ?# R8 [! ~8 D
HTFPUF`0((LN7STX1)BH6)L.png
2 }3 w0 b& u2 i
  f: x7 B" ]& E1 J配置中需勾选上:Size Info, Y2 l; E  k/ w+ E6 v; j

) U" k! R5 G2 R0 ^( V9 XImage component sizes:存储组成大小,其实主要就是对模块进行汇总存储大小信息。
0 J% k$ D8 n5 T- J+ N% ^/ Q5 k" ~0 `' r5 A. @8 G: _3 L; b2 g
这一章节内容相信大家都能理解,我们编译工程后,在编译窗口一般会看到类似如下一段信息:
- I) f5 C* B! a, h: b* a* L, ^: G4 [. B6 c; s1 B
Program Size: Code=908 RO-data=320 RW-data=0 ZI-data=1024
7 T+ O# O0 U/ W+ ^' k4 n; u' _3 n% a( V- M" m
Code:指代码的大小;
0 p$ D9 V7 p8 c% E( L- \" J2 V7 I/ ~$ b) r
Ro-data:指除了内联数据(inline data)之外的常量数据;
3 i/ a! Y! V; }& g3 I) E, B2 k+ N0 u% E4 O- o
RW-data:指可读写(RW)、已初始化的变量数据;$ G5 ]0 O5 ?- _% ]8 z

' G" ~7 P5 P8 ^1 O2 }9 MZI-data:指未初始化(ZI)的变量数据;
( u4 m, Z$ O3 x" w1 E) |
5 X7 b5 l) H7 V1 W* C$ ^# w) JCode、Ro-data:位于FLASH中;+ C7 X* G: ^; i& G2 x% S* c2 u

( ^" H) ]1 K% S' GRW-data、ZI-data:位于RAM中;
; }, _$ c" \8 E: S+ R
8 ]% m, m% ]; I6 x提醒:RW-data已初始化的数据会存储在Flash中,上电会从FLASH搬移至RAM中。+ W& o8 u  U7 H

3 A4 ]0 }+ b* h' n& f) M5 x" c关系如下:
, t4 K7 |6 [  L/ h8 u* m$ T- h1 R5 ?0 x/ Z. t. Q) A, R( P
RO Size = Code + RO Data
& I6 v) y- W* H% |7 M% k, i  U7 U3 s. g# R, e
RW Size = RW Data + ZI Data
1 g9 ?0 ?" ^) T/ ?
# j! B. k4 e. O0 |0 Y; Y9 O8 PROM Size = Code + RO Data + RW Data
& I( H$ B! d! j1 K$ Z" ?  y, E& D+ ~: y9 r

) W2 q3 l& S+ A& J/ z& y$ A. A
9 {* n( Q0 B% w7 y9 n
1MLTTLERBI8L7GV{XZO)1JT.png
赞 收藏 评论0 发布时间:2022-3-8 10:33

举报

0个回答

所属标签

相似技术帖

官网相关资源

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