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

下载本文档

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

文档简介

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

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

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

4、中去,而在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

5、 = 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 /可以参看

6、前面的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):

7、*(.text) *(.text_vle) .rodata (CONST) : *(.rdata) *(.rodata) .ctors : .dtors : extab : extabindex : > pseudo_rom GROUP : ._uninitialized_intc_handlertable ALIGN(0x10) : .data : .sdata : .sbss : .sdata2 : .sbss2 : .bss : > internal_ram/* Freescale CodeWarrior compiler address designations */_st

8、ack_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);2LCF文件中预定

9、义的各个段的名称及解释Section Description .init 包含初始化代码 .text 包含程序代码 .rodata 包含程序的常量 .sdata 包含初始化的全局小数据 .sdata2 包含初始化过的全局常量(const定义内容)小数据 .data 包含初始化过的全局数据 .sbss 包含未初始化过的全局小数据 .sbss2 包含未初始化过的全局常量(const 定义内容)小数据 .bss 包含未初始化过的全局数据 .ctors 包含构造函数 .dtors 包含析构函数 3.常用关键字及使用说明关键字列表:1) SECTION2) ALIGN3) ADDR4) SIZEOF5)

10、 LOAD6) BIND7)Declspec8)pop, push9)FORCEACTIVE1)SECTION Section使用pragma来将编译的目标代码放到预定义的段中,然后可以在LCF文件中将对应的段放到指定的地址区域。Section和_declspec(section)都可以用来指定一个段,但是不能同时使用语法#pragma section objecttype | permission inameuname data_mode=datamodecode_mode=codemode参数objecttype 可以是以下三种选项,用来指定将目标数据放在哪里 · code_ty

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

12、变量在定义的时候被初始化过的,函数和字符串也属于初始化过的目标。 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;#pragm

13、a 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 -函数地址

14、必须在32位地址范围内预定义的段和默认模式 Type Name Data mode Code mode code_type ".text" data_mode=far_abs code_mode=pc_rel data_type ".data" data_mode=far_abs code_mode=pc_rel const_type ".rodata" data_mode=far_abs code_mode=pc_rel sdata_type ".sdata" data_mode=sda_rel code_mod

15、e=pc_rel sconst_type ".sdata2" ".sbss2" data_mode=sda_rel code_mode=pc_rel  ".PPC.EMB.sdata0" ".PPC.EMB.sbss0" data_mode=sda_rel code_mode=pc_rel 2)ALIGN 按照指定的边界进行排列,必须是2的整倍数。SECTIONSGROUP:.init ALIGN(0x1000) : .text ALIGN(0x1000) : > text例子中定义了两个段:.in

16、it和.text。在运行的时候每个段都会被放在下一个可以使用的地址(可以被0x1000整除)3)ADDR返回指定名称的段或者内存区域的开始地址. ADDR(sectionName | segmentName)参数sectionName 文件中段的标志符 segmentName 存储区域中段的标志符 范例下面代码中使用的ADDR功能来将ROOT的地址赋值给_rootbasecode . 列举ADDR() 功能 MEMORY     ROOT : origin = 0x80000400, length = 0 SECTIONS   .co

17、de :      _rootbasecode = ADDR (ROOT);      *.(text);    > ROOT 4)SIZEOF 返回指定Section或者segment的大小(以字节为单位) SIZEOF(segmentName | sectionName)参数segmentName segment的名字;必须以“.”作为起始。 sectionName section的名字;必须以“.”作为起始。5)LOAD 在

