当前位置:文档之家› LCF文件使用说明

LCF文件使用说明

序言:Codewarrior 是飞思卡尔32位汽车级单片机Qorriva 系列的集成开发环境,与之前版本、完全兼容。

Codewarrior 是飞思卡尔最新的集成开发环境,是一个开放源代码的、基于Java 的可扩展开发平台。

许多新用户对codewarrior 链接文件不是十分了解,本文将针对链接文件的常见问题以及段的定义进行介绍帮助用户快速了解和使用CodeWarrior 。

目录第一节 LCF 文件定义及使用说明1: LCF 文件介绍2:LCF 文件中各个预定义段的说明 3:常用关键字和宏定义说明第二节 EPPC 链接器介绍及使用说明 第三节 代码重定向第一节 LCF 文件定义及使用说明1:LCF 文件介绍链接文件用来控制不同类型数据代码、数据以某种排列方式在最终在生成的可执行文件或者二进制文件,调试文件中的放置位置。

它可以通过在EPPC linker 的面板中进行配置,也可以直接在lcf 文件中直接进行修改。

Lcf 文件中首先是对整个memory map(MEMORY )地址空间内的所有RAM,ROM 进行分割,将其分为几个区域,便于放置不同类型的存储内容,而这些区域内包含的内容可以是用户自定义的段或者系统预定义的段(SECTION )。

关于段的定义和使用将在lcf 文件介绍结束后进行介绍。

一个工程通常在建立的时候默认的调试方式都是在RAM 中进行调试,由于RAM 中执行的效率高于FLASH ,并且下载速度快。

在生成的ROM Image 中常量,初始化过的数据或者代码如果没有被定义在ROM 区域则假设为这部分代码要在程序开始执行的时候从ROM 去拷贝到RAM 区。

下面是一个完整的lcf 文件,其中包括每行的解释及用法。

/* lcf file for MPC5604B M27V (debug RAM version) 文件的名字及对应单片机(RAM 版本) */ {}”中是内容部分.init : {} nit_vle (VLECODE) : { nit) *(.init_vle) }} > init GROUP 中的所有内容vor_branch_table (VLECODE) ALIGN (4096) : {} _exception_handlers (VLECODE) LOAD (_e_ivor_branch_table) : {}ext (TEXT) ALIGN(0x10) : {}.text_vle (VLECODE) ALIGN(0x10): {*(.text)*(.text_vle)}.rodata (CONST) : {*(.rdata)*(.rodata)}.ctors : {}.dtors : {}extab : {}extabindex : {}} > pseudo_romGROUP : {.__uninitialized_intc_handlertable ALIGN(0x10) : {}.data : {}.sdata : {}.sbss : {}.sdata2 : {}.sbss2 : {}.bss : {}} > internal_ram}/* Freescale CodeWarrior compiler address designations */_stack_addr = ADDR(stack)+SIZEOF(stack);.dtors 包含析构函数3.常用关键字及使用说明关键字列表:1) SECTION2) ALIGN3) ADDR4) SIZEOF5) LOAD6) BIND7)Declspec8)pop, push9)FORCEACTIVE1)SECTIONSection使用pragma来将编译的目标代码放到预定义的段中,然后可以在LCF文件中将对应的段放到指定的地址区域。

Section和__declspec(section)都可以用来指定一个段,但是不能同时使用语法#pragma section [ objecttype | permission ][iname][uname][data_mode=datamode][code_mode=codemode]参数objecttype可以是以下三种选项,用来指定将目标数据放在哪里code_type –可执行目标类型data_type –非常量数据,包含比small data大的数据sdata_type –非常量数据,包含比small data小或者等同的数据。

const_type –常量数据,包含比small const大的数据sconst_type –常量数据,包含小或者等同small data的数据all_types –所有数据和代码permission定义访问权限,包含下列三个选项R –只读W –可写X –可执行iname定义段的名字,编译器存储初始化过的目标。

