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

下载本文档

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

文档简介

1、实用文档序言:Codewarrior 2.10是飞思卡尔32位汽车级单片机 Qorriva系列的集成开发环境,与之前版本2.8、2.9完全兼容。Codewarrior 10.3是飞思卡尔最新的集成开发环境,是一个开放源代码的、基于 Java的可扩展开发平台。许多新用户对codewarrior链接文件不是十分了解,本文将针对链接文件的常见问题以及段的定义进行介绍帮助用 户快速了解和使用 CodeWarrior。目录第一节LCF文件定义及使用说明LCF文件介绍LCF文件中各个预定义段的说明3:常用关键字和宏定义说明第二节EPPC链接器介绍及使用说明第三节 代码重定向第一节LCF文件定义及使用说明1

2、: LCF文件介绍链接文件用来控制不同类型数据代码、数据以某种排列方式在最终在生成的可执行文件或者二进制文件,调试文件 中的放置位置。它可以通过在 EPPC linker的面板中进行配置,也可以直接在 lcf文件中直接进行修改。Memory map 查看所有变 量,函数、段地址信息EPPC Panel 配置 一雨生一 一 生成.s19,.bin或者elf.lcf配置Lcf文件中首先是对整个 memory map(MEMORYfc址空间内的所有 RAM,ROM!行分割,将其分为几个区域,便于放置不同类型的存储内容,而这些区域内包含的内容可以是用户自定义的段或者系统预定义的段(SECTION。关于

3、段的定义和使用将在lcf文件介绍结束后进行介绍。一个工程通常在建立的时候默认的调试方式都是在RAW进行调试,由于RAW执行的效率高于 FLASH并且下载速度快。在生成的 ROMmage中常量,初始化过的数据或者代码如果没有被定义在ROME域则假设为这部分代码要在程序开始执行的时候从ROM?拷贝到RAMK。文件的名字及对应单片机(RAM本) ROW去,而在 RAM43执行程序单片机的FLASH口 SRAMk小*/下面是一个完整的lcf文件,其中包括每行的解释及用法。/* lcf file for MPC5604B M27V (debug RAM version)/RAM版本和RO般本的区别在于

4、RAM本不将程序下载到/*512KB Flash, 32KB SRAM */ /MEMORYf面是对单片机存储空间的定义,不同的段的起始地址,不能叠加地址空间 实用文档len = 0 x00003000(长度)初始化段所在位置中断向量所在地址内部RAM勺起始地址堆的起始地址栈的起始地址pseudo_rom:(仿真 ROME)org = 0 x40000000,(开始地址) TOC o 1-5 h z init:org = 0 x40004000, len = 0 x00001000/exception_handlers: org = 0 x40005000, len = 0 x00001000

5、/internal_ram:org = 0 x40006000, len = 0 x00001800/heap :org = 0 x40007800, len = 0 x00000400/stack :org = 0 x40007c00, len = 0 x00000400/SECTION皱的定义 GROUP : /它的定义需要遵从本例程方式GROUP:” . “”中是内容部分.init : /.init段中所有内容。.init_vle (VLECODE) : /.init_vle(使用 VLE代码)*(.init) *(.init_vle) init/可以参看前面的init段在存储空间的定义

6、.本GROU珅的所有内容/放在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(0 x10) : .text_vle (VLECODE) ALIGN(0 x10): *(.text)*(.text_vle).roda

7、ta (CONST) : *(.rdata)*(.rodata).ctors : .dtors : extab : extabindex : pseudo_romGROUP: ._uninitialized_intc_handlertable ALIGN(0 x10) : .data : 实用文档.sdata : .sbss : .sdata2 : .sbss2 : .bss : internal_ram /ADDR()是取括号内段的首地址/SIZEOF ()是求某段的长度/详见第3小节/* Freescale CodeWarrior compiler address designations

8、 */_stack_addr = ADDR(stack)+SIZEOF(stack);_stack_end = ADDR(stack);_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);. LCFC件中预定义的各个段的名称及解释SectionDescription.init包

9、含初始化代码.text包含程序代码.rodata包含程序的常量.sdata包含初始化的全局小数据.sdata2包含初始化过的全局常量(const定义内容)小数据.data包含初始化过的全局数据.sbss包含未初始化过的全局小数据.sbss2包含未初始化过白全局常量(const定义内容)小数据.bss包含未初始化过的全局数据.ctors包含构造函数.dtors包含析构函数.常用关键字及使用说明实用文档关键字列表:SECTIONALIGNADDRSIZEOFLOADBINDDeclspecpop, pushFORCEACTIVESECTIONSection使用pragma来将编译的目标代码放到预定

10、义的段中,然后可以在LCF文件中将对应的段放到指定的地址区域。Section和_declspec(section)都可以用来指定一个段,但是不能同时使用语法#pragma section objecttype | permission inameuname data_mode=datamodecode_mode=codemodeobjecttype可以是以下三种选项,用来指定将目标数据放在哪里code_type - 可执行目标类型data_type-非常量数据,包含比 small data 大的数据sdata_type-非常量数据,包含比 small data 小或者等同的数据。const_t

11、ype-常量数据,包含比 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 t

12、he 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位RAM1址空间sda_rel -目标必须在链接器为 small data 定义的32K地址空间.code_mode=codemode向编译器指定地址模式下面是

13、可选的三种地址模式:pc_rel -被调用子函数地址必须在调用函数24位地址空间范围内near_abs -函数地址必须在24位地址范围far_abs -函数地址必须在 32位地址范围内预定义的段和默认模式TypeNameData modeCode modecode_type .textdata_mode=far_abscode_mode=pc_reldata_type .datadata_mode=far_abscode_mode=pc_relconst_type .rodatadata_mode=far_abscode_mode=pc_relsdata_type .sdatadata_mod

14、e=sda_relcode_mode=pc_relsconst_type .sdata2.sbss2data_mode=sda_relcode_mode=pc_rel.PPC.EMB.sdata0 .PPC.EMB.sbss0 data_mode=sda_relcode_mode=pc_rel实用文档ALIGN按照指定的边界进行排列,必须是 2的整倍数。SECTIONS(GROUP:(.init ALIGN(0 x1000) : .text ALIGN(0 x1000) : text例子中定义了两个段:.init和.text。在运行的时候每个段都会被放在下一个可以使用的地址(可以被0 x100

15、0整除)ADDR返回指定名称的段或者内存区域的开始地址.ADDRSectionName | segmentNam)esectionName文件中段的标志符segmentName存储区域中段的标志符范例下面代码中使用的 ADD电能来将ROOT勺地址赋值给_rootbasecode .列举ADDR()功能MEMORYROOT : origin = 0 x80000400, length = 0SECTIONS.code :_rootbasecode= ADDR (ROOT);*.(text); ROOT实用文档SIZEOF返回指定Section或者segment的大小(以字节为单位)SIZEOF(

16、segmentName sectionName)参数segmentNamesegment的名字;必须以.”作为起始。sectionNamesection的名字;必须以.”作为起始。LOAD在指定地址加载一个或者多个段。语法LOAD(address)参数address一个内存地址例如:0 x80000400.注思使用load指令来指定一个外部的ROM addr_mode。Load指令可以被用于所有的在ROW的段。如果编译器选项面板中的Generate ROM image没有被选择的话,指令会被在链接中忽略。.text从RO傩贝到RAM中的不连续的未初始化的数据段可能需要参考ROM勺地址。举例来说

17、:保存紧跟在段后面的.data和.sdata段到ROM可以尝试下面的例子:.text LOAD(ADDR(.text) : rom.data LOAD(ROMADDR(.text) + SIZEOF(.text): code.sdata LOAD(ROMADDR(.data) + SIZEOF(.data): codeBIND指定一个段修饰语来设定一个地址。BIND(address)实用文档address一个存储空间地址例如:0 x80000400.pop, push保存和恢复pragma设置语法#pragma push#pragma poppragma push 保存所有当前的 pragma

18、设置。 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的设定_declspec(section name)指定在已经定义的section中放置变量或者函数语法_declspec(section ) declaration_declspec(secti

19、on ) definition sectionname指定一个初始化过的数据段的名字注意段的名字必须用双引号().如果使用用户自定义的段,必须是事先用#pragma定义过的 9)FORCEACTIVE实用文档指定不能被优化掉的目标FORCEACTIVEsymbol , symbol* 第二节 EPPC链接器使用EPPC Linker设置面板来控制设定链接相关选项,规定目标代码链接成的可执行文件,库或者 其它的最终文件格式。如下图所示 2.10版本(图2-1)和10.3版本(图2-2)9 EPPC LinkerLink OptiynsLink Mode: Morrnal q Generate D

20、WARF Infoq Use Full Path Narn&sp Generate Link MapList Cb$ure/ List Unused ObjectsF List DWARF ObjectsSuppress Warning Messages Hep Address:Stack Address:* Generate ROM IrndgeS egment Addie&ssE * Use Linker Cammand FileP Code AddressOhOOOOOWOP Data Address:pxOOODOOOOF SmailoSEooaooI- Small Dafe2:10

21、x00000000Biin5ry Filec None-z Generate S-Fecord FileMan Lenglh:同EOL Character:DOS_ .RAM Buffer Address: 0 x00003000Fl M I m mge Addr&ss: I(0 x00003000E niry Pointstart图 2-1 : Codewarrior 2.10 版本实用文档图 2-2 : codewarrior 10.3 版本实用文档EPPC链接器设定面板各条目的含义及用法元素Link Mode list box注释链接需要足够的 RAMS间来保存输入文件。Normal是最

22、好的选择,More RAM更适合小工程目的指定链接器使用多少内存做缓冲来写输出文件,然后写到硬盘上选项:Use Less RAM -直接将输出文件写到硬盘,不使用缓冲Normal - 512字节缓冲Use More RAM -将每个部分写到自己的缓冲,然后写回硬盘Generate DWARF Info checkboxClear -不生成调试信息 Checked -生成调试信息Use Full Path Names checkboxClear -链接器只使用文件名Checked -链接器包含路径名字在elf文件中Generate Link MapcheckboxClear -不生成map文件C

23、hecked - 生成map文件List Closure checkboxClearmap小列举程序开始点调用的曲数Checked - Map文件列举所有程序开始点调用的函数List Unused Objects checkboxClear - Map不包含没用到的目标Checked - Map列举所有没有用到的目标List DWARF Objects checkboxClear - Map 不列出 DWARF调试目标Checked - Map 在Section 里列出所有 DWARF调试目标Suppress Warning Messages checkboxClear -链接器在消息窗口显示

24、警告Checked链接器不显不警告Heap Address checkboxClear - Heap顶和堆栈底相同Checked -指te heap内存位置Stack Address checkboxClear -链接器使用默认的堆栈地址0 x003DFFF0.Checked -为堆栈指定栈顶内存地址实用文档Generate ROM ImageClear - 不生成 ROM image. Checked - 生成 ROM imagecheckboxRAM Buffer AddressClear -不指定RAM buffer地址checkboxChecked 给flash 编程器指定 RAM b

25、uffer地址。许多其他的flash编程器使用指定的,对于 Codewarrior Flash 编RAM buffer和独立的缓冲区来加载所有的二进制段到连续的flash ROM地址空间。尽管如此,在运行的ROM image的地址是一样的。(参考备注)时候系统会将这些段加载到lcf文件或者数据地址框指7E的地址。ROMmage Address checkboxClear -不指定目标地址参考备注Checked -为二进制文件指定 ROM!标地址Use Linker Command FileClear -用户指定段地址,忽略lcf文件的配置。力n里,先引而 Irf 十件中并沿蔚科升卜编幺口不匹I

26、IIJ lcf 乂1 1 ” JI 仪 7H 丁|=| TE 取见内T ) 加checkboxCharkarl AA Ipf。寺上i 1不.崇及良书b十【卜译器将报错Checked)火 lci X I I I 、J 队4!又用iULBinary File list box生成二进制文件默认不生成二进制代码* None - 不生成bin文件* One - 一个二进制文件* Multiple -多个二进制文件Generate S-Record FileClear - 不生成srecord 文件.S-record 文件以.mot扩展名存在,是早期的checkboxChecked -生成 S3 S-r

27、ecord 文件srecord文件扩展名。现在后缀名都是.s19 ,但格式内容相同Sort S-Record checkboxClear -不排序s-recored 文件.Max Length text boxChecked -地址上升排序 s-recored 文件指te S-recored的最大长度(256字节或者少于)EOL Character list box针对不同系统指定srecord 文件行尾的字符DOS - Unix - 实用文档 Mac - Entry Point text box指定程序性的入口地址 -加载程序时使用的第一个函数默认函数是_start.c中的bootstrap

28、/glue 代码。配置EABI的环境,然后执行 main()实用文档Heap如果你的程序使用malloc或者new将会使用到堆。如果使用MSC,你的程序可能会使用隐含的堆 尽管如此,MS6配程序不需要在栈下面申请堆。如果不选择检验框,堆的高地址等于栈的底部。_stack_end = _stack_addr - (stack_size * 1024);_heap_end = _stack_end;_heap_addr = _heap_end - (heap_size * 1024);如果你的代码不需要堆你可以清除堆地址检验框注意如果没有足够的空间,malloc函数会返回0.如果你不用malloc

29、 ,可以把堆的大小设定为零来给其它需要内存空间的数据代码,栈。Stack在指定栈的开始地址后,栈使用将向下增长。所以尽可能将栈顶设高如果你没有指定栈的地址,链接器将使用 0X003DFFF0但是默认值并不适合所有板子,有些芯片 RAM 很小。ROM Image应用程序的ROM Imag通常是整个应用程序镜像。一个 ROM!像通过ROM Image Address和RAM Bufferr Address来定义。ROM Image AddressROMB被分配在什么位置。通常是在.lcf文件中定义的某一个存储块的开始。RAM Buffer Address :在RAW指定一个位置,用来作为 Flas

30、h image编程器的缓冲区。RAM Buffer配置地址和ROM Image勺配置地址必须保持相同,即 RAM Buffer地址不需要考虑。第三节代码重定向如果我们想把一个函数存在flash,但是在RA附被执行,我们需要在 LC或件,程序中参考如下几条进行定义LCF文件:重定向的函数存储在 Flash中重定向的函数在 raMp被调用MEMORY reloc_flash: org = 0X0007F000, len = 0 x00001000 / reloc_ram: org = 0 x40005000, len = 0 x00001000 /实用文档) SECTIONS ( .RelocCode (VLECODE)LOAD(ADDR(reloc_flash): reloc_ram / define a section f

温馨提示

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

评论

0/150

提交评论