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