LCF文件资料使用说明书_第1页
LCF文件资料使用说明书_第2页
LCF文件资料使用说明书_第3页
LCF文件资料使用说明书_第4页
LCF文件资料使用说明书_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

序言:Codewarrior2.10是飞思卡尔32位汽车级单片机Qorriva系列的集成开发环境,与之前版本2.8、2.9完全兼容。Codewarrior10.3是飞思卡尔最新的集成开发环境,是一种开放源代码的、基于Java的可扩展开发平台。许多新顾客对codewarrior链接文献不是十分理解,本文将针对链接文献的常见问题以及段的定义进行简介协助顾客迅速理解和使用CodeWarrior。目录LCF文献定义及使用阐明1:LCF文献简介2:LCF文献中各个预定义段的阐明3:常用关键字和宏定义阐明第二节EPPC链接器简介及使用阐明第三节代码重定向LCF文献定义及使用阐明1:LCF文献简介链接文献用来控制不一样类型数据代码、数据以某种排列方式在最终在生成的可执行文献或者二进制文献,调试文献中的放置位置。它可以通过在EPPClinker的面板中进行配置,也可以直接在lcf文献中直接进行修改。MMemorymap查看所有变量,函数、段地址信息EPPCPanel配置EPPCPanel配置生成.s19,.bin或者elf.lcf配置生成.s19,.bin或者elf.lcf配置Lcf文献中首先是对整个memorymap(MEMORY)地址空间内的所有RAM,ROM进行分割,将其分为几种区域,便于放置不一样类型的存储内容,而这些区域内包括的内容可以是顾客自定义的段或者系统预定义的段(SECTION)。有关段的定义和使用将在lcf文献简介结束后进行简介。一种工程一般在建立的时候默认的调试方式都是在RAM中进行调试,由于RAM中执行的效率高于FLASH,并且下载速度快。在生成的ROMImage中常量,初始化过的数据或者代码假如没有被定义在ROM区域则假设为这部分代码要在程序开始执行的时候从ROM去拷贝到RAM区。下面是一种完整的lcf文献,其中包括每行的解释及使用方法。/*lcffileforMPC5604BM27V(debugRAMversion)文献的名字及对应单片机(RAM版本)*///RAM版本和ROM版本的区别在于RAM版本不将程序下载到ROM中去,而在RAM中执行程序/*512KBFlash,32KBSRAM*///单片机的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_handlertableALIGN(0x10):{}.data:{}.sdata:{}.sbss:{}.sdata2:{}.sbss2:{}.bss:{}}>internal_ram}/*FreescaleCodeWarriorcompileraddressdesignations*/_stack_addr=ADDR(stack)+SIZEOF(stack);//ADDR()是取括号内段的首地址//SIZEOF()是求某段的长度_stack_end=ADDR(stack);//详见第3小节_heap_addr=ADDR(heap);_heap_end=ADDR(heap)+SIZEOF(heap);/*ExceptionsHandlersLocation(usedinExceptions.cforIVPRinitialization)*/EXCEPTION_HANDLERS=ADDR(exception_handlers);2.LCF文献中预定义的各个段的名称及解释SectionDescription.init包括初始化代码.text包括程序代码.rodata包括程序的常量.sdata包括初始化的全局小数据.sdata2包括初始化过的全局常量(const定义内容)小数据.data包括初始化过的全局数据.sbss包括未初始化过的全局小数据.sbss2包括未初始化过的全局常量(const定义内容)小数据.bss包括未初始化过的全局数据.ctors包括构造函数.dtors包括析构函数3.常用关键字及使用阐明关键字列表:1)SECTION2)ALIGN3)ADDR4)SIZEOF5)LOAD6)BIND7)Declspec8)pop,push9)FORCEACTIVE1)SECTIONSection使用pragma来将编译的目的代码放到预定义的段中,然后可以在LCF文献中将对应的段放到指定的地址区域。Section和__declspec(section)都可以用来指定一种段,不过不能同步使用语法#pragmasection[objecttype|permission][iname][uname][data_mode=datamode][code_mode=codemode]参数objecttype可以是如下三种选项,用来指定将目的数据放在哪里code_type–可执行目的类型data_type–非常量数据,包括比smalldata大的数据sdata_type–非常量数据,包括比smalldata小或者等同的数据。const_type–常量数据,包括比smallconst大的数据sconst_type–常量数据,包括小或者等同smalldata的数据all_types–所有数据和代码permission定义访问权限,包括下列三个选项R–只读W–可写X–可执行iname定义段的名字,编译器存储初始化过的目的。变量在定义的时候被初始化过的,函数和字符串也属于初始化过的目的。Theinameparametermaybeoftheform.abs.xxxxxxxxwherexxxxxxxxisan8-digithexadecimalnumberspecifyingtheaddressofthesection.uname定义段的名字,编译器存储未被初始化过的目的。下面是例子#pragmapush//保留目前状态#pragmasection".data""COMM"intred;intsky;#pragmapop//恢复之前的状态data_mode=datamode为编译器指定使用哪种数据模式下面是可选的数据模式near_abs–目的必须在16位地址空间far_abs–目的必须在32位RAM地址空间sda_rel–目的必须在链接器为smalldata定义的32K地址空间.code_mode=codemode向编译器指定地址模式下面是可选的三种地址模式:pc_rel–被调用子函数地址必须在调用函数24位地址空间范围内near_abs–函数地址必须在24位地址范围far_abs-函数地址必须在32位地址范围内预定义的段和默认模式TypeNameDatamodeCodemodecode_type".text"data_mode=far_abscode_mode=pc_reldata_type".data"data_mode=far_abscode_mode=pc_relconst_type".rodata"data_mode=far_abscode_mode=pc_relsdata_type".sdata"data_mode=sda_relcode_mode=pc_relsconst_type".sdata2"".sbss2"data_mode=sda_relcode_mode=pc_rel

