STMCU小助手
发布时间:2022-3-8 10:33
|
一、.map文件总览 Project -> Options for Target -> Listing:会看到如下配置界面- c* G1 O0 H+ i& |% ? . C7 x E4 x3 L: f* S& v$ @
里面的内容如下图:5 Z1 r! t9 Q/ P1 o) }
map文件里面内容大致分为五大类(按照map文件分类的顺序): , ]7 B/ S7 W8 w. E0 o' p. f 1.Section Cross References:模块、段(入口)交叉引用;; R; D% @1 i, u& I6 i+ b" Q2 I6 c 2.Removing Unused input sections from the image:移除未使用的模块;) U0 \& o. c4 a/ S% q 3 o$ {; b3 h e 3.Image Symbol Table:映射符号表; 4.Memory Map of the image:内存(映射)分布; \0 l. d; c G$ ~* @% ^+ q( f, X2 h 5.Image component sizes:存储组成大小。 二、详细介绍 1、Section Cross References:模块、段(入口)交叉引用/ C6 [" B4 ^5 R 8 ?$ S5 S0 E0 C* i
# L* {& f* q) p% o8 _& @ 配置中需勾选上:Cross Reference Section Cross References:模块、段(入口)交叉引用,指的是各个源文件生成的模块、段(定义的入口)之间相互引用的关系。 比如: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 main模块(main.o)中的System_Initializes函数(i.System_Initializes),引用(或者说调用)了bsp模块(bsp.o)中的BSP_Initializes函数。% e" k# d4 z" E" d+ | 提示:8 J) P7 M) g- ]/ `( w3 ~ main.o是main.c源文件生成的目标文件模块; I.System_Initializes是System_Initializes函数的入口。2 \9 [3 P8 ~8 h# m4 h2 a( q3 R . c# S# X2 a1 B& I3 u/ p' j: m | 2、Removing Unused input sections from the image:移除未使用的模块
I! }1 q# d6 t' K* B 配置中需勾选上:Unuaed Sections Info/ q8 r% u7 d& e9 p 这一选项很好理解,就是我们工程代码中,没有被调用的模块。 $ N1 a0 j% w: Y2 O) B6 S1 F 最后还有一个统计信息: 52 unused section(s) (total 2356 bytes) removed from the image.1 ^( m8 F0 P w }1 b 1.总共有52段没有被调用;: P. ?, N, O( | 2.没有被调用的大小为2356 字节# i( G/ z# N& P- O: U " l; s! F! F. ?( E( C$ k: f/ `2 j 3、Image Symbol Table:映射符号表$ Z% d1 [/ |/ b' S: L$ H . G, A% Z P( X! V8 y
$ ~* 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 Symbols分为两大类) G9 S5 b8 o/ s3 Z 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 内容要点 ①.Symbol Name:符号名称 - M2 N) O+ [8 y9 @, M5 d ②.Value:存储对应的地址; - 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里面的代码、变量等。 7 s4 l5 O1 H3 x: P7 u2 f- ?3 e 0x2000xxxx指存储在内存RAM中的变量Data等。 ③.Ov Type:符号对应的类型5 D. q2 n; @0 j 符号类型大概有几种:Number、Section、Thumb Code、Data等; + t2 H1 T3 |. G9 k 细心的朋友会发现:全局、静态变量等位于0x2000xxxx的内存RAM中。 , z6 E5 \$ F0 o4 L% f" r ④.Size:存储大小 这个容易理解,我们怀疑内存溢出,可以查看代码存储大小来分析。; n# e' ]( s# g% h& | ⑤.Object(Section):段目标: U8 o- |* A9 D1 U& E ' I& B, ~9 r L; O 这里一般指所在模块(所在源文件)。/ [' A9 }' d! j 4、Memory Map of the image:内存(映射)分布$ Q, \* v! A3 i# F2 J ' ]% N! J" {" ^/ ]3 G
配置中需勾选上: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 Image Entry point : 0x08000131:指映射入口地址。 Load Region LR_IROM1 (Base: 0x08000000, Size: 0x000004cc, Max: 0x00080000, ABSOLUTE): : 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; @ Execution Region ER_IROM1# M3 Q; K( [3 x# h- Q ' g* Q$ N# n- B, N1 J; e$ w; j/ } Execution Region RW_IRAM1 5 N9 m# d) I5 A- z" h 这个区域,其实就是对应我们目标配置中的区域,如下如 9 p- e! a& U* I( [6 ]+ Z# u
7 O- v" R3 Z9 j: f7 D) e1 n7 M 内容要点 ①.Base Addr:存储地址 0x0800xxxxFLASH地址和0x2000xxxx内存RAM地址。 ②.Size:存储大小& {& F& e8 R8 L' _ ③.Type:类型9 m6 ?* d( s5 b/ g7 S8 T . J/ m' E3 A( t+ h Data:数据类型 Code:代码类型) [2 a$ F4 C5 J' R \# c Zero:未初始化变量类型9 s/ G2 G$ ^: N* D+ p1 f! b6 `9 J PAD:这个类型在map文件中放在这个位置,其实它不能算这里的类型。要翻译的话,只能说的“补充类型”。 ARM处理器是32位的,如果定义一个8位或者16位变量就会剩余一部分,这里就是指的“补充”的那部分,会发现后面的其他几个选项都没有对应的值。 6 Q/ a& q) n; h* ` ④.Attr:属性 RO:存储与ROM中的段; V q8 i% f8 Y; M/ E RW:存储与RAM中的段 ⑤.Section Name:段名 这里也可以说为入口分类名,与第一章节“Section Cross References”指的模块、段一样。: m [1 S2 w5 v8 b 大概包含:RESET、.ARM、 .text、 i、 .data、 .bss、 HEAP、 STACK等。 ⑥.Object:目标 5、Image component sizes:存储组成大小 & ?# R8 [! ~8 D
配置中需勾选上:Size Info, Y2 l; E k/ w+ E6 v; j Image component sizes:存储组成大小,其实主要就是对模块进行汇总存储大小信息。 " ~0 `' r5 A. @8 G: _3 L; b2 g 这一章节内容相信大家都能理解,我们编译工程后,在编译窗口一般会看到类似如下一段信息: : b* a* L, ^: G4 [. B6 c; s1 B Program Size: Code=908 RO-data=320 RW-data=0 ZI-data=1024 ' _3 n% a( V- M" m Code:指代码的大小; ( L- \" J2 V7 I/ ~$ b) r Ro-data:指除了内联数据(inline data)之外的常量数据; , B2 k+ N0 u% E4 O- o RW-data:指可读写(RW)、已初始化的变量数据;$ G5 ]0 O5 ?- _% ]8 z ZI-data:指未初始化(ZI)的变量数据; Code、Ro-data:位于FLASH中;+ C7 X* G: ^; i& G2 x% S* c2 u RW-data、ZI-data:位于RAM中; 提醒:RW-data已初始化的数据会存储在Flash中,上电会从FLASH搬移至RAM中。+ W& o8 u U7 H 关系如下: 1 R5 ?0 x/ Z. t. Q) A, R( P RO Size = Code + RO Data 7 U3 s. g# R, e RW Size = RW Data + ZI Data ROM Size = Code + RO Data + RW Data " ? y, E& D+ ~: y9 r |
【经验分享】STM32语音识别的智能蓝牙音箱(源程序+原理图+PCB+设计说明书+PPT)
想找个ST芯片
[GPIO] 使用新型抽象开始C++嵌入式编程,从GPIO开始
技术手册stm32f1xx中的一个小问题
【经验分享】STM32 HAL库移植FreeModbus详细步骤
【逢7发帖赢大礼】STM32开发之IC门禁卡UID读取方法!
实战经验 | Keil工程使用NEAI库的异常问题
经验分享 | FDCAN数据段波特率增加后发送失败的问题分析
STM32几种流行开发环境的优缺点
好用软件推荐-TouchGFX Designer
微信公众号
手机版