LCF文件使用说明.docx
- 文档编号:12899193
- 上传时间:2023-06-09
- 格式:DOCX
- 页数:17
- 大小:145.27KB
LCF文件使用说明.docx
《LCF文件使用说明.docx》由会员分享,可在线阅读,更多相关《LCF文件使用说明.docx(17页珍藏版)》请在冰点文库上搜索。
LCF文件使用说明
序言:
Codewarrior是飞思卡尔32位汽车级单片机Qorriva系列的集成开发环境,与之前版本、完全兼容。
Codewarrior是飞思卡尔最新的集成开发环境,是一个开放源代码的、基于Java的可扩展开发平台。
许多新用户对codewarrior链接文件不是十分了解,本文将针对链接文件的常见问题以及段的定义进行介绍帮助用户快速了解和使用CodeWarrior。
第一节LCF文件定义及使用说明
1:
LCF文件介绍
2:
LCF文件中各个预定义段的说明
3:
常用关键字和宏定义说明
第二节EPPC链接器介绍及使用说明
第三节代码重定向
第一节LCF文件定义及使用说明
1:
LCF文件介绍
链接文件用来控制不同类型数据代码、数据以某种排列方式在最终在生成的可执行文件或者二进制文件,调试文件中的放置位置。
它可以通过在EPPClinker的面板中进行配置,也可以直接在lcf文件中直接进行修改。
Lcf文件中首先是对整个memorymap(MEMORY)地址空间内的所有RAM,ROM进行分割,将其分为几个区域,便于放置不同类型的存储内容,而这些区域内包含的内容可以是用户自定义的段或者系统预定义的段(SECTION)。
关于段的定义和使用将在lcf文件介绍结束后进行介绍。
一个工程通常在建立的时候默认的调试方式都是在RAM中进行调试,由于RAM中执行的效率高于FLASH,并且下载速度快。
在生成的ROMImage中常量,初始化过的数据或者代码如果没有被定义在ROM区域则假设为这部分代码要在程序开始执行的时候从ROM去拷贝到RAM区。
下面是一个完整的lcf文件,其中包括每行的解释及用法。
/*lcffileforMPC5604BM27V(debugRAMversion)文件的名字及对应单片机(RAM版本)*/
{}”中是内容部分
.init:
{}nit_vle(VLECODE):
{nit)
*(.init_vle)
}
}>initGROUP中的所有内容
vor_branch_table(VLECODE)ALIGN(4096):
{}_exception_handlers(VLECODE)LOAD(_e_ivor_branch_table):
{}
ext(TEXT)ALIGN(0x10):
{}
.text_vle(VLECODE)ALIGN(0x10):
{
*(.text)
*(.text_vle)
}
.rodata(CONST):
{
*(.rdata)
*(.rodata)
}
.ctors:
{}
.dtors:
{}
extab:
{}
extabindex:
{}
}>pseudo_rom
GROUP:
{
.__uninitialized_intc_handlertableALIGN(0x10):
{}
.data:
{}
.sdata:
{}
.sbss:
{}
.sdata2:
{}
.sbss2:
{}
.bss:
{}
}>internal_ram
}
/*FreescaleCodeWarriorcompileraddressdesignations*/
_stack_addr=ADDR(stack)+SIZEOF(stack);
nit
包含初始化代码
.text
包含程序代码
.rodata
包含程序的常量
.sdata
包含初始化的全局小数据
.sdata2
包含初始化过的全局常量(const定义内容)小数据
.data
包含初始化过的全局数据
.sbss
包含未初始化过的全局小数据
.sbss2
包含未初始化过的全局常量(const定义内容)小数据
.bss
包含未初始化过的全局数据
.ctors
包含构造函数
.dtors
包含析构函数
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)都可以用来指定一个段,但是不能同时使用
语法
#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.wherexxxxxxxxisan8-digithexadecimalnumberspecifyingtheaddressofthesection.
uname
定义段的名字,编译器存储未被初始化过的目标。
下面是例子
#pragmapushata""COMM"
intred;
intsky;
#pragmapop
code_mode=codemode
向编译器指定地址模式
下面是可选的三种地址模式:
pc_rel–被调用子函数地址必须在调用函数24位地址空间范围内
near_abs–函数地址必须在24位地址范围
far_abs-函数地址必须在32位地址范围内
预定义的段和默认模式
Type
Name
Datamode
Codemode
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_mode=pc_rel
sconst_type
".sdata2"".sbss2"
data_mode=sda_rel
code_mode=pc_rel
".""."
data_mode=sda_rel
code_mode=pc_rel
2)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=0x,length=0
}
SECTIONS{
.code :
{
__rootbasecode = ADDR(ROOT);
*.(text);
} > ROOT
}
4)SIZEOF
返回指定Section或者segment的大小(以字节为单位)
SIZEOF(segmentName|sectionName)
参数
segmentName
segment的名字;必须以“.”作为起始。
sectionName
section的名字;必须以“.”作为起始。
5)LOAD
在指定地址加载一个或者多个段。
语法
LOAD(address)
参数
address
一个内存地址例如:
0x.
注意
使用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
一个存储空间地址例如:
0x.
7)pop,push
保存和恢复pragma设置
语法
#pragmapush
#pragmapop
pragmapush保存所有当前的pragma设置。
Pragmapop恢复所有pragma设置
范例
#pragmaANSI_stricton
#pragmapush/*Savesallcompilersettings.*/
#pragmaANSI_strictoff
#pragmapop/*RestoresANSI_stricttoon.*/
例程中的pragma不受任何面板设置影响,和之前其它的pragma的设定
8)__declspec(sectionname)
指定在已经定义的section中放置变量或者函数
语法
__declspec(section
__declspec(section
参数
section_name
指定一个初始化过的数据段的名字
注意
段的名字必须用双引号("").如果使用用户自定义的段,必须是事先用#pragma定义过的
9)FORCEACTIVE
指定不能被优化掉的目标.
参数
FORCEACTIVE{symbol[,symbol]*}
第二节EPPC链接器
使用EPPCLinker设置面板来控制设定链接相关选项,规定目标代码链接成的可执行文件,库或者其它的最终文件格式。
如下图所示版本(图2-1)和版本(图2-2)
图2-1:
Codewarrior版本
图2-2:
codewarrior版本
EPPC链接器设定面板各条目的含义及用法
元素
目的
注释
LinkModelistbox
指定链接器使用多少内存做缓冲来写输出文件,然后写到硬盘上
选项:
UseLessRAM–直接将输出文件写到硬盘,不使用缓冲
Normal–512字节缓冲
UseMoreRAM–将每个部分写到自己的缓冲,然后写回硬盘
链接需要足够的RAM空间来保存输入文件。
Normal是最好的选择,MoreRAM更适合小工程
GenerateDWARFInfocheckbox
Clear–不生成调试信息Checked–生成调试信息
UseFullPathNamescheckbox
Clear–链接器只使用文件名
Checked–链接器包含路径名字在elf文件中
GenerateLinkMapcheckbox
Clear–不生成map文件
Checked–生成map文件
ListClosurecheckbox
Clear–map不列举程序开始点调用的函数
Checked-Map文件列举所有程序开始点调用的函数
ListUnusedObjectscheckbox
Clear-Map不包含没用到的目标
Checked–Map列举所有没有用到的目标
ListDWARFObjectscheckbox
Clear-Map不列出DWARF调试目标
Checked-Map在Section里列出所有DWARF调试目标
SuppressWarningMessagescheckbox
Clear–链接器在消息窗口显示警告
Checked–链接器不显示警告
HeapAddresscheckbox
Clear–Heap顶和堆栈底相同Checked–指定heap内存位置
参考表后备注.
StackAddresscheckbox
Clear–链接器使用默认的堆栈地址0x003DFFF0.
Checked–为堆栈指定栈顶内存地址
参考表后备注
GenerateROMImagecheckbox
Clear–不生成ROMimage.Checked–生成ROMimage
RAMBufferAddress
checkbox
Clear–不指定RAMbuffer地址
Checked–给flash编程器指定RAMbuffer地址。
许多其他的flash编程器使用指定的,独立的缓冲区来加载所有的二进制段到连续的flashROM地址空间。
尽管如此,在运行的时候系统会将这些段加载到lcf文件或者数据地址框指定的地址。
对于CodewarriorFlash编程器,RAMbuffer和ROMimage的地址是一样的。
(参考备注)
ROMImageAddresscheckbox
Clear–不指定目标地址
Checked–为二进制文件指定ROM目标地址
参考备注
UseLinkerCommandFilecheckbox
Clear–用户指定段地址,忽略lcf文件的配置。
Checked–从lcf文件中寻找段地址
如果选定,而lcf文件中并没有指定段地址,编译器将报错
BinaryFilelistbox
生成二进制文件
None–不生成bin文件
One–一个二进制文件
Multiple–多个二进制文件
默认不生成二进制代码
GenerateS-RecordFilecheckbox
Clear–不生成srecord文件.
Checked–生成S3S-record文件
S-record文件以.mot扩展名存在,是早期的srecord文件扩展名。
现在后缀名都是.s19,但格式内容相同
SortS-Recordcheckbox
Clear–不排序s-recored文件
Checked–地址上升排序s-recored文件
.
MaxLengthtextbox
指定S-recored的最大长度(256字节或者少于)
EOLCharacterlistbox
针对不同系统指定srecord文件行尾的字符
DOS-
Unix-
Mac-
EntryPointtextbox
指定程序性的入口地址-加载程序时使用的第一个函数
默认函数是中的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
.RelocCode(VLECODE)LOAD(ADDR(reloc_flash)):
{}>reloc_ramelocCode"".RelocCode"code_mode=far_abs
__declspec(section".RelocCode")
voidDelay(intcnt)
{inti,j;
for(i=0;i LedOn(); for(j=0;j<900000;j++){ ; } LedOff(); for(j=0;j<900000;j++){ ; } } } #pragmapop 3)引用重定向函数的函数: #pragmapush #pragmasectioncode_type".RelocCode"".RelocCode"code_mode=far_abs __declspec(section".RelocCode") externvoidDelay(intcnt); #pragmapop intmain(void){ … Delay(count); … } 4)在EPPCLINKER设置面板中选中GenerateROMImage.否则LOAD指令会被忽略。 5)注意: 在第2)项中,如果Delay()同时需要调用在Flash中的函数,比如,LedOn()andLedOff().那么我们需要向下面这样定义: #pragmapush #pragmasectioncode_type".text_vle"code_mode=far_abs __declspec(section".text_vle") voidLedOn(void) { [68].=0; } voidLedOff(void) { [68].=1; } #pragmapop Andsimilarly: #pragmapush #pragmasectioncode_type".text_vle"code_mode=far_abs __declspec(section".text_vle") externLedOn(void); externLedOff(void); #pragmapop Codewarrior编译器会自动生成代码,在执行main函数之前将重定向的函数从FLASH拷贝到RAM。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- LCF 文件 使用说明