变量在定义的时候被初始化过的,函数和字符串也属于初始化过的目标。

The iname parameter may be of the form . where xxxxxxxx is an 8-digit hexadecimal number specifying the address of the section.uname定义段的名字,编译器存储未被初始化过的目标。

下面是例子#pragma push ata" "COMM"int red;int sky;#pragma popcode_mode=codemode向编译器指定地址模式下面是可选的三种地址模式:pc_rel –被调用子函数地址必须在调用函数24位地址空间范围内near_abs –函数地址必须在24位地址范围far_abs -函数地址必须在32位地址范围内预定义的段和默认模式Type Name Data mode Code modecode_type ".text" data_mode=far_abs c ode_mode=pc_reldata_type ".data" data_mode=far_abs c ode_mode=pc_relconst_type ".rodata" data_mode=far_abs c ode_mode=pc_relsdata_type ".sdata" data_mode=sda_rel c ode_mode=pc_relsconst_type ".sdata2" ".sbss2" d ata_mode=sda_rel c ode_mode=pc_rel"." "." data_mode=sda_rel c ode_mode=pc_rel2)ALIGN按照指定的边界进行排列,必须是2的整倍数。

SECTIONS{GROUP:{.init ALIGN(0x1000) : {}.text ALIGN(0x1000) : {}} > text}例子中定义了两个段:.init和.text。

在运行的时候每个段都会被放在下一个可以使用的地址(可以被0x1000整除)3)ADDR返回指定名称的段或者内存区域的开始地址.ADDR(sectionName | segmentName)参数sectionName文件中段的标志符segmentName存储区域中段的标志符范例下面代码中使用的ADDR功能来将ROOT的地址赋值给__rootbasecode .列举ADDR() 功能MEMORY{ROOT : origin = 0x, length = 0}SECTIONS{.code :{__rootbasecode = ADDR (ROOT);*.(text);} > ROOT}4)SIZEOF返回指定Section或者segment的大小(以字节为单位)SIZEOF(segmentName | sectionName)参数segmentNamesegment的名字;必须以“.”作为起始。

sectionNamesection的名字;必须以“.”作为起始。

5)LOAD在指定地址加载一个或者多个段。

语法LOAD(address)参数address一个内存地址例如: 0x.注意使用load指令来指定一个外部的ROM addr_mode。

Load指令可以被用于所有的在ROM中的段。

如果编译器选项面板中的Generate ROM image没有被选择的话,指令会被在链接中忽略。

从ROM拷贝到RAM中的不连续的未初始化的数据段可能需要参考ROM的地址。

举例来说:保存紧跟在.text 段后面的.data和.sdata段到ROM中,可以尝试下面的例子:.text LOAD(ADDR(.text)) : {} > rom.data LOAD(ROMADDR(.text) + SIZEOF(.text)): {} > code.sdata LOAD(ROMADDR(.data) + SIZEOF(.data)): {} > code6)BIND指定一个段修饰语来设定一个地址。

BIND(address)参数address一个存储空间地址例如: 0x.7)pop, push保存和恢复pragma设置语法#pragma push#pragma poppragma push 保存所有当前的pragma设置。

Pragma pop 恢复所有pragma设置范例#pragma ANSI_strict on#pragma push /* Saves all compiler settings. */#pragma ANSI_strict off#pragma pop /* Restores ANSI_strict to on. */例程中的pragma不受任何面板设置影响,和之前其它的pragma的设定8)__declspec(section name)指定在已经定义的section中放置变量或者函数语法__declspec(section <section_name>) declaration__declspec(section <section_name>) definition参数section_name指定一个初始化过的数据段的名字9)FORCEACTIVE指定不能被优化掉的目标.参数FORCEACTIVE{ symbol [, symbol]* }第二节 EPPC 链接器使用EPPC Linker设置面板来控制设定链接相关选项,规定目标代码链接成的可执行文件,库或者其它的最终文件格式。

相关主题