6626 Keil分散加载文件及GCC链接文件

wen sir · 91次点击 · 2周前

通义灵码添加的注释,以方便有需要的用户参考,加速理解分散加载文件和链接文件的写法。

在此基础上,可以添加自己的修改。

1- 6626 Keil编译的分散加载文件 om662x_flash.sct

/* ----------------------------------------------------------------------------
 * 版权所有 (c) 2020-2030 OnMicro Limited. 保留所有权利。
 *
 * 重新分发和使用源代码和二进制形式,无论是否经过修改,
 * 均需满足以下条件:
 *   1. 重新分发源代码必须保留上述版权声明,
 *      此列表中的条件和以下免责声明。
 *   2. 以二进制形式重新分发必须在随附的文档中复制上述版权声明,
 *      条件列表和以下免责声明。
 *   3. 未经 OnMicroelectronics 或其贡献者的特定事先书面许可,
 *      不得使用 OnMicroelectronics 的名称或其贡献者的名字来支持或推广从本软件派生的产品。
 *
 * 本软件按“原样”提供,没有任何明示或暗示的保证,包括但不限于
 * 适销性和适用于特定目的的隐含保证。在任何情况下,版权所有者或贡献者
 * 对因使用本软件而产生的任何直接、间接、偶然、特殊、示范性或后果性损害
 * (包括但不限于采购替代商品或服务;使用损失、数据丢失或利润损失;
 * 或业务中断)不承担任何责任,无论是在合同、严格责任还是侵权行为(包括疏忽或其他原因)中
 * 即使已被告知有此类损害的可能性。
 *
 * -------------------------------------------------------------------------- */

/**
 * @file     om662x_flash.sct
 * @brief    链接脚本,用于ROM版本
 * @date     2020年9月19日
 * @author   OnMicro 软件团队
 *
 * @version
 * 版本 1.0
 *  - 初始发布
 *
 * @{
 */

/* #include "../../../../../../.autoconf.h" */

/*
;-------- <<< 使用配置向导进行配置 >>> -------------------
*/

/*--------------------- Flash 配置 ----------------------------------
; <h> Flash 配置
;   <o0> Flash 基地址 <0x0-0xFFFFFFFF:8>
;   <o1> Flash 大小(字节) <0x0-0xFFFFFFFF:8>
; </h>
 *----------------------------------------------------------------------------*/
#define __FLASH_BASE            0x00404000  /* Flash 基地址 */
#define __FLASH_SIZE            0x00100000  /* Flash 大小 */

/*--------------------- 嵌入式 RAM 只读配置 ---------------------------
; <h> RAM-RO 配置
;   <o0> RAM RO 基地址    <0x0-0xFFFFFFFF:8>
;   <o1> RAM RO 大小(字节) <0x0-0xFFFFFFFF:8>
; </h>
 *----------------------------------------------------------------------------*/
#define __RAM_RO_BASE           0x00200000  /* RAM-RO 基地址 */
#define __RAM_RO_SIZE           0x00014000  /* RAM-RO 大小 */

/*--------------------- 嵌入式 RAM 配置 ---------------------------
; <h> RAM 配置
;   <o0> RAM 基地址    <0x0-0xFFFFFFFF:8>
;   <o1> RAM 大小(字节) <0x0-0xFFFFFFFF:8>
; </h>
 *----------------------------------------------------------------------------*/
#define __RAM_BASE              0x20000000  /* RAM 基地址 */
#define __RAM_SIZE              0x00013ea0  /* RAM 大小,减少的 SRAM 被 ROM 占用 */

/*--------------------- 栈 / 堆配置 ---------------------------
; <h> 栈 / 堆配置
;   <o0> 栈大小(字节) <0x0-0xFFFFFFFF:8>
;   <o1> 通用堆大小(字节) <0x0-0xFFFFFFFF:8>
; </h>
 *----------------------------------------------------------------------------*/