18、指定地址加载一个或者多个段。 语法LOAD(address)参数address 一个内存地址例如: 0x80000400. 注意 · 使用load指令来指定一个外部的ROM addr_mode。· Load指令可以被用于所有的在ROM中的段。· 如果编译器选项面板中的Generate ROM image 没有被选择的话,指令会被在链接中忽略。 · 从ROM拷贝到RAM中的不连续的未初始化的数据段可能需要参考ROM的地址。举例来说:保存紧跟在.text段后面的.data和.sdata段到ROM中,可以尝试下面的例子:.text LOAD(ADDR(.tex

19、t) : > rom .data LOAD(ROMADDR(.text) + SIZEOF(.text): > code .sdata LOAD(ROMADDR(.data) + SIZEOF(.data): > code 6)BIND 指定一个段修饰语来设定一个地址。 BIND(address)参数address 一个存储空间地址例如: 0x80000400. 7)pop, push 保存和恢复pragma设置 语法#pragma push#pragma pop pragma push 保存所有当前的pragma设置。Pragma pop 恢复所有pragma设置范例#pr

20、agma 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 <sect

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

22、-2:codewarrior 10.3版本Auto FAE: Alan Yang-r66151Page 16EPPC 链接器设定面板各条目的含义及用法   元素 目的 注释Link Mode list box 指定链接器使用多少内存做缓冲来写输出文件,然后写到硬盘上选项: · Use Less RAM 直接将输出文件写到硬盘,不使用缓冲 · Normal 512字节缓冲 · Use More RAM 将每个部分写到自己的缓冲,然后写回硬盘 链接需要足够的RAM空间来保存输入文件。Normal是最好的选择,More RAM更适合小工程 Generate D

23、WARF Info checkbox Clear 不生成调试信息Checked 生成调试信息  Use Full Path Names checkbox Clear 链接器只使用文件名 Checked 链接器包含路径名字在elf文件中 Generate Link Map checkbox Clear 不生成map文件 Checked 生成map文件List Closure checkbox Clear map不列举程序开始点调用的函数 Checked - Map 文件列举所有程序开始点调用的函数 List Unused Objects checkbox Clear - Map 不包含

24、没用到的目标 Checked Map 列举所有没有用到的目标 List DWARF Objects checkbox Clear - Map 不列出 DWARF 调试目标 Checked - Map 在Section里列出所有 DWARF 调试目标Suppress Warning Messages checkbox Clear 链接器在消息窗口显示警告Checked 链接器不显示警告 Heap Address checkbox Clear Heap顶和堆栈底相同Checked 指定heap内存位置 参考表后备注. Stack Address checkbox Clear 链接器使用默

25、认的堆栈地址0x003DFFF0. Checked 为堆栈指定栈顶内存地址 参考表后备注Generate ROM Image checkbox Clear 不生成ROM image. Checked 生成ROM image  RAM Buffer Addresscheckbox Clear 不指定RAM buffer地址 Checked 给flash 编程器指定RAM buffer地址。许多其他的flash编程器使用指定的,独立的缓冲区来加载所有的二进制段到连续的flash ROM地址空间。尽管如此,在运行的时候系统会将这些段加载到lcf文件或者数据地址框指定的地址。 对于Codew

26、arrior Flash编程器,RAM buffer和ROM image的地址是一样的。(参考备注) ROM Image Address checkbox Clear 不指定目标地址 Checked 为二进制文件指定ROM目标地址参考备注Use Linker Command File checkbox Clear 用户指定段地址,忽略lcf文件的配置。 Checked 从lcf文件中寻找段地址 如果选定,而lcf文件中并没有指定段地址,编译器将报错Binary File list box 生成二进制文件 · None 不生成bin文件 · One 一个二进制文件 ·

27、; Multiple 多个二进制文件 默认不生成二进制代码 Generate S-Record File checkbox Clear 不生成srecord文件. Checked 生成S3 S-record文件 S-record 文件以 .mot扩展名存在,是早期的srecord文件扩展名。现在后缀名都是.s19,但格式内容相同 Sort S-Record checkbox Clear 不排序s-recored文件Checked 地址上升排序s-recored文件 . Max Length text box 指定S-recored的最大长度(256字节或者少于) EOL Character l

28、ist box 针对不同系统指定srecord文件行尾的字符· DOS - <cr> <lf> · Unix - <lf> · Mac - <cr> Entry Point text box 指定程序性的入口地址-加载程序时使用的第一个函数 默认函数是_start.c中的bootstrap/glue 代码。配置EABI的环境,然后执行main() Heap 如果你的程序使用malloc 或者new将会使用到堆。如果使用MSL C,你的程序可能会使用隐含的堆。尽管如此,MSL分配程序不需要在栈下面申请堆。 如果不选择检

29、验框,堆的高地址等于栈的底部。 _stack_end = _stack_addr - (stack_size * 1024);_heap_end = _stack_end;_heap_addr = _heap_end - (heap_size * 1024);如果你的代码不需要堆你可以清除堆地址检验框 注意如果没有足够的空间,malloc函数会返回0.如果你不用malloc,可以把堆的大小设定为零来给其它需要内存空间的数据代码,栈。 Stack 在指定栈的开始地址后,栈使用将向下增长。所以尽可能将栈顶设高 如果你没有指定栈的地址,链接器将使用0x003DFFF0.但是默认值并不适合所有板子,有

30、些芯片RAM很小。 ROM Image应用程序的ROM Image通常是整个应用程序镜像。一个ROM镜像通过ROM Image Address 和 RAM Bufferr Address来定义。ROM Image Address: ROM将被分配在什么位置。通常是在.lcf文件中定义的某一个存储块的开始。RAM Buffer Address: 在RAM中指定一个位置,用来作为Flash image编程器的缓冲区。RAM Buffer配置地址和ROM Image的配置地址必须保持相同,即RAM Buffer地址不需要考虑。第三节 代码重定向如果我们想把一个函数存在flash,但是在RAM中被执行

31、,我们需要在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 / define a section for relocated functions 2) 包含重定向函数的C文件,例如测试代码: void Delay(void) #pragma push #pragma section code_type ".RelocCode" &

温馨提示

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

最新文档

评论

0/150

提交评论