第2部分:MEMORY部分,定义了目标板上RAM和flash等存储器的配置,包括存储器的起始地址和长度。MEMORY是链接器命令语言的一个关键字,大括号中的每一行定义一种存储器。对于存储器的内存配置,需预留一部分内存用作中断的栈。因为片内RAM访问速度最快,所以一般使用片内RAM的一部分用作中断的栈。中断的栈大小由宏CYGNUM_HAL_COMMON_INTERRUPTS_STACK_SIZE指定。该宏可通过eCos配置工具进行设定。
第3部分:SECTIONS部分,描述了程序中段(section)的定义,包括text段(代码段)、data段(已初始化数据段)、rodata段(已初始化只读数据段)、bss段(未初始化数据段)等。与MEMORY一样,SECTIONS也是链接器命令语言的关键字,用于定义程序中的各个section。
在SECTIONS大括号中,使用体系架构模块链接脚本文件提供的宏来定义各个section。对于cortex-m处理器,这些宏定义在cortexm.ld文件中,具有一些共同的参数,如下表所述。
表1 SECTION_xxx宏参数描述
VMA,virtualmemoryaddress,虚拟存储地址,指目标程序执行时section的地址。有下面2种取值:
n:一个绝对地址值;
ALIGN(n):紧跟前个section的尾部,且n字节对齐。
LMA,loadmemoryaddress,加载存储地址,指该section被加载时所在的地址。有下面3种取值:
LMA_EQ_VMA:表示LMA等于VMA;
AT(n):一个绝对地址值;
FOLLOWING(.name):紧跟名为name的section的尾部,跟ALIGN一样,也存在字节对齐,但使用此宏时无需额外指定。
注:在嵌入式系统中,大多数情况下,LMA等于VMA。ecos
下表说明了SECTIONS大括号中每行的含义。
表2 SECTION_xxx宏说明
定义调试信息段。这些段以debug开头。从该宏的名称可以看出,它应该放在SECTIONS部分的开始位置。
定义vectors段,即向量表段。向量表段主要包含中断向量表和初始化代码。移植的时候,需要注意向量表段放置的位置要与启动方式对应起来。根据eCos启动方式,向量表段应放置在对应存储器指定位置。一般而言,向量表段被放置在存储器的开始位置。
定义重定位表段。这些段存储对应段的重定位表信息。链接时,链接器可能会修改函数调用或变量的地址。链接器怎么知道哪些函数或变量需要修改地址呢?重定位表就记录了哪些段的哪些函数调用地址或变量地址需要进行修改。
定义fini段。fini段中的代码会在main退出之后被执行。大多数情况下,最后编译出的目标程序都没有该段。
SECTIONS部分各段的定义都是基于GNU链接器标准的。对于一个目标程序而言,并不要求使用全部的段。
第4部分是向量服务程序表、虚拟向量表和启动栈的定义。
hal_vsr_table:向量服务程序表,简称向量表。存放cortex-m处理器的异常向量表。对于cortex-m处理器,片内sram访问速度最快,所以向量表从片内sram起始地址开始铺设。
hal_virtual_vector_table:虚拟向量表。虚拟向量是eCos定义的一组指向服务函数和变量的指针。
hal_startup_stack:指定栈顶地址。cortex-m处理器的栈是向下生长的。
内存布局头文件
每个ldi文件都对应一个内存布局头文件,供eCos其它模块包含。
下面是mlt_cortexm_stm3210e_eval_rom.h头文件的源码。
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-32188-2.html
我会对美国说关你鸟事
但使得定远镇压也因此丧失了再战能力
中国大地思想的大旗又高高举起和飘扬了