| 通义灵码添加的注释,以方便有需要的用户参考,加速理解分散加载文件和链接文件的写法。 在此基础上,可以添加自己的修改。 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);         /* 提供栈顶地址 */ } | 

