LCF文件使用说明
更新时间:2024-07-02 13:54:01 阅读量: 综合文库 文档下载
- lcf文件用什么打开推荐度:
- 相关推荐
CodeWarrior LCF链接文件定义及使用
序言:Codewarrior 2.10是飞思卡尔32位汽车级单片机Qorriva系列的集成开发环境,与之前版本2.8、2.9完全兼容。Codewarrior 10.3是飞思卡尔最新的集成开发环境,是一个开放源代码的、基于Java的可扩展开发平台。许多新用户对codewarrior链接文件不是十分了解,本文将针对链接文件的常见问题以及段的定义进行介绍帮助用户快速了解和使用CodeWarrior。 目录
第一节 LCF文件定义及使用说明
1: LCF文件介绍 2:LCF文件中各个预定义段的说明 3:常用关键字和宏定义说明 第二节 EPPC 链接器介绍及使用说明 第三节 代码重定向 第一节 LCF 文件定义及使用说明 1:LCF文件介绍 链接文件用来控制不同类型数据代码、数据以某种排列方式在最终在生成的可执行文件或者二进制文件,调试文件中的放置位置。它可以通过在EPPC linker的面板中进行配置,也可以直接在lcf文件中直接进行修改。
Memory map 查看所有变
量,函数、段地址信息
EPPC Panel配置
.lcf配置 生成.s19,.bin 或者elf
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大小
Auto FAE: Alan Yang-r66151
Page 1 CodeWarrior LCF链接文件定义及使用
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_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 : {
Auto FAE: Alan Yang-r66151
Page 2
CodeWarrior LCF链接文件定义及使用
.__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); //详见第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);
2.LCF文件中预定义的各个段的名称及解释
Section .init .text .rodata .sdata .sdata2 .data .sbss .sbss2 .bss .ctors .dtors
Description 包含初始化代码 包含程序代码 包含程序的常量 包含初始化的全局小数据
包含初始化过的全局常量(const定义内容)小数据 包含初始化过的全局数据 包含未初始化过的全局小数据
包含未初始化过的全局常量(const 定义内容)小数据 包含未初始化过的全局数据 包含构造函数 包含析构函数
Auto FAE: Alan Yang-r66151
Page 3 CodeWarrior LCF链接文件定义及使用
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)都可以用来指定一个段,但是不能同时使用 语法
#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 LCF链接文件定义及使用
定义段的名字,编译器存储初始化过的目标。变量在定义的时候被初始化过的,函数和字符串也属于初始化过的目标。
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 \ int red;
int sky;
#pragma 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 -函数地址必须在32位地址范围内
预定义的段和默认模式
Type
code_type \data_type \const_type \
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 data_mode=far_abs code_mode=pc_rel
Page 5
CodeWarrior LCF链接文件定义及使用
sdata_type \
sconst_type \.sdata2\
2)ALIGN
按照指定的边界进行排列,必须是2的整倍数。 SECTIONS {
GROUP:
{
.init ALIGN(0x1000) : {} .text ALIGN(0x1000) : {} } > text }
例子中定义了两个段:.init和.text。在运行的时候每个段都会被放在下一个可以使用的地址(可以被0x1000整除) 3)ADDR
返回指定名称的段或者内存区域的开始地址. ADDR(sectionName | segmentName) 参数
sectionName 文件中段的标志符 segmentName
存储区域中段的标志符 范例 下面代码中使用的ADDR功能来将ROOT的地址赋值给__rootbasecode . 列举ADDR() 功能 MEMORY{
ROOT : origin = 0x80000400, length = 0 }
SECTIONS{ .code :
Auto FAE: Alan Yang-r66151
Page 6 data_mode=sda_rel code_mode=pc_rel data_mode=sda_rel code_mode=pc_rel
\data_mode=sda_rel code_mode=pc_rel
CodeWarrior LCF链接文件定义及使用
{
__rootbasecode = ADDR (ROOT); *.(text); } > ROOT }
4)SIZEOF
返回指定Section或者segment的大小(以字节为单位) SIZEOF(segmentName | sectionName) 参数
segmentName
segment的名字;必须以“.”作为起始。 sectionName
section的名字;必须以“.”作为起始。
5)LOAD
在指定地址加载一个或者多个段。 语法
LOAD(address) 参数
address
一个内存地址例如: 0x80000400. 注意 ? ? ? ?
使用load指令来指定一个外部的ROM addr_mode。 Load指令可以被用于所有的在ROM中的段。
如果编译器选项面板中的Generate ROM image 没有被选择的话,指令会被在链接中忽略。
从ROM拷贝到RAM中的不连续的未初始化的数据段可能需要参考ROM的地址。举例来说:保存紧跟在.text段后面的.data和.sdata段到ROM中,可以尝试下面的例子: .text LOAD(ADDR(.text)) : {} > rom
.data LOAD(ROMADDR(.text) + SIZEOF(.text)): {} > code .sdata LOAD(ROMADDR(.data) + SIZEOF(.data)): {} > code
Auto FAE: Alan Yang-r66151
Page 7 CodeWarrior LCF链接文件定义及使用
6)BIND
指定一个段修饰语来设定一个地址。 BIND(address) 参数 address
一个存储空间地址例如: 0x80000400.
7)pop, push
保存和恢复pragma设置 语法
#pragma push #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的设定
8)__declspec(section name) 指定在已经定义的section中放置变量或者函数 语法
__declspec(section
Auto FAE: Alan Yang-r66151
Page 8 CodeWarrior LCF链接文件定义及使用
参数
section_name
指定一个初始化过的数据段的名字 注意 段的名字必须用双引号 (\如果使用用户自定义的段,必须是事先用#pragma定义过的
9)FORCEACTIVE
指定不能被优化掉的目标. 参数
FORCEACTIVE{ symbol [, symbol]* }
第二节 EPPC 链接器
使用 EPPC Linker 设置面板来控制设定链接相关选项,规定目标代码链接成的可执行文件,库或者其它的最终文件格式。如下图所示2.10版本(图2-1)和10.3版本(图2-2)
图2-1:Codewarrior 2.10 版本
Auto FAE: Alan Yang-r66151
Page 9 CodeWarrior LCF链接文件定义及使用
图2-2:codewarrior 10.3版本 Auto FAE: Alan Yang-r66151
Page 10
CodeWarrior LCF链接文件定义及使用
EPPC 链接器设定面板各条目的含义及用法
元素
Link Mode list box
目的
指定链接器使用多少内存做缓冲来写输出文件,然后写到硬盘上 选项:
? ? ?
注释
链接需要足够的RAM空间来保存输入文件。
Normal是最好的选择,More RAM更适合小工程
Use Less RAM –直接将输出文件写到硬盘,不使用缓冲 Normal – 512字节缓冲
Use More RAM – 将每个部分写到自己的缓冲,然后写回硬盘
Generate DWARF Info checkbox
Use Full Path Names checkbox
Clear – 不生成调试信息Checked – 生成调试信息
Clear – 链接器只使用文件名
Checked – 链接器包含路径名字在elf文件中
Generate Link Map checkbox Clear – 不生成map文件
Checked – 生成map文件 List Closure checkbox
Clear – map不列举程序开始点调用的函数
Checked - Map 文件列举所有程序开始点调用的函数 Clear - Map 不包含没用到的目标
Checked – Map 列举所有没有用到的目标
Clear - Map 不列出 DWARF 调试目标
Checked - Map 在Section里列出所有 DWARF 调试目标
List Unused Objects checkbox
List DWARF Objects checkbox
Suppress Warning Messages Clear – 链接器在消息窗口显示警告 checkbox Checked – 链接器不显示警告 Heap Address checkbox
Clear – Heap顶和堆栈底相同Checked – 指定heap内存位置
参考表后备注. 参考表后备注
Page 11
Stack Address checkbox Clear – 链接器使用默认的堆栈地址0x003DFFF0.
Auto FAE: Alan Yang-r66151
CodeWarrior LCF链接文件定义及使用
Checked – 为堆栈指定栈顶内存地址
Generate ROM Image checkbox
RAM Buffer Address checkbox
Clear – 不生成ROM image. Checked – 生成ROM image
Clear – 不指定RAM buffer地址
Checked –给flash 编程器指定RAM buffer地址。许多其他的flash编程器使用指定的,对于Codewarrior Flash编程器,RAM buffer和独立的缓冲区来加载所有的二进制段到连续的flash ROM地址空间。尽管如此,在运行的ROM image的地址是一样的。(参考备注) 时候系统会将这些段加载到lcf文件或者数据地址框指定的地址。
参考备注
ROM Image Address checkbox Clear – 不指定目标地址
Checked – 为二进制文件指定ROM目标地址 Use Linker Command File Clear – 用户指定段地址,忽略lcf文件的配置。 checkbox Checked – 从lcf文件中寻找段地址 Binary File list box
生成二进制文件
? ? ?
如果选定,而lcf文件中并没有指定段地址,编
译器将报错
默认不生成二进制代码
None – 不生成bin文件 One – 一个二进制文件
Multiple – 多个二进制文件
S-record 文件以 .mot扩展名存在,是早期的srecord文件扩展名。现在后缀名都是.s19,但格式内容相同 .
Generate S-Record File checkbox Clear – 不生成srecord文件. Checked – 生成S3 S-record文件
Sort S-Record checkbox Clear – 不排序s-recored文件
Checked –地址上升排序s-recored文件 Max Length text box
指定S-recored的最大长度(256字节或者少于)
Page 12
EOL Character list box 针对不同系统指定srecord文件行尾的字符
Auto FAE: Alan Yang-r66151
CodeWarrior LCF链接文件定义及使用
? ? ?
DOS -
默认函数是__start.c中的bootstrap/glue 代码。配置EABI的环境,然后执行main()
Entry Point text box 指定程序性的入口地址-加载程序时使用的第一个函数
Auto FAE: Alan Yang-r66151
Page 13
CodeWarrior LCF链接文件定义及使用
Heap
如果你的程序使用malloc 或者new将会使用到堆。如果使用MSL C,你的程序可能会使用隐含的堆。尽管如此,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很小。 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中被执行,我们需要在LCF文件,程序中参考如下几条进行定义 1) LCF 文件:
MEMORY { …
reloc_flash: org = 0x0007F000, len = 0x00001000 //重定向的函数存储在Flash中 …
reloc_ram: org = 0x40005000, len = 0x00001000 // 重定向的函数在RAM中被调用
Auto FAE: Alan Yang-r66151
Page 14 CodeWarrior LCF链接文件定义及使用
…
}
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 \__declspec(section \void Delay(int cnt) { int i,j;
for(i=0;i for(j=0;j<900000;j++) { ; } LedOff(); for(j=0;j<900000;j++) { ; } } } #pragma pop 3) 引用重定向函数的函数: #pragma push #pragma section code_type \__declspec(section \extern void Delay(int cnt); #pragma pop int main(void) { ? Delay(count); ? } 4) 在EPPC LINKER 设置面板中选中 Generate ROM Image. 否则LOAD指令会被忽略。 Auto FAE: Alan Yang-r66151 Page 15 CodeWarrior LCF链接文件定义及使用 5) 注意: 在第 2)项中,如果 Delay()同时需要调用在Flash中的函数,比如, LedOn() and LedOff(). 那么我们需要向下面这样定义: #pragma push #pragma section code_type \__declspec(section \void LedOn(void) { SIU.GPDO[68].B.PDO = 0; } void LedOff(void) { SIU.GPDO[68].B.PDO = 1; } #pragma pop And similarly: #pragma push #pragma section code_type \__declspec(section \extern LedOn(void); extern LedOff(void); #pragma pop Codewarrior编译器会自动生成代码,在执行main函数之前将重定向的函数从FLASH拷贝到RAM。 Auto FAE: Alan Yang-r66151 Page 16 CodeWarrior LCF链接文件定义及使用 5) 注意: 在第 2)项中,如果 Delay()同时需要调用在Flash中的函数,比如, LedOn() and LedOff(). 那么我们需要向下面这样定义: #pragma push #pragma section code_type \__declspec(section \void LedOn(void) { SIU.GPDO[68].B.PDO = 0; } void LedOff(void) { SIU.GPDO[68].B.PDO = 1; } #pragma pop And similarly: #pragma push #pragma section code_type \__declspec(section \extern LedOn(void); extern LedOff(void); #pragma pop Codewarrior编译器会自动生成代码,在执行main函数之前将重定向的函数从FLASH拷贝到RAM。 Auto FAE: Alan Yang-r66151 Page 16
正在阅读:
LCF文件使用说明07-02
体育节策划书08-22
婚礼电子邀请函模板02-12
蒙氏教具操作要点08-25
中层管理人员履职待遇和业务支出管理办法04-26
jsp是sun公司制定的一种服务器端动态页面生成技术规范05-05
财政局财会实习报告汇总05-18
第二期全国中小学校党组织书记网络培训示范班试卷 满分答案2份09-05
雇主责任险与意外伤害保险之比较08-06
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 使用说明
- 文件
- LCF
- 九年级化学上册《物质构成的表示式》教案 新人教版
- 2014年高考历史二轮精品复习试卷 历史与历史重现(含答案与解析
- 2019年高级企业培训师-精选
- 高级企业培训师复习要点及案例分析(20141028)
- 2014届高三数学重点难点高频考点串讲二
- 寒假读书报告
- 高校单片机课程实践教学的改革与探讨
- 关于集团公司机关部门职能及定员职数调整的通知
- 广州市首批基础教育系统市级骨干教师名单
- 五年级下语文试题-第五单元2人教版新课标
- 甲方(建设方)项目管理方案
- (人教新课标)六年级语文上册教案 我的伯父鲁迅先生 2
- 选修7 Unit 3 Under the sea
- 银行货币学实习报告
- 完形填空命题规律及解题技巧
- 5.1交通运输方式和布局
- 文化
- 形势与政策实践项目策划书 - 图文
- 数据库概念复习习题
- 7.1.1有序实数对