手把手教你认识 Keil MDK分散加载文件

strongerHuang 2025-11-21 12:15

来源 | MultiMCU EDU

 

科技前沿最新资讯:可能很多小伙伴都没有研究过Keil MDK分散加载文件,今天就来给大家简单讲述一下。

Keil MDK 分散加载文件

以 i.MX RT1052 的 Keil MDK 链接文件为例,用直接写地址的方式把链接文件内容重写一遍,如下:

#if defined(XIP_BOOT_HEADER_ENABLE) && (XIP_BOOT_HEADER_ENABLE == 1)LR_m_text 0x60000000 0x60002400+0x00FFDC00-0x60000000 {    ; 16MB 加载时域  RW_m_config_text 0x60000000 FIXED 0x00001000 {           ; 分配 4KB 加载 .boot_hdr.conf    * (.boot_hdr.conf, +FIRST)                             ; FIXED 表示“固定地址”,加载地址和执行地址相同  }                                                        ; 基址 0x60000000 必需是绝对地址
  RW_m_ivt_text 0x60001000 FIXED 0x00001000 {              ; 再分配 4KB 加载     * (.boot_hdr.ivt, +FIRST)                              ; .boot_hdr.ivt, 用 FIRST 指定将其放在执行区域的起始位置    * (.boot_hdr.boot_data)                                ; .boot_hdr.boot_data    * (.boot_hdr.dcd_data)                                 ; .boot_hdr.dcd_data  }#elseLR_m_text 0x60002000 0x60002400+0x00FFDC00-0x60002000 {    ; 加载时域,让出 16MB 起始的 8KB#endif  VECTOR_ROM 0x60002000 FIXED 0x00000400 {                 ; 分配 1KB 加载 RESET(RESET 是在汇编中定义的段名)    * (RESET,+FIRST)                                       ; FIRST 用于指定 RESET 段放在起始位置  }  ER_m_text 0x60002400 FIXED 0x00FFDC00 {                  ; FIXED 表示“固定地址”,加载地址和执行地址相同    * (InRoot$$Sections)                                   ; InRoot$$Sections 指定根区    .ANY (+RO)                                             ; 加载所只读属性数据,包含:Code, RW-Data, RO-Data  }  RW_m_data 0x20000000 0x00020000-Stack_Size-Heap_Size {   ; 在 DTCM 中除去堆和栈占用的空间    .ANY (+RW)                                             ; 加载所有 RW 数据  }   ZI_m_data 0x80000000 0x01E00000{                         ; 30MB 运行时域    .ANY (+ZI)                                             ; 加载所有 ZI 数据  }  RW_m_ncache 0x81E00000 0x00200000 {                      ; 2MB 运行时域    * (NonCacheable.init)                                  ; 在总共 32MB 的 SRAM 中单独加载    * (NonCacheable)                                       ; NonCacheable.init, NonCacheable    *(m_usb_dma_init_data)                                 ; m_usb_dma_init_data    *(m_usb_dma_noninit_data)                              ; m_usb_dma_noninit_data  }  Fast_m_data 0x00000000 0x00020000{                       ; 128KB ITCM 运行时域    * (CodeQuickAccess)                                    ; 加载 CodeQuickAccess    * (DataQuickAccess)                                    ; 加载 DataQuickAccess  }  ARM_LIB_HEAP +0 EMPTY Heap_Size {                        ; 紧接前一运行时域,加载 Heap_Size  }                                                        ; EMPTY 表示空白内存  ARM_LIB_STACK 0x20000000+0x00020000 EMPTY -Stack_Size {  ; 128KB DTCM 顶端开始向下 Stack_Size  }                                                        ; 开辟栈空间}

上面的文件定义的两种内存分配方式,一种方式如下图所示:

科技前沿最新资讯:手把手教你认识 Keil MDK分散加载文件

另一种方式如下图所示:

科技前沿最新资讯:手把手教你认识 Keil MDK分散加载文件图2

对于 0x60000000 这个 Flash 起始地址,官方文档《IMXRT1050RM》上是这么写的:

科技前沿最新资讯:手把手教你认识 Keil MDK分散加载文件图3

ITCM、DTCM 和 OCRAM

在 i.MX RT1052 上 ITCM、DTCM 和 OCRAM 共享 512KB 的 FlexRAM,因此上面的图中才可以把 Heap 放在 ITCM 上,却在 DTCM 上让出了 Heap 的位置。在 《IMXRT1050RM》 上可以查到:

科技前沿最新资讯:手把手教你认识 Keil MDK分散加载文件图4
科技前沿最新资讯:手把手教你认识 Keil MDK分散加载文件图5

各个域中的符号在哪定义

在链接脚本中用到的 .boot_hdr.confRESET 之类的符号名在汇编和 c 的源文件中有定义,如下图:

科技前沿最新资讯:手把手教你认识 Keil MDK分散加载文件图6
手把手教你认识 Keil MDK分散加载文件图7

域名称对源文件的作用

关于什么是“域”,在周立功 《分散加载/分散加载文件浅释.pdf》 中有述。

不只是链接脚本里会用到源文件里定义的符号,反过来汇编源文件也会用到链接脚本里定义的符号,如下图:

科技前沿最新资讯:手把手教你认识 Keil MDK分散加载文件图8

代码拷贝

这里把周立功 《分散加载/分散加载文件浅释.pdf》 中的要点提出来:

1、第一个运行时域存放的代码不会进行额外拷贝

2、规定其余运行时域中存放的代码均会被拷贝

3、第一个运行时域的基地址必须与加载域基地址相同

InRoot$$Sections

关于 InRoot$$Sections 在 《KEIL MDK 分散加载示例2-代码加载到片内SRAM中运行&部分规则》 中有详细解说。

声明:内容取材于网络,仅代表作者观点,如有内容违规问题,请联系处理。 
more
2025年中国有机酱油行业深度研究报告:行业进入壁垒、竞争格局及战略咨询
2025年中国冲锋衣裤行业深度研究报告:行业进入壁垒、竞争格局及战略咨询
协作机器人行业发展趋势(附行业发展历程、重点企业分析、市场竞争格局分析及市场前景预测)智研咨询
亮点抢先看 | 集邦咨询MTS2026存储产业趋势研讨会报名火热进行中!
飞猫品牌获艾瑞咨询“AI WiFi品类开创者”市场地位确认,以技术创新重塑移动办公新体验
2025年中国柔性触觉传感器行业市场深度分析及投资战略咨询报告-华经产业研究院
热塑性复合材料行业市场供需分析(附行业市场规模、产业链全景分析、市场竞争格局及发展前景预测)智研咨询
2025年中国工业车辆动力系统行业市场深度分析及投资战略咨询报告
2025年中国BOPP薄膜行业市场深度分析及投资战略咨询报告-华经产业研究院
2025年中国结构胶行业深度研究报告:行业进入壁垒、竞争格局及战略咨询
Copyright © 2025 成都区角科技有限公司
蜀ICP备2025143415号-1
  
川公网安备51015602001305号