hb3196276564 发表于 2019-7-17 15:49:58

关于RW-DATA在ROM中被写flash操作改动的问题

在使用keil开发STM32应用程序时,点击Build后在Build Output窗口中经常会有如下信息:


[*]图中几个参数分别代表

[*]Code:代码的大小
[*]RO:常量所占空间
[*]RW:程序中已经初始化的变量所占空间
[*]ZI:未初始化的static变量和全局变量以及堆栈所占的空间

[*]上述参数和芯片Flash以及SRAM的对应关系是

[*]Flash占用大小=Code+RO+RW
[*]SRAM占用大小=RW+ZI
RW参数同时参与了Flash和SRAM占用量的计算,这是因为Flash部分的属性是Read-Only的,而SRAM虽然是Read-Write但里面数据不能掉电保存,所以只能把已经初始化的值保存到ROM里,上电后再拷贝到SRAM中进行读写操作,即两部分都需要留出RW变量所占用的空间。

如图:



结合上图说下STM32的启动过程(采用Cortex-M4、Cortex-M3内核的芯片基本都是这个过程):上电后首先从 0x00000000(映射到0x08000000,这里只考虑从内部Flash启动)处获得中断向量表,然后在运行用户代码之前会在标号2处有一段引导代码负责把存在Flash中的初始化变量的值Copy到SRAM中对应的变量位置(标号3),之后把ZI区全部清零(标号4),之后才正式开始运行用户代码(标号5)。
所以RW-DATA的数据上电运行后会被Copy到RAM里。
*************************************************************************************************************************************************************************
然后我的问题是:如果程序运行过程中,我操作写flash,并且是在原RW-DATA的内存地址上写了新的数据,那岂不是原来的RW-DATA数据就会被清除,下次上电启动程序时,程序是否会启动失败?(我实际上写的程序运行过程中没有问题,即使重新上电运行,所以很迷茫这个问题,希望有人帮忙解答一下疑问)
*************************************************************************************************************************************************************************

zhouyuanzhi 发表于 2019-7-17 21:01:57

111111

Kevin201707 发表于 2019-7-19 10:17:55

变量、函数、程序 地址分配是在编译时就已经分配好了,如果你的变量用到SRAM指定地址,这部分SRAM在编译时就会特定分配。

wenyangzeng 发表于 2019-7-19 15:30:07

楼主所述的:
“Flash占用大小=Code+RO+RW”一句

既然RW是变量,那么Flash大小就不可能包括RW,RW应该在SRAM中才是。

hb3196276564 发表于 2019-7-20 14:46:19

wenyangzeng 发表于 2019-7-19 15:30
楼主所述的:
“Flash占用大小=Code+RO+RW”一句



断电SRAM是不能保存数据的,所以RW-DATA保存在flash中,上电启动过程会被copy到SRAM中,供程序调用。

hb3196276564 发表于 2019-7-20 14:47:22

Kevin201707 发表于 2019-7-19 10:17
变量、函数、程序 地址分配是在编译时就已经分配好了,如果你的变量用到SRAM指定地址,这部分SRAM在编译时 ...

但是断电的时候,RW是保存在flash中的,启动才被copy到SRAM的。
页: [1]
查看完整版本: 关于RW-DATA在ROM中被写flash操作改动的问题