您好,欢迎来到锐游网。
搜索
您的当前位置:首页LCF文件使用说明

LCF文件使用说明

来源:锐游网
CodeWarrior 2.10 链接文件定义及使用

Codewarrior 2.10是飞思卡尔32位汽车级单片机Qorriva系列的编译器,与之前版本2.8、2.9完全兼容。许多新用户对codewarrior链接文件不是十分了解,本文将针对链接文件的常见问题以及段的定义进行介绍帮助用户快速了解和使用CodeWarrior。

LCF 文件定义及用法介绍

链接文件用来控制不同类型数据代码、数据以某种排列方式在最终在生成的可执行文件或者二进制文件,调试文件中的放置位置。它可以通过在EPPC linker的面板中进行配置,也可以直接在lcf文件中直接进行修改。 Memory map 查看所有变 量,函数段地址信息 EPPC Panel配置 生成.s19,.bin 或者elf .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 /* Heap start */(堆的起始地址) stack : org = 0x40007C00, len = 0x00000400 /* Stack Start */ (栈的起始地址) }

SECTIONS段的定义 {

GROUP : { // 它的定义需要遵从本例程方式”GROUP:{}” .“{}”中是内容部分 .init : {} //.init段中所有内容。

.init_vle (VLECODE) : { //.init_vle(使用VLE代码) *(.init)

Auto FAE: Alan Yang-r66151

Page 1 CodeWarrior 2.10 链接文件定义及使用

*(.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 : {

.__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); _heap_addr = ADDR(heap);

_heap_end = ADDR(heap)+SIZEOF(heap);

/* Exceptions Handlers Location (used in Exceptions.c for IVPR initialization) */

Auto FAE: Alan Yang-r66151

Page 2 CodeWarrior 2.10 链接文件定义及使用

EXCEPTION_HANDLERS = ADDR(exception_handlers); 备注

ALIGN

按照指定的边界进行排列,必须是2的整倍数。

SECTIONS { GROUP: {

.init ALIGN(0x1000) : {} .text ALIGN(0x1000) : {} } > text }

例子中定义了两个段:.init和.text。在运行的时候每个段都会被放在下一个可以使用的地址(可以被0x1000整除)

预定义的各个段的名称及解释

Section .init .text .rodata .sdata .sdata2 Description 包含初始化代码 包含程序代码 包含程序的常量 包含初始化的全局小数据

包含初始化过的全局常量(const定义内容)小数据

.data .sbss .sbss2

包含初始化过的全局数据 包含未初始化过的全局小数据

包含为初始化过的全局常量(const 定义内容)小数据

.bss 包含为初始化过的全局数据

Auto FAE: Alan Yang-r66151

Page 3 CodeWarrior 2.10 链接文件定义及使用

.ctors .dtors

包含构造函数 包含析构函数

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 2.10 链接文件定义及使用

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 // save the current state #pragma section \".data\" \"COMM\" int red; int sky;

#pragma pop // restore the previous state 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位地址范围内

• 默认的地址模式是pc_rel

pop, push 保存和恢复pragma设置

语法

#pragma push

Auto FAE: Alan Yang-r66151

Page 5 CodeWarrior 2.10 链接文件定义及使用

#pragma pop

pragma push 保存所有当前的pragma设置。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(section ) definition 参数 section_name 指定一个初始化过的数据段的名字 注意 段的名字必须用双引号 (\"\").如果使用用户自定义的段,必须是事先用#pragma定义过的 预定义的段和默认段

Type code_type \".text\" data_type \".data\" Auto FAE: Alan Yang-r66151

Name Data mode Code mode data_mode=far_abs code_mode=pc_rel data_mode=far_abs code_mode=pc_rel Page 6 CodeWarrior 2.10 链接文件定义及使用 const_type \".rodata\" sdata_type \".sdata\" sconst_type \".sdata2\" \".sbss2\" .

data_mode=far_abs code_mode=pc_rel data_mode=sda_rel code_mode=pc_rel data_mode=sda_rel code_mode=pc_rel \".PPC.EMB.sdata0\" \".PPC.EMB.sbss0\" data_mode=sda_rel code_mode=pc_rel

EPPC 链接器

使用 EPPC Linker 设置面板 (Figure 3.10)来控制设定链接相关选项,规定目标代码链接成的可执行,库或者其它的最终文件格式。

EPPC 链接器设定面板 元素 Link Mode list box 目的 注释 指定链接器使用多少内存做缓冲来写输出文件,然后链接需要足够的RAM空间来保写到硬盘上 存输入文件。Normal是最好的选项: 选择,More RAM更适合小工程 Page 7 Auto FAE: Alan Yang-r66151

CodeWarrior 2.10 链接文件定义及使用 Use Less RAM –直接将输出文件写到硬盘,不使用缓冲 • Normal – 512字节缓冲 • Use More RAM – 将每个部分写到自己的缓冲,然后写回硬盘 • Generate DWARF Info checkbox Clear – 不生成调试信息Checked – 生成调试信息 Use Full Path Clear – 链接器只使用文件名 Names Checked – 链接器包含路径名字在elf文件中 checkbox Generate Link Clear – 不生成map文件 Map checkbox Checked – 生成map文件 List Closure Clear – map不列举程序开始点调用的函数 checkbox Checked - Map 文件列举所有程序开始点调用的函数 List Unused Clear - Map 不包含没用到的目标 Objects Checked – Map 列举所有没有用到的目标 checkbox List DWARF Objects checkbox Suppress Warning Messages checkbox Clear - Map 不列出 DWARF 调试目标 Checked - Map 在Section里列出所有 DWARF 调试目标 Clear – 链接器在消息窗口显示警告 Checked – 链接器不显示警告 Heap Address Clear – Heap顶和堆栈底相同Checked – 指定heap参考表后备注. checkbox 内存位置 Stack Address Clear – 链接器使用默认的堆栈地址0x003DFFF0. 参考表后备注 checkbox Checked – 为堆栈指定栈顶内存地址 Generate ROM Clear – 不生成ROM image. Checked – 生成ROM Image image checkbox RAM Buffer Address checkbox Clear – 不指定RAM buffer地址 Checked –给flash 编程器指定RAM buffer地址。对于Codewarrior Flash编程许多其他的flash编程器使用指定的,的缓冲区器,RAM buffer和ROM image来加载所有的二进制段到连续的flash ROM地址空间。的地址是一样的。(参考备注) 尽管如此,在运行的时候系统会将这些段加载到lcf 文件或者数据地址框指定的地址。 Page 8 Auto FAE: Alan Yang-r66151

CodeWarrior 2.10 链接文件定义及使用 ROM Image Address checkbox Clear – 不指定目标地址 Checked – 为二进制文件指定ROM目标地址 参考备注 Use Linker Clear – 用户指定段地址,忽略lcf文件的配置。 如果选定,而lcf文件中并没Command File Checked – 从lcf文件中寻找段地址 有指定段地址,编译器将报错 checkbox Binary File 生成二进制文件 list box • None – 不生成bin文件 • One – 一个二进制文件 • Multiple – 多个二进制文件 Generate Clear – 不生成srecord文件. S-Record File Checked – 生成S3 S-record文件 checkbox Sort S-Record Clear – 不排序s-recored文件 checkbox Checked –地址上升排序s-recored文件 Max Length text box 默认不生成二进制代码 S-record 文件以 .mot扩展名存在,是早期的srecord文件扩展名。现在后缀名都是.s19,但格式内容相同 . 指定S-recored的最大长度(256字节或者少于) EOL Character 针对不同系统指定srecord文件行尾的字符 list box • DOS - • Unix - • Mac - Entry Point 指定程序性的入口地址-加载程序时使用的第一个函text box 数 默认函数是__start.c中的bootstrap/glue 代码。配置EABI的环境,然后执行main() Heap 如果你的程序使用malloc 或者new将会使用到堆。如果使用MSL C,你的程序可能会使用隐含的堆。尽管如此,MSL分配程序不需要在栈下面申请堆。 如果不选择检验框,堆的高地址等于栈的底部。 _stack_end = _stack_addr - (stack_size * 1024); _heap_end = _stack_end;

_heap_addr = _heap_end - (heap_size * 1024);

Auto FAE: Alan Yang-r66151

Page 9 CodeWarrior 2.10 链接文件定义及使用

如果你的代码不需要堆你可以清除堆地址检验框 注意 如果没有足够的空间,malloc函数会返回0.如果你不用malloc,可以把堆的大小设定为零来给其它需要内存空间的数据代码,栈。 Stack

在指定栈的开始地址后,栈使用将向下增长。所以尽可能将栈顶设高

如果你没有指定栈的地址,链接器将使用0x003DFFF0.但是默认值并不适合所有板子,有些芯片RAM很小。

ROM Image

应用程序的ROM Image通常是整个应用程序镜像。一个ROM镜像通过ROM Image Address 和 RAM Bufferr Address来定义。

ROM Image Address: ROM将被分配在什么位置。通常是在.lcf文件中定义的某一个存储块的开始。 RAM Buffer Address: 在RAM中指定一个位置,用来作为Flash image编程器的缓冲区。

代码重定向

范例:如果我们想把一个函数存在flash,但是在RAM中被执行 1) LCF file:

MEMORY { …

reloc_flash: org = 0x0007F000, len = 0x00001000 // Relocated functions are stored in Flash …

reloc_ram: org = 0x40005000, len = 0x00001000 // Relocated functions will be invoked from RAM … }

SECTIONS { ….

.RelocCode (VLECODE) LOAD(ADDR(reloc_flash)): {} > reloc_ram // define a section for relocated functions }

在 EPPC Linker 设定面板打开Generate ROM Image。否则LOAD指令将被忽略.

Codewarrior编译器会自动生成代码,在执行main函数之前将重定向的函数从FLASH拷贝到RAM。

Auto FAE: Alan Yang-r66151

Page 10

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- ryyc.cn 版权所有 湘ICP备2023022495号-3

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务