KEIL MDK链接脚本详解

在了解keil的链接脚本之前需要了解几个重要概念:

  • RO(ReadOnly):表示程序中的指令和常量
  • RW(Read/Write):表示程序中已初始化的变量
  • ZI(Zero):表示程序中未初始化的变量

我们在编译keil中的工程项目时生成的目标文件时叫做镜像文件(Image)或bin文件,image文件中只包含RO,RW段,这是因为ZI数据段都是零,没有必要包含,只需要把ZI所在的区域清零即可。而其他两个数据段是被赋值了的,所以image文件需要包含已初始化变量的初值。如果我们将image文件烧录到ROM中,那么其必须包含有将RW段移动到RAM中以及将ZI段所在的地址清零的功能。这是保证烧录程序能运行起来的基本要求。
           知道基本的定义后,我们来了解链接脚本,也叫程序加载文件。在生成image文件时如何来分配相关数据的存放基址呢?这个就有链接脚本决定,如果不指定特定的链接脚本,连接器就会自动采用默认的链接脚本来生成镜像。本文主要讲解分散加载文件:分散加载文件主要由一个加载时域,多个运行时域组成。
加载时域格式如下所示:

load_region_name base_address max_size
{
     execution_region_description+
}
  • load_region_name为加载时域的名字,长度不超过31个字节
  • base_address为加载时域的起始地址,即从该地址开始加载相关代码
  • max_size为加载时域的最大范围,若实际大小超过该大小,链接器将会报错
  • execution_region_description+是对执行时域的描述

同理,运行时域格式如下:
 

exec_region_name base_address max_size
{
     input_section_description*
}

相关应用实例:
 

LR_IROM1 0x00000000 0x00040000 {                 ; 定义一个加载时域,域基址:0x00000000,域大
                                                 ; 小为 0x00040000,对应实际 Flash 的大小
     ER_IROM1 0x00000000 0x00040000 {            ; 定义一个运行时域,第一个运行时域必须和加载
                                                 ; 时域起始地址相同,否则库不能加载到该时域的
                                                 ; 错误,其域大小一般也和加载时域大小相同
     *.o (RESET, +First)                         ; 将 RESET 段最先加载到本域的起始地址外,即
                                                 ; RESET 的起始地址为 0,RESET 存储的是向量表
     .ANY (+RO)                                  ; 加载所有匹配目标文件的只读属性数据,包含:
                                                 ; Code、RW-Code、RO-Data。
 }
     RW_IRAM1 0x10000000 0x00008000 {            ; 定义一个运行时域,域基址:0x10000000,域大
                                                 ; 小为 0x00008000,对应实际 RAM 大小
     * (+RW +ZI)                                 ; 加载所有区配目标文件的 RW-Data、ZI-Data
                                                 ; 这里也可以用.ANY 替代*号
 }
}

 

你可能感兴趣的:(KEIL MDK链接脚本详解)