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

STM32库开发实战指南--基于STM32F103读书感悟

[复制链接]
kysoc 发布时间:2018-12-20 19:53
/ f: ]. {  N2 s6 B  N
       STM32F103是意法半导体最早推出的cortex-m3内核的单片机,因为性价比高的原因至今应用都十分广泛。有幸参加社区的读书活动申请到一本《STM32库开发实战指南-基于STM32F103》书籍,可以帮助我更系统的学习这个单片机相关的知识,先简单地点评下书籍吧,全书由浅入深讲解地很细致,STM32F103开发大部分要用到的知识都讲解到了,特别是外设部分都会有分析功能框图,并详细讲解功能框图的每个部分的作用,对初学者很有帮助,稍显遗憾的是有些稍高级的外设如USBCAN的知识没有涉及,希望有其它途径可以了解到火哥对该部分内容的精彩讲解。最近在学习ARM的分散加载原理,而书籍的第38章《MDK 的编译过程及文件类型全解》和第39章《在SRAM中调试代码》提供了非常详细的讲解,下面就结合读书心得和实验体会和大家分享下相关知识要点。
, {' C9 B  Y( r8 D  d
一、CODERORWZI Data 域及堆栈空间
! ?( }- H  K+ t3 I1 p- f6 H
Keil工具编译后会把相同的内容归到一类域内,并且在最后会有一行:Program Size: Code=xxx RO-data=xxx  RW-data=xxx  ZI-data=xxx 的提示,这里

; U- d, f9 z6 |* a
Code 代表执行的代码,程序中所有的函数都位于此处,存储到ROM区。
( I+ w. a& H4 f( [9 n
RO-data 代表只读数据,程序中所定义的全局常量数据和字符串都位于此处。

4 Z3 W0 f6 y9 s- N# y/ B
RW-data 代表已初始化的读写数据,程序中定义并且初始化的全局变量和静态变量位于此处。

$ o, C: Q+ s' G; D. {' s( R
ZI-data 代表未初始化的读写数据,程序中定义了但没有初始化的全局变量和静态变量位于此处,就是程序中用到的变量并且被系统初始化为0的变量的字节数,keil编译器默认是把你没有初始化的变量都赋值一个0,这些变量在程序运行时是保存在RAM中的,另外还包括栈空间Stack和堆空间Heap

6 \" q: E( c1 U& ]3 R; Q1 P7 h
二、程序所需FLASHRAM空间的计算
记住下面这张表就可以了:
/ ?3 C+ ?0 }. E! } 10.jpg ( y. d2 L1 T, C
+ p: I7 T: Q& ?8 I( h# ^
这里code很好理解是程序的代码,RO data可以理解为各种查表数据、全局常量数据和字符串等,一般也是放在FLASH上,ZI data就是无初始值的变量,RW data是有初始值的变量,这里特殊点FLASHRAM上都分配有空间,FLASH上存储的是变量的初始值,上电初始化时是会拷贝到RAM空间。
3 S& x/ ?% w: X; Z- a1 H
三、MDK 工程的文件类型MDK工程的常见文件类型需要有个基本的了解,摘自书籍表38-3 MDK常见的文件类型(不分大小写)如下图示:

% b. T& r% V# a- s 11.jpg
2 J9 K& Z" y8 g% k8 r2 p! s9 ]
! ~4 m  E5 H) c5 P
) G$ f8 F6 Q5 j& u$ a8 f
四、Listing目录下的文件
; O- `2 B3 y2 Y) R# m1 o/ I

9 Z- R& h! ^, Y: j
Keil工具编译后在Listing目录下输出有*.map*.lst文件,它们都是文本格式。

) A' Z, w# u1 `6 L

7 ^! P, i. f: k, p' S* J
map文件里面内容大致分为五大类(按照map文件分类的顺序):
& C* m) Y5 L2 r- Z: `6 ^
- `- p6 U9 K6 R: w! t/ `
1.Section Cross References:模块、段(入口)交叉引用;主要是各个源文件生成的模块之间相互引用的关系。
9 j, H' I. B. k0 A- w; E

9 @, L0 u! P* \. h# G" h1 U
2.Removing Unused input sections from theimage:移除库中没有用到的模块,可减小程序的体积。
2 v6 h' p$ h/ b- x; X

. ^. b; l) p( K' ^% q
3.Image Symbol Table:映射符号表;列出了被引用的各个符号在存储器中的具体地址,占据的空间大小等信息。Symbols分为两大类:Local Symbols局部和Global Symbols全局。

. c$ R4 m) g6 }% C; s
1 ?+ c7 b, b" a
4.Memory Map of the image:内存(映射)分布;包括ImageEntry point映射入口地址和各个加载域和执行域。

  `) b3 e- p  w2 O( X# c
+ ?- J/ V# ?7 @4 }: {
5.Image component sizes:存储组成大小。显示列出工程中所有用的.c文件所生成的.o目标文件中各成分(code \RO data \RW data \ZI data)大小,然后是工程所添加的库文件所占的各成分大小。

9 @# x: E7 e3 T+ N2 U1 X

; p1 M+ P( p' t1 g% z) A+ }+ W
五、sct分散加载文件的格式和应用
2 C9 n/ [& Y& `" u% I

7 B3 Q6 k" \! c" s. R5 M$ t
1. 什么时间用到分散加载文件:有时候用户希望将不同代码放在不同存储空间,也就是通过编译器生成的映像文件需要包含多个域,每个域在加载和运行时可以有不同的地址。要生成这样的映像文件,必须通过某种方式告知编译器相关的地址映射关系。KEIL是通过分散加载一个配置文件实现,这样的文件称为分散加载文件。
2. 分散加载文件的格式,主要由一个加载时域和多个运行时域组成,分散加载文件的整体结构和介绍直接内容稍多直接上书籍图片如下图示:6 L6 U) J8 n! ]! V1 ]" g" V: Q0 z
12.jpg
3 T) h- m6 }5 V' r9 R 13.jpg
( U8 \) a7 |+ s) a1 ^, l  R9 H! ^6 Q$ f 14.jpg 3 z  w3 b5 I; F- `
9 x0 T. Z- g4 ]  ?1 h* N
' g/ ^3 B! o$ [! L# r- o* k
另外百度文库上有篇文章《周立功单片机:分散加载文件浅释》可以参照学习,网址为:

6 U8 x6 v) K6 {; _5 N* ~
- v& ]$ E' H+ \" P! U
https://wenku.baidu.com/view/e77c57f1a26925c52dc5bf55.html
4 R; k/ W9 N+ F2 b
* K# \1 H7 ^" k' O6 Y$ v
3. 如果不需要复杂的控制各个加载域和执行域,直接在MDK界面进行配置后由软件生成分散加载文件比较方便,也不容易出错,网上查“在RAM中调试STM32程序的配置方法”大都是通过MDK界面配置生成分散加载文件,有兴趣的同学可以自行百度下。
最后感谢下野火电子和ST社区的赠书!4 O% ?1 i: ?. b( S! t
9 o8 Z( {* Z: U' N5 r1 V+ f

4 e8 Y  A/ i/ x  s/ S

# _9 _; E( V! `9 O2 p2 z) J
收藏 1 评论2 发布时间:2018-12-20 19:53

举报

2个回答
STMCU-管管 回答时间:2018-12-21 09:24:48
谢谢分享  有实际操作就更好啦
Kevin_G 回答时间:2018-12-21 11:30:38
不错
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版