上年,曾经在“eCos内存布局文件详细介绍”一文中介绍过eCos的内存布局文件即ldi文件。经过一年多时间的积累和沉淀,发现对eCos的内存布局文件有了新的更加深刻地理解和认识。
下面对eCos的内存布局文件进行具体的阐述。阅读前,建议大家先阅读“eCos内存布局文件详细介绍”一文,两文对比,形成自己的认识。
移植eCos前,了解内存布局文件十分重要。它关乎移植后的eCos程序能否正常启动。
内存布局文件概述
eCos使用后缀为.ldi的文件来描述一个目标板的内存布局,包括存储器RAM、flash等的配置、section和堆栈的定义,这个ldi文件称为内存布局文件,位于HAL的平台模块内,因此它属于平台特征的一部分。与ldi文件一起的还有一个同名但后缀为.h文件,称之为内存布局头文件。
ldi文件实际上是一个链接器脚本文件,在eCos配置工具中是这样描述这个文件的:Memory layout linker Script fragment(内存布局链接器脚本片段)。
我们知道,链接器脚本采用链接器命令语言编写,用于控制程序文件的链接,主要目的是描述了如何把输入文件中的段(section)映射到输出文件中,并控制输出文件的存储布局。
链接器脚本内容依赖于处理器体系架构,因此每一种处理器体系都应有相应的链接器脚本。在eCos中,它把链接器脚本中关于各section的具体定义封装在体系架构模块中,并以宏的形式提供给ldi文件使用。这些被封装的链接器脚本名称格式为:处理器名称.ld,如ARM处理器的链接脚本文件:arm.ld、cortex-m处理器的链接脚本文件:cortexm.ld等。对于目标程序各section的定义和组织形式则由ldi文件进行定义和描述。
一般而言,程序链接时都是使用链接器默认的链接脚本。但链接eCos时,必须使用eCos的链接脚本。值得提及的是,ldi文件不是链接eCos时最终可用的链接脚本。当eCos被编译后,ldi文件被转换成一个名为target.ld的链接脚本文件,这个才是链接eCos时最终可用的链接脚本。下图展示了ldi文件与各链接脚本文件的关系。
下面以stm3210e eval评估板的内存布局文件进行详细说明。
内存布局文件位置
内存布局文件一般位于“平台模块目标板\ecos版本号\include\pkgconf”目录下。所以stm3210e eval评估板的内存布局文件位置为:
hal\cortexm\stm32\stm3210e_eval\current\include\pkgconf
所有的内存布局文件如下图所示。
内存布局文件名称
内存布局文件名称遵循一定的格式:“mlt_处理器体系架构名称_目标板名称_启动方式”,其中:
l mlt:代表eCos memory layout。
l 启动方式:一般有ROM、RAM、SRAM、JTAG等几种,表示eCos程序是从哪里开始启动运行。对于stm3210e eval目标板,ROM代表从微控制器内部flash启动;RAM代表从微控制器片外SRAM启动;SRAM代表从微控制器内部SRAM启动。
从上面可看出,每种启动方式都对应一个内存布局文件。
由于内容比较多,分几篇文章进行阐述。下篇文章着重对内存布局文件的内容进行详细分析。
注:本文节选自我正在编写的《嵌入式eCos开发详解》教程。