
STM32F103是意法半导体最早推出的cortex-m3内核的单片机,因为性价比高的原因至今应用都十分广泛。有幸参加社区的读书活动申请到一本《STM32库开发实战指南-基于STM32F103》书籍,可以帮助我更系统的学习这个单片机相关的知识,先简单地点评下书籍吧,全书由浅入深讲解地很细致,STM32F103开发大部分要用到的知识都讲解到了,特别是外设部分都会有分析功能框图,并详细讲解功能框图的每个部分的作用,对初学者很有帮助,稍显遗憾的是有些稍高级的外设如USB和CAN的知识没有涉及,希望有其它途径可以了解到火哥对该部分内容的精彩讲解。最近在学习ARM的分散加载原理,而书籍的第38章《MDK 的编译过程及文件类型全解》和第39章《在SRAM中调试代码》提供了非常详细的讲解,下面就结合读书心得和实验体会和大家分享下相关知识要点。 7 K2 U! @0 }7 G+ L' A. A一、CODE、RO、RW、ZI Data 域及堆栈空间 8 J" z& K$ K3 W5 ?8 {6 k3 {) S- \Keil工具编译后会把相同的内容归到一类域内,并且在最后会有一行:Program Size: Code=xxx RO-data=xxx RW-data=xxx ZI-data=xxx 的提示,这里 . @8 u% w% L2 U4 c5 aCode 代表执行的代码,程序中所有的函数都位于此处,存储到ROM区。 7 y+ m0 l: o0 u+ C& s/ I3 }7 ~3 v4 ORO-data 代表只读数据,程序中所定义的全局常量数据和字符串都位于此处。 : ]" w6 c% p0 j" hRW-data 代表已初始化的读写数据,程序中定义并且初始化的全局变量和静态变量位于此处。 4 _4 V8 R% t. U" o/ O mZI-data 代表未初始化的读写数据,程序中定义了但没有初始化的全局变量和静态变量位于此处,就是程序中用到的变量并且被系统初始化为0的变量的字节数,keil编译器默认是把你没有初始化的变量都赋值一个0,这些变量在程序运行时是保存在RAM中的,另外还包括栈空间Stack和堆空间Heap。 二、程序所需FLASH和RAM空间的计算 记住下面这张表就可以了:![]() ' W4 @( o4 x3 J) g) }0 V' Y. B 这里code很好理解是程序的代码,RO data可以理解为各种查表数据、全局常量数据和字符串等,一般也是放在FLASH上,ZI data就是无初始值的变量,RW data是有初始值的变量,这里特殊点FLASH和RAM上都分配有空间,FLASH上存储的是变量的初始值,上电初始化时是会拷贝到RAM空间。 三、MDK 工程的文件类型MDK工程的常见文件类型需要有个基本的了解,摘自书籍表38-3 MDK常见的文件类型(不分大小写)如下图示: ![]() ' V8 X9 v9 P% Q 四、Listing目录下的文件 / X0 X/ U& `# }0 v7 T Keil工具编译后在Listing目录下输出有*.map和*.lst文件,它们都是文本格式。 . e0 |. n2 @0 y& u6 @map文件里面内容大致分为五大类(按照map文件分类的顺序): 4 `. S: R! x+ y* d 1.Section Cross References:模块、段(入口)交叉引用;主要是各个源文件生成的模块之间相互引用的关系。 4 n4 X9 T! e$ E1 J$ R0 |. S 2.Removing Unused input sections from theimage:移除库中没有用到的模块,可减小程序的体积。 " h0 o0 m: h8 |4 G! G3.Image Symbol Table:映射符号表;列出了被引用的各个符号在存储器中的具体地址,占据的空间大小等信息。Symbols分为两大类:Local Symbols局部和Global Symbols全局。 * N2 V. J: G7 L' R; C4.Memory Map of the image:内存(映射)分布;包括ImageEntry point映射入口地址和各个加载域和执行域。 1 g/ z+ n6 V: u: i! h( d/ r7 B j& L. J/ d! n2 ^4 I 5.Image component sizes:存储组成大小。显示列出工程中所有用的.c文件所生成的.o目标文件中各成分(code \RO data \RW data \ZI data)大小,然后是工程所添加的库文件所占的各成分大小。 0 }# A; z9 _; V$ H3 J) B$ \: v- N; _6 a) W5 j/ n- S 五、sct分散加载文件的格式和应用 1. 什么时间用到分散加载文件:有时候用户希望将不同代码放在不同存储空间,也就是通过编译器生成的映像文件需要包含多个域,每个域在加载和运行时可以有不同的地址。要生成这样的映像文件,必须通过某种方式告知编译器相关的地址映射关系。KEIL是通过分散加载一个配置文件实现,这样的文件称为分散加载文件。 2. 分散加载文件的格式,主要由一个加载时域和多个运行时域组成,分散加载文件的整体结构和介绍直接内容稍多直接上书籍图片如下图示:![]() ![]() ![]() ! }$ @' N; v7 B2 S& G 另外百度文库上有篇文章《周立功单片机:分散加载文件浅释》可以参照学习,网址为: https://wenku.baidu.com/view/e77c57f1a26925c52dc5bf55.html 3. 如果不需要复杂的控制各个加载域和执行域,直接在MDK界面进行配置后由软件生成分散加载文件比较方便,也不容易出错,网上查“在RAM中调试STM32程序的配置方法”大都是通过MDK界面配置生成分散加载文件,有兴趣的同学可以自行百度下。 最后感谢下野火电子和ST社区的赠书!) }$ S7 Y$ Q- ?: U& K/ u& V% y' X / I# u, d% a& ?6 B( S0 O |
谢谢分享 有实际操作就更好啦 |
不错 |