#define __STACK_SIZE            0x0800      /* 栈大小 */
#define __GENERAL_HEAP_SIZE     0x0000      /* 通用堆大小 */


/*
;------------- <<< 配置部分结束 >>> ---------------------------
*/


/*----------------------------------------------------------------------------
  散列文件定义
 *----------------------------------------------------------------------------*/
LR_FLASH AlignExpr(__FLASH_BASE, 128) __FLASH_SIZE  {               ; 加载区域大小
    ER_TEXT AlignExpr(__FLASH_BASE, 128) {                            ; 加载地址 = 执行地址
        *(RESET, +First)                                            /* 重置向量表 */
        *(InRoot$$Sections)                                         /* 根部分 */
        .ANY (+XO)                                                  /* 代码段 */
        .ANY (+RO)                                                  /* 只读数据段 */
    }
    ER_TEXT_POST +0 ALIGN 32 EMPTY 0 {                                /* 为 ER_TEXT 预留 0 字节区域 */
    }

    RW_RAM_CODE_NON_CACHED __RAM_RO_BASE ALIGN 32 {
        .ANY (RAM_CODE_NON_CACHED)                                    /* 非缓存代码段 */
    }
    RW_RAM_CODE_NON_CACHED_POST +0 ALIGN 32 EMPTY 0 {
    }

    ER_RAM_CODE +0 ALIGN 32 {
        *.o(RAM_CODE)                                                 /* RAM 代码段 */
        *.o(RAM_RODATA)                                               /* RAM 只读数据段 */
    }
    ER_RAM_CODE_POST +0 ALIGN 32 EMPTY 0 {                            /* 为 ER_SRAM_CODE 预留 0 字节区域 */
    }

    RW_RAM __RAM_BASE + ImageLimit(ER_RAM_CODE_POST) - ImageBase(RW_RAM_CODE_NON_CACHED) ALIGN 32  {                     /* 可读写数据 */
        .ANY (+RW +ZI)                                              /* 可读写数据段和零初始化数据段 */
    }
    RW_RAM_POST +0 ALIGN 32 EMPTY 0 {                                 /* 为 RW_RAM 预留 0 字节区域 */
    }

    RW_RAM_NON_CACHED +0 ALIGN 32 {
        .ANY (RAM_DATA_NON_CACHED)                                    /* 非缓存数据段 */
    }

    ER_FLASH_END +0 ALIGN 4 EMPTY 0 {                                 /* 为 ER_FLASH_END 预留 0 字节区域 */
    }

    ARM_LIB_HEAP  +0 ALIGN 32 EMPTY __GENERAL_HEAP_SIZE  {            /* 为通用堆预留空区域 */
    }
    ARM_LIB_HEAP_POST +0 ALIGN 32 EMPTY 0 {                           /* 为通用堆预留 0 字节区域 */
    }

    ARM_LIB_STACK +0 ALIGN 8 EMPTY __STACK_SIZE {                     /* 为栈预留空区域 */
    }

    ScatterAssert(LoadLength(LR_FLASH) < __FLASH_SIZE)                /* 检查加载长度是否小于 Flash 大小 */
    ScatterAssert(ImageLimit(ARM_LIB_STACK) < (__RAM_BASE+__RAM_SIZE))  /* 检查栈的上限是否小于 RAM 总大小 */

}





2-GCC编译的链接文件 om662x_flash.ld


/* ----------------------------------------------------------------------------
 * 版权所有 (c) 2020-2030 OnMicro Limited. 保留所有权利。
 *
 * 在源代码和二进制形式下重新分发和使用,无论是否进行了修改,
 * 都必须满足以下条件:
 *   1. 重新分发源代码必须保留上述版权声明、此条件列表和以下免责声明。
 *   2. 以二进制形式重新分发必须在随分发提供的文档和其他材料中
 *      再现上述版权声明、此条件列表和以下免责声明。
 *   3. 未经特定事先书面许可,不得使用 OnMicroelectronics 或其贡献者的名字
 *      来支持或推广从本软件衍生的产品。
 *
 * 本软件按“原样”提供,不附带任何明示或暗示的保证,包括但不限于
 * 对适销性、特定用途适用性和不侵权的保证。在任何情况下,版权持有人
 * 或贡献者均不对因使用本软件而产生的任何直接、间接、偶发、特殊、
 * 范例性或后果性的损害(包括但不限于采购替代商品或服务;使用损失、
 * 数据丢失或利润损失;或业务中断)负责,无论是在合同、严格责任还是
 * 过失(包括疏忽或其他原因)的情况下,即使已被告知有此类损害的可能性。
 *
 * -------------------------------------------------------------------------- */

