S32DS for ARM 2018.R1 链接文件(链接文件(linker file)学习笔记)学习笔记
S32DS for ARM 2018.R1 链接文件(链接文件(linker file)学习笔记)学习笔记
在S32DS for ARM 2018.R1自带的例程中有两个链接文件,分别为S32K1xx_flash.ld和S32K1xx_ram.ld,前者针对的是程序在
flash中运行的链接文件,后者是在ram中运行程序所需要的链接文件。以下以S32K144的flash.ld文件为例,进行简单的分析
/* Entry Point */
ENTRY(Reset_Handler)/* 关键词ENTRY()指定应用程序入口函数,即复位中断服务函数,是MCU复位后执行的第一个函数 */
HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x00000400;/* 指定应用程序堆(heap)的大小,用于动态分配内
存的RAM区域,heap的空间是用户手动申请和释放的 :C语言中的malloc(size), calloc(num, size)函数分配heap,释放使用
free(*heap)函数。如果用户没有定义__heap_size__,则应用程序堆大小为默认的1024字节 */
STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x00000400;/* 指定应用程序栈(stack)的大小,栈被用于函数
调用/中断服务函数调用时的CPU内核寄存器和上下文(Context)的保存、函数形参的传递和局部变量存储,其遵循先压栈后出
栈(FILO—First In Last Out),原则,运行时有CPU内核自动控制。如果用户没有定义__stack_size__则应用程序栈大小为默
认的1024字节 */
/* If symbol __flash_vector_table__=1 is defined at link time
* the interrupt vector will not be copied to RAM.
* Warning: Using the interrupt vector from Flash will not allow
* INT_SYS_InstallHandler because the section is Read Only.
*/
M_VECTOR_RAM_SIZE = DEFINED(__flash_vector_table__) ? 0x0 : 0x0400;/* 如果定义了
__flash_vector_table__,M_VECTOR_RAM_SIZE就等于0,从而导致__VECTOR_RAM等于__VECTOR_TABLE,在
startup.c文件根据此条件中断向量表就不会拷贝到RAM中,此时就没法在程序中调用INT_SYS_InstallHandler进行中断处理函
数的安装 */
/* Specify the memory areas */
MEMORY
{
/* Flash */
m_interrupts (RX) : ORIGIN = 0x00000000, LENGTH = 0x00000400/* 中断向量表/启动代码,起始地址为0x000,长度0x400
*/
m_flash_config (RX) : ORIGIN = 0x00000400, LENGTH = 0x00000010/* flash配置信息存放位置,起始地址为0x400,长度
为0x10 */
m_text (RX) : ORIGIN = 0x00000410, LENGTH = 0x0007FBF0/* 主要代码/数据存储区,起始地址为0x410,长度为512K-
0x410;除此而外,S32K144还有64KFleNVM,可用作P-Flash或D-Flash,即FlexNVM可用于程序或数据存储。如果用作P-
Flash,由于FlexNVM不可缓存;因此,可能会出现性能下降。 */
/* SRAM_L */
m_data (RW) : ORIGIN = 0x1FFF8000, LENGTH = 0x00008000/* SRAM_L包含.interrupts_ram段.data段和.code段,起始地
址为0x1FFF8000,长度为32K;S32K的SRAM具有ECC功能,用户在启动函数start()中,最开始对SRAM进行写值(将内核通用
寄存器值写入SRAM)操作,初始化ECC。所有带硬件ECC功能的系统存储器读取前都必须先对其进行写值/擦除(对Flash和
EEPROM)操作,产生初始的ECC,否则读取时将产生ECC错误 */
/* SRAM_U */
m_data_2 (RW) : ORIGIN = 0x20000000, LENGTH = 0x00007000/* SRAM_U包含.customSectionBlock段.bss段.heap段
和.stack段,起始地址为0x20000000,长度为28K;S32K144总共64KRAM,还有4KRAM是flexRAM,可用于传统的
SRAM,但它不像主SRAM那样具有ECC,并且以flash的时钟速度运行 */
}
/* Define output sections */
SECTIONS
{
/* The startup code goes first into internal flash */
.interrupts :/* 启动段 */
{
__VECTOR_TABLE = .;/* 标记向量表开始地址,"."表示当前地址 */
__interrupts_start__ = .;/* 标记驱动段开始地址 */
. = ALIGN(4);/* 使用关键词ALIGN() 将其4字节对齐 */
KEEP(*(.isr_vector)) /* Startup code 使用关键词KEEP,将.isr_vector段始终保持在此段内 */
__interrupts_end__ = .;/* 标记驱动段结束地址 */
. = ALIGN(4);
} > m_interrupts/* 链接到m_interrupts分区 */
.flash_config :/* flash配置信息存放区域 */
{
. = ALIGN(4);