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

LCF文件资料使用说明书

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

Codewarrior 10.3是飞思卡尔最新的集成开发环境,是一个开放源代码的、基于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 版本) */ //RAM 版本和ROM 版本的区别在于RAM 版本不将程序下载到ROM 中去,而在RAM 中执行程序/* 512KB Flash, 32KB SRAM */ //单片机的FLASH 和SRAM 大小MEMORY 下面是对单片机存储空间的定义,不同的段的起始地址,不能叠加地址空间{pseudo_rom:(仿真ROM区) org = 0x40000000, (开始地址) len = 0x00003000(长度)init: org = 0x40004000, len = 0x00001000 //初始化段所在位置exception_handlers: org = 0x40005000, len = 0x00001000 //中断向量所在地址internal_ram: org = 0x40006000, len = 0x00001800 //内部RAM的起始地址heap : org = 0x40007800, len = 0x00000400 //堆的起始地址stack : org = 0x40007C00, len = 0x00000400 //栈的起始地址}SECTIONS段的定义{GROUP : { // 它的定义需要遵从本例程方式”GROUP:{}” .“{}”中是内容部分.init : {} //.init段中所有内容。

.init_vle (VLECODE) : { //.init_vle(使用VLE代码)*(.init)*(.init_vle)}} > init //可以参看前面的init段在存储空间的定义.本GROUP中的所有内容//放在init段中,”>”代表放在哪个段GROUP : {.ivor_branch_table (VLECODE) ALIGN (4096) : {} //ALIGN(4096)按照4096字节对齐 .__exception_handlers (VLECODE) LOAD (_e_ivor_branch_table) : {}// LOAD()将本段加载到指定地址} > exception_handlersGROUP : {.text (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); //ADDR()是取括号内段的首地址//SIZEOF()是求某段的长度_stack_end = ADDR(stack); //详见第3小节_heap_addr = ADDR(heap);_heap_end = ADDR(heap)+SIZEOF(heap);/* Exceptions Handlers Location (used in Exceptions.c for IVPR initialization) */EXCEPTION_HANDLERS = ADDR(exception_handlers);2.LCF文件中预定义的各个段的名称及解释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 .abs.xxxxxxxx where xxxxxxxx is an 8-digit hexadecimal number specifying the address of the section.uname定义段的名字,编译器存储未被初始化过的目标。

下面是例子#pragma push // 保存当前状态#pragma section ".data" "COMM"int red;int sky;#pragma pop // 恢复之前的状态data_mode=datamode为编译器指定使用哪种数据模式下面是可选的数据模式∙near_abs –目标必须在16位地址空间∙far_abs –目标必须在32位RAM地址空间∙sda_rel –目标必须在链接器为small data定义的32K 地址空间.code_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_rel const_type ".rodata" data_mode=far_abs c ode_mode=pc_rel sdata_type ".sdata" data_mode=sda_rel c ode_mode=pc_rel sconst_type ".sdata2" ".sbss2" data_mode=sda_rel c ode_mode=pc_rel ".PPC.EMB.sdata0" ".PPC.EMB.sbss0" d ata_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 = 0x80000400, length = 0}SECTIONS{.code :{__rootbasecode = ADDR (ROOT);*.(text);} > ROOT}返回指定Section或者segment的大小(以字节为单位)SIZEOF(segmentName | sectionName)参数segmentNamesegment的名字;必须以“.”作为起始。

相关主题