".PPC.EMB.sdata0"".PPC.EMB.sbss0"data_mode=sda_relcode_mode=pc_rel2)ALIGN按照指定的边界进行排列,必须是2的整倍数。SECTIONS{GROUP:{.initALIGN(0x1000):{}.textALIGN(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}4)SIZEOF返回指定Section或者segment的大小(以字节为单位)SIZEOF(segmentName|sectionName)参数segmentNamesegment的名字;必须以“.”作为起始。sectionNamesection的名字;必须以“.”作为起始。5)LOAD在指定地址加载一种或者多种段。语法LOAD(address)参数address一种内存地址例如:0x80000400.注意使用load指令来指定一种外部的ROMaddr_mode。Load指令可以被用于所有的在ROM中的段。假如编译器选项面板中的GenerateROMimage没有被选择的话,指令会被在链接中忽视。从ROM拷贝到RAM中的不持续的未初始化的数据段也许需要参照ROM的地址。举例来说:保留紧跟在.text段背面的.data和.sdata段到ROM中,可以尝试下面的例子:.textLOAD(ADDR(.text)):{}>rom.dataLOAD(ROMADDR(.text)+SIZEOF(.text)):{}>code.sdataLOAD(ROMADDR(.data)+SIZEOF(.data)):{}>code

6)BIND指定一种段修饰语来设定一种地址。BIND(address)参数address一种存储空间地址例如:0x80000400.7)pop,push保留和恢复pragma设置语法#pragmapush#pragmapoppragmapush保留所有目前的pragma设置。Pragmapop恢复所有pragma设置范例#pragmaANSI_stricton#pragmapush/*Savesallcompilersettings.*/#pragmaANSI_strictoff#pragmapop/*RestoresANSI_stricttoon.*/例程中的pragma不受任何面板设置影响,和之前其他的pragma的设定8)__declspec(sectionname)指定在已经定义的section中放置变量或者函数语法__declspec(section<section_name>)declaration__declspec(section<section_name>)definition参数section_name指定一种初始化过的数据段的名字注意段的名字必须用双引号("").假如使用顾客自定义的段,必须是事先用#pragma定义过的9)FORCEACTIVE指定不能被优化掉的目的.参数FORCEACTIVE{symbol[,symbol]*}第二节EPPC链接器使用EPPCLinker设置面板来控制设定链接有关选项,规定目的代码链接成的可执行文献,库或者其他的最终文献格式。如下图所示2.10版本(图2-1)和10.3版本(图2-2)图2-1:Codewarrior2.10版本图2-2:codewarrior10.3版本EPPC链接器设定面板各条目的含义及使用方法

元素目的注释LinkModelistbox指定链接器使用多少内存做缓冲来写输出文献,然后写到硬盘上选项:UseLessRAM–直接将输出文献写到硬盘,不使用缓冲Normal–512字节缓冲UseMoreRAM–将每个部分写到自己的缓冲,然后写回硬盘链接需要足够的RAM空间来保留输入文献。Normal是最佳的选择,MoreRAM更适合小工程GenerateDWARFInfocheckboxClear–不生成调试信息Checked–生成调试信息

