Keil MDK系列:(四)SCT文件编写教程
LR_IROM1 0x08000000 0x00100000 {ER_IROM1 0x08000000 0x00100000 {*.o (RESET, +First) // 特定 .o 文件中的 RESET 段优先*(InRoot$$Sections) // 某些系统段(如向量表等).ANY (+RO) // 所有输入段中的 RO(只读)内容}RW_IRAM1 0x20000000 0x00010000 {.ANY (+RW +ZI) // 所有输入段中的 RW(读写)和 ZI(零初始化)内容}MY_RAM_SECTION (NOLOAD) 0x20004000 0x00000200 : {*(.my_ram_section) // 选择所有输入目标文件中 .my_ram_section 段的内容}
}
作用目标
适用场景
.ANY
表示“任意输入模块(.o 文件)中的匹配段”
用于选择 所有输入目标文件中的某类段(如 +RO、+RW、+ZI)
用于 收集默认的、未特别分组的代码/数据段,比如把所有未指定的 .text、.data、.bss放到指定区域
*(.my_ram_section)
表示“任意输入模块中的 名为 .my_ram_section的段”
用于选择 所有输入目标文件中,段名恰好是 .my_ram_section的内容
用于 精确控制某个自定义段(比如你用 attribute((section(“.my_ram_section”)))定义的变量)放到某个固定地址
为什么不能写成 .ANY(.my_ram_section)?
.ANY是一个“匹配任意输入模块”的伪目标,它后面只能跟 段类型标志,比如:
+RO(只读段)
+RW(读写段)
+ZI(零初始化段)
它 不能后跟具体的段名,比如 .my_ram_section
Keil 的 scatter 文件语法中,没有 .ANY(section_name)这种组合写法
如果你想要匹配 某个具体的段名,比如 .my_ram_section,那么你必须使用:
*(.my_ram_section)
这是 标准的、被支持的写法,无论是 GCC/Clang 还是 Keil 的 LD 都理解这种语法。
attribute((section(“.ARM.__at_0x000383FC”))) const uint32_t CHECKSUM = 0x55AA;