
LCF文件使用说明.docx
9页本文格式为Word版,下载可任意编辑LCF文件使用说明 CodeWarrior 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文件中直接举行修改 Memory map 查看全体变 量,函数、段地址信息 EPPC Panel配置 .lcf配置 生成.s19,.bin 或者elf 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大小 Auto FAE: Alan Yang-r66151 Page 1 CodeWarrior LCF链接文件定义及使用 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_handlers GROUP : { .text (TEXT) ALIGN(0x10) : {} .text_vle (VLECODE) ALIGN(0x10): { *(.text) *(.text_vle) } .rodata (CONST) : { *(.rdata) *(.rodata) } .ctors : {} .dtors : {} extab : {} extabindex : {} } > pseudo_rom GROUP : { Auto FAE: Alan Yang-r66151 Page 2 CodeWarrior LCF链接文件定义及使用 .__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文件中预定义的各个段的名称及解释 Section .init .text .rodata .sdata .sdata2 .data .sbss .sbss2 .bss .ctors .dtors Description 包含初始化代码 包含程序代码 包含程序的常量 包含初始化的全局小数据 包含初始化过的全局常量(const定义内容)小数据 包含初始化过的全局数据 包含未初始化过的全局小数据 包含未初始化过的全局常量(const 定义内容)小数据 包含未初始化过的全局数据 包含构造函数 包含析构函数 Auto FAE: Alan Yang-r66151 Page 3 CodeWarrior LCF链接文件定义及使用 3.常用关键字及使用说明 关键字列表: 1) SECTION 2) ALIGN 3) ADDR 4) SIZEOF 5) LOAD 6) BIND 7)Declspec 8)pop, push 9)FORCEACTIVE 1)SECTION Section使用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 Auto FAE: Alan Yang-r66151 Page 4 CodeWarrior LCF链接文件定义及使用 定义段的名字,编译器存储初始化过的目标。
变量在定义的时候被初始化过的,函数和字符串也属于初始化过的目标 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 定义段的名字,编译器存储未被初始。
