STM32-MAP
文件中固件大小说明
一般在
stm32
工程使用
keil
编译之后,
keil
的
build output
栏目下面会出现如图所示的输出信息,
其中
会显示
code
大小
RO-data
、
RW-data
、
ZI-data
的大小。一般别人不怎么会在意这个的大小。
ARM
程序的组成
此处所说的
“ARM
程序
”
是指在
ARM
系统中正在执行的程序,而非保存在
ROM
中的
bin
映像(
image
)
文件,这一点清注意区别。
一个
ARM
程序包含
3
部分:
RO
,
RW
和
ZI
。
RO
是程序中的指令和常量;
RW
是程序中的已初始化变量
;ZI
是程序中的未初始化的变量
.
由以上
3
点说明可以理解为:
RO
就是
readonly
,
RW
就是
read/write
,
ZI
就是
zero
ARM
映像文件的组成
所谓
ARM
映像文件就是指烧录到
ROM
中的
bin
文件,也称为
image
文件。以下用
Image
文件来称呼
它。
Image
文件包含了
RO
和
RW
数据。之所以
Image
文件不包含
ZI
数据,是因为
ZI
数据都是
0
,没必要包
含,只要程序运行之前将
ZI
数据所在的区域一律清零即可。包含进去反而浪费存储空间。
Q
:为什么
Image
中必须包含
RO
和
RW
?
A
:因为
RO
中的指令和常量以及
RW
中初始化过的变量是不能像
ZI
那样
“
无中生有
”
的。
ARM
程序的执行过程
从以上两点可以知道,烧录到
ROM
中的
image
文件与实际运行时的
ARM
程序之间并不是完全一样的。因
此就有必要了解
ARM
程序是如何从
ROM
中的
image
到达实际运行状态的。
实际上,
RO
中的指令至少应该有这样的功能:
1.
将
RW
从
ROM
中搬到
RAM
中,因为
RW
是变量,变量不能存在
ROM
中。
2.
将
ZI
所在的
RAM
区域全部清零,因为
ZI
区域并不在
Image
中,所以需要程序根据编译器给出的
ZI
地址及大小来将相应得
RAM
区域清零。
ZI
中也是变量,同理:变量不能存在
ROM
中
在程序运行的最初阶段,
RO
中的指令完成了这两项工作后
C
程序才能正常访问变量。
否则只能运行不含变
量的代码。