/**
 * @file     om662x_flash.ld
 * @brief    适用于闪存版本的链接脚本
 * @date     2020年9月14日
 * @author   OnMicro 软件团队
 *
 * @version
 * 版本 1.0
 *  - 初始发布
 *
 * @{
 */

/* 包含 ROM 符号 */
INCLUDE  rom_symbol.ld

/* --------------------- 栈 / 堆配置 ------------------------------
  <h> 栈 / 通用堆 / DMA 堆配置
    <o0> 栈大小(字节) <0x0-0xFFFFFFFF:8>
    <o1> 通用堆大小(字节) <0x0-0xFFFFFFFF:8>
  </h>
  -----------------------------------------------------------------------------*/
__STACK_SIZE = 0x800;          /* 栈大小 */
__GENERAL_HEAP_SIZE  = 0x400;  /* 通用堆大小 */

/* RAM 大小:减少的 SRAM 被 ROM 占用 */
__RAM_SIZE = 0x00013ea0;

/* 定义内存区域。 */
MEMORY
{
    RAM (rwx)     : ORIGIN = 0x20000000, LENGTH = __RAM_SIZE  /* 可读写执行的 RAM */
    RAM_RO (rwx)  : ORIGIN = 0x00200000, LENGTH = __RAM_SIZE  /* 只读的 RAM */
    FLASH (rx)    : ORIGIN = 0x00404000, LENGTH = 1012K       /* 只读的闪存 */
}

/* 定义输出文件的入口点。 */
ENTRY(Reset_Handler)