UseFullPathNamescheckboxClear–链接器只使用文献名Checked–链接器包括途径名字在elf文献中GenerateLinkMapcheckboxClear–不生成map文献Checked–生成map文献ListClosurecheckboxClear–map不列举程序开始点调用的函数Checked-Map文献列举所有程序开始点调用的函数ListUnusedObjectscheckboxClear-Map不包括没用到的目的Checked–Map列举所有无用到的目的ListDWARFObjectscheckboxClear-Map不列出DWARF调试目的Checked-Map在Section里列出所有DWARF调试目的SuppressWarningMessagescheckboxClear–链接器在消息窗口显示警告Checked–链接器不显示警告

HeapAddresscheckboxClear–Heap顶和堆栈底相似Checked–指定heap内存位置参照表后备注.StackAddresscheckboxClear–链接器使用默认的堆栈地址0x003DFFF0.Checked–为堆栈指定栈顶内存地址参照表后备注GenerateROMImagecheckboxClear–不生成ROMimage.Checked–生成ROMimage

RAMBufferAddresscheckboxClear–不指定RAMbuffer地址Checked–给flash编程器指定RAMbuffer地址。许多其他的flash编程器使用指定的,独立的缓冲区来加载所有的二进制段到持续的flashROM地址空间。尽管如此,在运行的时候系统会将这些段加载到lcf文献或者数据地址框指定的地址。

对于CodewarriorFlash编程器,RAMbuffer和ROMimage的地址是同样的。(参照备注)ROMImageAddresscheckboxClear–不指定目的地址Checked–为二进制文献指定ROM目的地址参照备注UseLinkerCommandFilecheckboxClear–顾客指定段地址,忽视lcf文献的配置。Checked–从lcf文献中寻找段地址假如选定,而lcf文献中并没有指定段地址,编译器将报错BinaryFilelistbox生成二进制文献None–不生成bin文献One–一种二进制文献Multiple–多种二进制文献默认不生成二进制代码GenerateS-RecordFilecheckboxClear–不生成srecord文献.Checked–生成S3S-record文献S-record文献以.mot扩展名存在,是初期的srecord文献扩展名。目前后缀名都是.s19,但格式内容相似SortS-RecordcheckboxClear–不排序s-recored文献Checked–地址上升排序s-recored文献.MaxLengthtextbox指定S-recored的最大长度(256字节或者少于)EOLCharacterlistbox针对不一样系统指定srecord文献行尾的字符DOS-<cr><lf>Unix-<lf>Mac-<cr>EntryPointtextbox指定程序性的入口地址-加载程序时使用的第一种函数默认函数是__start.c中的bootstrap/glue代码。配置EABI的环境,然后执行main()Heap假如你的程序使用malloc或者new将会使用到堆。假如使用MSLC,你的程序也许会使用隐含的堆。尽管如此,MSL分派程序不需要在栈下面申请堆。假如不选择检查框,堆的高地址等于栈的底部。_stack_end=_stack_addr-(stack_size*1024);_heap_end=_stack_end;_heap_addr=_heap_end-(heap_size*1024);假如你的代码不需要堆你可以清除堆地址检查框注意假如没有足够的空间,malloc函数会返回0.假如你不用malloc,可以把堆的大小设定为零来给其他需要内存空间的数据代码,栈。Stack在指定栈的开始地址后,栈使用将向下增长。因此尽量将栈顶设高假如你没有指定栈的地址,链接器将使用0x003DFFF0.不过默认值并不适合所有板子,有些芯片RAM很小。ROMImage应用程序的ROMImage一般是整个应用程序镜像。一种ROM镜像通过ROMImageAddress和RAMBufferrAddress来定义。ROMImageAddress:ROM将被分派在什么位置。一般是在.lcf文献中定义的某一种存储块的开始。RAMBufferAddress:在RAM中指定一种位置,用来作为Flashimage编程器的缓冲区。RAMBuffer配置地址和ROMImage的配置地址必须保持相似,即RAMBuffer地址不需要考虑。第三节代码重定向假如我们想把一种函数存在flash,不过在RAM中被执行,我们需要在LCF文献,程序中参照如下几条进行定义1)LCF文献:MEMORY{…reloc_flash:org=0x0007F000,len=0x00001000//重定向的函数存储在Flash中…reloc_ram:org=0x40005000,len=0x00001000//重定向的函数在RAM中被调用…}SECTIONS{…..RelocCode(VLECODE)LOAD(ADDR(reloc_flash)):{}>reloc_ram//defineasectionforrelocatedfunctions}

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论