散列加载描述文件
散列加载描述文件(Scatter-Loading Description File),通常用于嵌入式系统开发中,特别是使用ARM工具链(如Keil uVision)时。这个文件定义了如何将程序的不同部分(如代码和数据)映射到内存中的不同区域。它帮助链接器了解如何组织和放置生成的二进制文件中的各个段。
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************
LR_IROM1 0x00000000 0x00200000 { ; load region size_region
ER_IROM1 0x00000000 0x00200000 { ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
.ANY (+XO)
}
RW_IRAM1 0x20000000 0x00008000 { ; RW data
.ANY (+RW +ZI)
*.o (.RAMCode)
}
}
主要组成部分
1、Load Region (LR_IROM1):
LR_IROM1 0x00000000 0x00200000: 定义了一个名为 LR_IROM1 的加载区域(load region),其基地址为 0x00000000,大小为 0x00200000(即2MB)。这个区域通常对应于片上Flash存储器。
2、Execution Region (ER_IROM1):
ER_IROM1 0x00000000 0x00200000: 定义了一个名为 ER_IROM1 的执行区域(execution region),其基地址和大小与 LR_IROM1 相同。这意味着加载地址和执行地址是相同的。
*.o (RESET, +First): 将所有目标文件(.o)中的 RESET 段放在最前面。通常包含复位向量表和其他初始化代码。
*(InRoot$$Sections): 包含在根段中的所有部分(通常是启动代码和初始化代码)。
.ANY (+RO): 包含所有只读(Read-Only, RO)数据段。
.ANY (+XO): 包含所有可执行(Executable-Only, XO)代码段。
3、Execution Region (RW_IRAM1):
RW_IRAM1 0x20000000 0x00008000: 定义了一个名为 RW_IRAM1 的执行区域,其基地址为 0x20000000,大小为 0x00008000(即32KB)。这个区域通常对应于片上SRAM存储器。
.ANY (+RW +ZI): 包含所有读写(Read-Write, RW)数据段和零初始化(Zero Initialized, ZI)数据段。
*.o (.RAMCode): 包含特定目标文件中的 .RAMCode 段(如果有的话),这些代码通常需要在运行时驻留在RAM中。
具体解释
LR_IROM1 和 ER_IROM1:
这些区域通常用于存储程序的代码和只读数据(如常量、字符串等)。它们被加载到Flash中,并且在执行时也从Flash中读取。
RW_IRAM1:
这个区域用于存储程序的读写数据(变量、动态分配的内存等)以及零初始化的数据。这些数据被加载到SRAM中,并且在程序执行期间可以进行读写操作。
实际用途
代码和数据分离:
通过这种方式,可以将代码和数据分别放置在不同的存储器区域(Flash和SRAM),从而优化性能和资源使用。
初始化过程:
复位向量表和启动代码通常位于Flash中,并且在系统复位后首先被执行。这确保了系统能够正确地初始化硬件并进入主程序。
运行时数据管理:
读写数据和零初始化数据被放置在SRAM中,这样可以在程序运行期间高效地访问和修改这些数据。
总结
这个散列加载描述文件定义了如何将程序的不同部分映射到嵌入式系统的内存中。它确保了代码和数据被正确地加载到Flash和SRAM中,并且在系统启动时能够按照预期执行。这种配置对于嵌入式系统开发至关重要,因为它直接影响到系统的初始化和运行时行为。