不知道你们有没有见过这个设置,下面这个RAM和ROM的设置是什么意思?这个东西的名字叫分散加载。
Scatter-Loading 描述文件是一种用于描述嵌入式系统中代码和数据在内存中的布局方式的文件。它告诉链接器如何将编译生成的目标文件中的代码和数据段分配到不同的内存区域。
CW32L010F8
RAM
CW32有4KB
从下面开始写起
这个加载文件需要在这里打开
只读存储器(ROM) 和 随机存取存储器(RAM)。ROM就是flash的大小
还有这个
其实还有个文件做分散加载:
这里面Flash以及SRAM的地址以及大小都是可以修改的,其他的也可以修改,但起始地址以及大小都要在芯片真实存在的有效物理地址上,这部分需要参看芯片的用户手册里面的Memory MAP一节的内容,
如下图是一个MCU的Memory MAP,参看分散加载里面的地址,Flash以及SRAM的起始地址以及大小都落在有效的空间上了。
这个地址是和上面的文件对应的
举个例子:
两段
<1>分散加载的根本功能是指定程序在存储空间上面的存储分配以及运行空间的分配,所有要有加载域和运行域来分别指定程序存储空间以及程序运行空间。一般来说程序的运行空间是在芯片的ROM类存储器里面,在Cortex-M里面基本就是芯片内部的Flash空间; <2>运行域就有意思了,由于MCU内部的Flash(几乎都是Nor-Flash)是可以运行代码的,但是不能用于变量也就是RW与ZI的加载,主要原因是变量需要经常修改,几个小时就可能连续改变几十万次,但是目前Flash工艺的写寿命介于10万次~100万次之间,如果把RW和ZI放在Flash上,那就是灾难,Flash会因为写次数的限制很快就会挂掉,而且Flash只能按块操作,开销太大,所以一般都是放到SRAM里面。所以你会看到在这个例子里面,运行域分成两个部分,RO数据段放在内部Flash里面,RW与ZI放到片内SRAM中去执行。这点与电脑是不同的,电脑的硬盘是完全不能执行程序的,所以如果你把电脑看成MCU的话,用Keil来编写程序的话,那么电脑的RO、RW、ZI段都是放到内存上执行的,也就是说电脑实际上只有一个执行域就在内存上,可以类似理解为MCU的片内SRAM上。 <3>所以分散加载可以简单理解为的最基本结构就是至少3个域(这个事实上不对,但是对于大多数Cortex-M系列MCU的分散加载可以这样简单理解):至少一个加载域、建议两个运行域(一个RO运行域、一个RW+ZI运行域),就是你要告诉链接器至少3个信息:即:从哪里加载程序(至少一个域)、在哪里运行程序(至少一个域)、在哪里读写程序运行中用到的变量(至少一个域,实际上也可以跟运行程序的域在一起,但强烈建议分开)。- 加载域(LR):指定代码和数据在内存中的初始加载地址和大小。
- 运行域(ER):指定代码和数据在执行时的运行地址和大小。
映像文件可以分为加载域(Load Region)和运行域(Execution Region):加载域反映了 ARM 可 执行映像文件的各个段存放在存储器中的位置关系。运行域反映了 ARM 可执行映像文件各个段真正执行时在存储器中的位置关系:简单的说,加载域就是程序在 Flash 中的实际存储,而运行域是芯片上电后的运行状态。通过上面的框图可以看出,RW 区也是要存储到 ROM/Flash 里面的,在执行映像之前,必须将已初始化 的 RW 数据从 ROM 中复制到 RAM 中的执行地址并创建 ZI Section(初始化为 0 的变量区)。如果你自己编写分散加载文件,先把这把这3个结构写出来,看个文件: LR_IROM1就是【加载域】,指定了用户程序存储在0x00000000起始大小为0x80000的地址上,用户程序从这个区域内加载; ER_IROM1就是【运行域】,是RO的运行域,因为MCU内部的Flash可以运行代码,所以用户代码可以从这个区域内运行; RW_IRAM1就是【运行域】,是RW+ZI的运行域,这里指向的是片内SRAM的地址。