You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 06:32:15