SECTIONS
{
    .vectors :
    {
        . = ALIGN(128);                    /* 对齐到 128 字节边界 */
        KEEP(*(.vectors))                  /* 保持向量表 */
    } > FLASH

    /* RAM */
    .ram_code :
    {
        . = ALIGN(32);                     /* 对齐到 32 字节边界 */
        __ram_code_start__ = .;            /* RAM 代码段起始地址 */
        *(.ram_code)                       /* RAM 代码段 */
        . = ALIGN(4);                      /* 对齐到 4 字节边界 */
        *(.ram_rodata)                     /* RAM 只读数据段 */
        . = ALIGN(32);                     /* 对齐到 32 字节边界 */
        __ram_code_end__ = .;              /* RAM 代码段结束地址 */
    } > RAM_RO AT > FLASH

    .text :
    {
        . = ALIGN(32);                     /* 对齐到 32 字节边界 */
        __code_start__ = .;                /* 代码段起始地址 */
        *(.text*)                          /* 代码段 */
        KEEP(*(.init))                     /* 保持初始化段 */
        KEEP(*(.fini))                     /* 保持终止段 */

        /* 构造函数 */
        *crtbegin.o(.ctors)
        *crtbegin?.o(.ctors)
        *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
        *(SORT(.ctors.*))
        *(.ctors)

        /* 析构函数 */
        *crtbegin.o(.dtors)
        *crtbegin?.o(.dtors)
        *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
        *(SORT(.dtors.*))
        *(.dtors)
        *(.rodata*)                        /* 只读数据段 */
        . = ALIGN(32);                     /* 对齐到 32 字节边界 */
        __code_end__ = .;                  /* 代码段结束地址 */
    } > FLASH

    .ARM.extab :
    {
        *(.ARM.extab* .gnu.linkonce.armextab.*)  /* ARM 异常表 */
    } > FLASH

    __exidx_start = .;
    .ARM.exidx :
    {
        *(.ARM.exidx* .gnu.linkonce.armexidx.*)  /* ARM 异常索引表 */
    } > FLASH
    __exidx_end = .;

    .copy.table :
    {
        . = ALIGN(4);                      /* 对齐到 4 字节边界 */
        __copy_table_start__ = .;          /* 拷贝表起始地址 */
        /* RAM 代码和只读数据 */
        LONG (LOADADDR(.ram_code))         /* RAM 代码加载地址 */
        LONG (__ram_code_start__)          /* RAM 代码起始地址 */
        LONG ((__ram_code_end__ - __ram_code_start__ + 3) >> 2)  /* RAM 代码大小 */

        /* RAM 数据 */
        LONG (LOADADDR(.ram_data))        /* RAM 数据加载地址 */
        LONG (__ram_data_start__)          /* RAM 数据起始地址 */
        LONG ((__ram_data_end__ - __ram_data_start__ + 3) >> 2)  /* RAM 数据大小 */

        __copy_table_end__ = .;            /* 拷贝表结束地址 */
    } > FLASH

    .zero.table :
    {
        . = ALIGN(4);                      /* 对齐到 4 字节边界 */
        __zero_table_start__ = .;          /* 清零表起始地址 */
        /* RAM BSS */
        LONG (__ram_bss_start__)           /* RAM BSS 起始地址 */
        LONG ((__ram_bss_end__ - __ram_bss_start__ + 3) >> 2)  /* RAM BSS 大小 */
        __zero_table_end__ = .;            /* 清零表结束地址 */
    } > FLASH

    .ram_non_init (NOLOAD):   /* 为 RAM 代码预留的空间,不添加任何段 */
    {
        . = . + SIZEOF(.ram_code);         /* 增加 RAM 代码段的大小 */
        *(.ram_data_non_init)
    } > RAM

    .ram_data :
    {
        . = ALIGN(32);                     /* 对齐到 32 字节边界 */
        __ram_data_start__ = .;            /* RAM 数据段起始地址 */
        *(.data*)                          /* 可读写的初始化数据 */
        . = ALIGN(32);                     /* 对齐到 32 字节边界 */
        __ram_data_end__ = .;              /* RAM 数据段结束地址 */
    } > RAM AT > FLASH

    .ram_bss :
    {
        . = ALIGN(32);                     /* 对齐到 32 字节边界 */
        __ram_bss_start__ = .;             /* RAM BSS 段起始地址 */
        *(.bss*)                           /* 可读写的零初始化数据 */
        *(COMMON)
        . = ALIGN(32);                     /* 对齐到 32 字节边界 */
        __ram_bss_end__ = .;               /* RAM BSS 段结束地址 */
    } > RAM

    .general_heap :
    {
        *(.ram_data_no_init)
        . = ALIGN(32);                     /* 对齐到 32 字节边界 */
        __general_heap_start__ = .;        /* 通用堆起始地址 */
        . = . + __GENERAL_HEAP_SIZE;       /* 增加通用堆大小 */
        . = ALIGN(4);                      /* 对齐到 4 字节边界 */
        __general_heap_end__ = .;          /* 通用堆结束地址 */
    } > RAM

    .stack :
    {
        . = ALIGN(8);                      /* 对齐到 8 字节边界 */
        __StackLimit = .;                  /* 栈限制地址 */
        . = . + __STACK_SIZE;              /* 增加栈大小 */
        . = ALIGN(8);                      /* 对齐到 8 字节边界 */
        __StackTop = .;                    /* 栈顶地址 */
    } > RAM

    PROVIDE(__stack = __StackTop);         /* 提供栈顶地址 */

}









被收藏 0  ∙  0 赞  
加入收藏
点赞
0 回复  
善言善语 (您需要 登录 后才能回复 没有账号 ?)

请先登录网站