swm341s map文件和sct文件解析
总是有点儿记不住sct文件和map文件中的一些数据代表的意义
在此进行一下记录,方便后续翻阅
1 sct 文件是 Keil MDK 的 分散加载文件(Scatter-Loading Description File),用于定义程序在目标系统中的内存布局。文件分为两个主要的 加载区域(Load Region) 和多个 执行区域(Execution Region),每个区域指定了代码、数据的加载地址和执行地址。
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************LR_IROM1 0x00000000 0x00080000 { ; load region size_regionER_IROM1 0x00000000 0x00080000 { ; load address = execution address*.o (RESET, +First)*(InRoot$$Sections).ANY (+RO).ANY (+XO)}RW_IRAM1 0x20000000 0x00010000 { ; RW data.ANY (+RW +ZI)}ER_SDRAM1 0x80000000 0x00400000 { ; execution address*(.SDRAM1)}
}LR_SPIFLASH 0x70000000 0x01000000 { ; load region size_regionER_SDRAM2 0x80400000 0x00400000 { ; execution address*(.SDRAM2)}
}
LR_IROM1(加载区域 1)
起始地址:0x00000000
大小:0x00080000(512 KB)
用途:通常用于存储程序的 只读代码和常量(如 Flash 存储器)。
LR_SPIFLASH(加载区域 2)
起始地址:0x70000000
大小:0x01000000(16 MB)
用途:可能用于存储外部 SPI Flash 中的数据(例如用户配置、固件备份等)
- 执行区域(Execution Region)
每个加载区域下包含一个或多个执行区域,定义程序运行时的内存布局。
(1) ER_IROM1(执行区域 1)
加载地址 = 执行地址:0x00000000(与 LR_IROM1 一致)
内容
*.o (RESET, +First) // 中断向量表(复位向量)放在首地址
*(InRoot$$Sections) // ARM 库的初始化代码(如 RW 数据复制到 RAM)
.ANY (+RO) // 所有只读代码(RO: Read-Only)和常量
.ANY (+XO) // 可执行代码(XO: eXecutable Only)
作用:
将程序的 启动代码(复位向量)、只读代码(如 C 语言的 const 变量) 和 可执行代码 放置在 Flash 中运行。
+XO 通常用于需要直接从 Flash 执行的代码
(2) RW_IRAM1(执行区域 2)
执行地址:0x20000000
大小:0x00010000(64 KB)
内容:
.ANY (+RW +ZI) // 可读写数据(RW)和未初始化数据(ZI)
作用:
存放 全局/静态变量(已初始化和未初始化)。
在程序启动时,ARM 库的 __main 函数会将 Flash 中的 RW 数据复制到 SRAM,并初始化 ZI 数据为 0。
(3) ER_SDRAM1(执行区域 3)
执行地址:0x80000000(外部 SDRAM 或外部存储器)
内容:
作用:
*(.SDRAM1) // 用户自定义段(SDRAM1)中的代码
将特定代码段(如性能敏感的函数)加载到 外部 SDRAM 中运行。
适用于需要 高速访问 的场景(如图像处理、实时控制算法)。
(4) ER_SDRAM2(执行区域 4)
加载地址:0x70000000(SPI Flash)
执行地址:0x80400000(外部 SDRAM)
内容:
*(.SDRAM2) // 用户自定义段(SDRAM2)中的代码
作用:
将 SPI Flash 中的数据加载到 SDRAM 中运行。
适用于 存储空间不足 的场景(如从 SPI Flash 加载大体积数据到 SDRAM 中执行)。
下面是编译完的map文件的部分数据
Execution Region ER_SDRAM1 (Exec base: 0x80000000, Load base: 0x000610c0, Size: 0x000ff800, Max: 0x00400000, ABSOLUTE, COMPRESSED[0x00002014])Exec Addr Load Addr Size Type Attr Idx E Section Name Object0x80000000 COMPRESSED 0x0007f800 Data RW 1434 .SDRAM1 lv_port_disp1.o0x8007f800 COMPRESSED 0x00080000 Data RW 5550 .SDRAM1 lv_mem.oLoad Region LR_SPIFLASH (Base: 0x70000000, Size: 0x00062fa8, Max: 0x01000000, ABSOLUTE)Execution Region ER_SDRAM2 (Exec base: 0x80400000, Load base: 0x70000000, Size: 0x00062fa8, Max: 0x00400000, ABSOLUTE)----------------------------------------------------------------------Code (inc. data) RO Data RW Data ZI Data Debug Library Name11040 352 551 0 96 6492 c_w.l3956 264 16 0 0 4636 fz_wm.l4452 396 144 0 0 2400 m_wm.l----------------------------------------------------------------------19494 1012 720 0 96 13528 Library Totals----------------------------------------------------------------------==============================================================================Code (inc. data) RO Data RW Data ZI Data Debug 366200 2026 436432 1046796 53828 1995063 Grand Totals366200 2026 436432 8480 53828 1995063 ELF Image Totals (compressed)366200 2026 436432 8480 0 0 ROM Totals==============================================================================Total RO Size (Code + RO Data) 802632 ( 783.82kB)Total RW Size (RW Data + ZI Data) 1100624 (1074.83kB)Total ROM Size (Code + RO Data + RW Data) 811112 ( 792.10kB)
Grand Totals(总和)
ELF Image Totals(压缩后的 ELF 文件)
ROM Totals(实际烧录到 Flash 的数据)
- Flash占用情况
Flash的总占用由ROM Totals给出,包括代码、只读数据和RW Data的初始值:
ROM Totals(映射文件末尾):
Total ROM Size (Code + RO Data + RW Data) = 811112 bytes (约792.10 KB)
此值直接表示Flash的总占用,覆盖所有加载区域(LR_IROM1和LR_SPIFLASH)。
具体分布:
LR_IROM1(基址0x00000000,大小512KB): 存储代码、RO Data及ER_SDRAM1的压缩初始值(8212 bytes)。
LR_SPIFLASH(基址0x70000000,大小16MB): 存储ER_SDRAM2的加载数据(404392 bytes)。
验证:映射文件中Load Region LR_SPIFLASH的大小为0x00062fa8(404392 bytes),而ER_SDRAM1的加载大小(压缩后)为0x00002014(8212 bytes)。结合全局ROM Totals,总Flash占用一致。
结论:Flash占用 = 811112 bytes (792.10 KB)。
- SRAM占用情况(内部RAM)
SRAM对应RW_IRAM1区域(基址0x20000000,大小64KB),存储运行时RW Data和ZI Data。占用计算基于:
全局数据摘要(映射文件):
RW Data = 1046796 bytes(已初始化数据)
ZI Data = 53828 bytes(未初始化数据)
Total RW + ZI = 1100624 bytes (约1074.83 KB)。
但此总值分布在多个区域:
ER_SDRAM1(SDRAM)占用大部分RW Data(1046528 bytes)。
剩余RW Data和全部ZI Data存储在RW_IRAM1和可能的其他区域。
计算SRAM占用:
ER_SDRAM1的RW Data占用:0x000ff800 = 1046528 bytes。
剩余RW Data:1046796 - 1046528 = 268 bytes。
全部ZI Data:53828 bytes。
SRAM总占用 = 剩余RW Data + ZI Data = 268 + 53828 = 54096 bytes (约52.83 KB)。
验证:RW_IRAM1区域大小为64KB(65536 bytes),54096 bytes在此范围内,合理。
结论:SRAM占用 = 54096 bytes (52.83 KB)。
- SDRAM占用情况(外部RAM)
SDRAM对应两个执行区域:
ER_SDRAM1(基址0x80000000,大小4MB): 存储RW Data(类型Data RW)。
ER_SDRAM2(基址0x80400000,大小4MB): 存储自定义段.SDRAM2,映射文件未明确类型,但基于SCT和大小分析,它存储代码或RO Data(非RW/ZI)。
占用计算:
ER_SDRAM1运行时大小:0x000ff800 = 1046528 bytes (约1021.99 KB),全部为RW Data。
ER_SDRAM2运行时大小:0x00062fa8 = 404392 bytes (约394.91 KB),根据全局摘要(Code + RO Data = 802632 bytes)和分布,此区域存储代码或RO Data(占用SDRAM空间但不算在RW/ZI内)。
SDRAM总占用 = ER_SDRAM1 + ER_SDRAM2 = 1046528 + 404392 = 1450920 bytes (约1416.90 KB)。
结论:SDRAM占用 = 1450920 bytes (1416.90 KB),其中:
ER_SDRAM1:1046528 bytes(RW Data)。
ER_SDRAM2:404392 bytes(代码或RO Data)。