如何为Keil MDK-ARM和IAR制作通用链接脚本?求可用模板
通用链接脚本适配Keil MDK-ARM与IAR工具链的可行性及模板
可行性说明
完全可以实现通用链接脚本适配两款工具链,核心思路是利用工具链的预定义宏做条件分支编译。Keil MDK-ARM使用分散加载脚本(.sct),IAR使用链接配置文件(.icf),两者语法差异较大,但通过预编译指令可以在同一个文件中区分不同工具的逻辑,让脚本自动适配当前编译环境。
通用链接脚本模板示例
以下是一个简化的通用脚本模板,包含核心的内存分配、代码段/数据段映射逻辑:
; 通用链接脚本:同时兼容Keil与IAR ; 工具链预定义宏:Keil为__CC_ARM,IAR为__ICCARM__ #ifdef __CC_ARM ; ------------------- Keil MDK-ARM 分散加载脚本逻辑 ------------------- LR_IROM1 0x08000000 0x00080000 ; 起始地址0x08000000,大小512KB(Flash) { ER_IROM1 0x08000000 0x00080000 ; 代码段加载地址 { *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO) } RW_IRAM1 0x20000000 0x00010000 ; 数据段起始地址0x20000000,大小64KB(RAM) { .ANY (+RW +ZI) } } #endif #ifdef __ICCARM__ ; ------------------- IAR 链接配置文件逻辑 ------------------- /* 定义内存区域 */ define symbol __ICFEDIT_region_ROM_start__ = 0x08000000; define symbol __ICFEDIT_region_ROM_end__ = 0x0807FFFF; define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; define symbol __ICFEDIT_region_RAM_end__ = 0x2000FFFF; /* 设置内存区域 */ memory size ROM: origin = __ICFEDIT_region_ROM_start__, length = __ICFEDIT_region_ROM_end__ - __ICFEDIT_region_ROM_start__ + 1 memory size RAM: origin = __ICFEDIT_region_RAM_start__, length = __ICFEDIT_region_RAM_end__ - __ICFEDIT_region_RAM_start__ + 1 /* 映射段到内存 */ initialize by copy { readwrite }; place at address mem:__ICFEDIT_region_ROM_start__ { readonly section .intvec }; place in ROM { readonly }; place in RAM { readwrite, zeroinit }; #endif
使用注意事项
- 保存脚本时,Keil环境下需将文件后缀设为
.sct,IAR环境下设为.icf;或者在工具链配置中指定该文件为链接脚本,忽略后缀差异(部分版本支持)。 - 复杂项目中需根据实际硬件内存布局、自定义段需求,补充对应的映射逻辑,比如Bootloader分区、外设RAM分配等。
- 测试时需分别在两款工具链下编译验证,确保内存分配无冲突、程序运行正常。
内容的提问来源于stack exchange,提问作者Newton
相关产品推荐
相关产品推荐

