




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
CodeWarriorLCF鏈接文件定義及使用AutoFAE:AlanYang-r66151Page序言:Codewarrior2.10是飛思卡爾32位汽車級(jí)單片機(jī)Qorriva系列的集成開(kāi)發(fā)環(huán)境,與之前版本2.8、2.9完全兼容。Codewarrior10.3是飛思卡爾最新的集成開(kāi)發(fā)環(huán)境,是一個(gè)開(kāi)放源代碼的、基于Java的可擴(kuò)展開(kāi)發(fā)平臺(tái)。許多新用戶對(duì)codewarrior鏈接文件不是十分了解,本文將針對(duì)鏈接文件的常見(jiàn)問(wèn)題以及段的定義進(jìn)行介紹幫助用戶快速了解和使用CodeWarrior。目錄LCF文件定義及使用說(shuō)明1:LCF文件介紹2:LCF文件中各個(gè)預(yù)定義段的說(shuō)明3:常用關(guān)鍵字和宏定義說(shuō)明第二節(jié)EPPC鏈接器介紹及使用說(shuō)明第三節(jié)代碼重定向LCF文件定義及使用說(shuō)明1:LCF文件介紹鏈接文件用來(lái)控制不同類型數(shù)據(jù)代碼、數(shù)據(jù)以某種排列方式在最終在生成的可執(zhí)行文件或者二進(jìn)制文件,調(diào)試文件中的放置位置。它可以通過(guò)在EPPClinker的面板中進(jìn)行配置,也可以直接在lcf文件中直接進(jìn)行修改。MMemorymap查看所有變量,函數(shù)、段地址信息EPPCPanel配置EPPCPanel配置生成.s19,.bin或者elf.lcf配置生成.s19,.bin或者elf.lcf配置Lcf文件中首先是對(duì)整個(gè)memorymap(MEMORY)地址空間內(nèi)的所有RAM,ROM進(jìn)行分割,將其分為幾個(gè)區(qū)域,便于放置不同類型的存儲(chǔ)內(nèi)容,而這些區(qū)域內(nèi)包含的內(nèi)容可以是用戶自定義的段或者系統(tǒng)預(yù)定義的段(SECTION)。關(guān)于段的定義和使用將在lcf文件介紹結(jié)束后進(jìn)行介紹。一個(gè)工程通常在建立的時(shí)候默認(rèn)的調(diào)試方式都是在RAM中進(jìn)行調(diào)試,由于RAM中執(zhí)行的效率高于FLASH,并且下載速度快。在生成的ROMImage中常量,初始化過(guò)的數(shù)據(jù)或者代碼如果沒(méi)有被定義在ROM區(qū)域則假設(shè)為這部分代碼要在程序開(kāi)始執(zhí)行的時(shí)候從ROM去拷貝到RAM區(qū)。下面是一個(gè)完整的lcf文件,其中包括每行的解釋及用法。/*lcffileforMPC5604BM27V(debugRAMversion)文件的名字及對(duì)應(yīng)單片機(jī)(RAM版本)*///RAM版本和ROM版本的區(qū)別在于RAM版本不將程序下載到ROM中去,而在RAM中執(zhí)行程序/*512KBFlash,32KBSRAM*///單片機(jī)的FLASH和SRAM大小MEMORY下面是對(duì)單片機(jī)存儲(chǔ)空間的定義,不同的段的起始地址,不能疊加地址空間{pseudo_rom:(仿真ROM區(qū))org=0x40000000,(開(kāi)始地址)len=0x00003000(長(zhǎng)度)init:org=0x40004000,len=0x00001000//初始化段所在位置exception_handlers:org=0x40005000,len=0x00001000//中斷向量所在地址internal_ram:org=0x40006000,len=0x00001800//內(nèi)部RAM的起始地址heap:org=0x40007800,len=0x00000400//堆的起始地址stack:org=0x40007C00,len=0x00000400//棧的起始地址}SECTIONS段的定義{GROUP:{//它的定義需要遵從本例程方式”GROUP:{}”.“{}”中是內(nèi)容部分.init:{}//.init段中所有內(nèi)容。.init_vle(VLECODE):{//.init_vle(使用VLE代碼)*(.init)*(.init_vle)}}>init//可以參看前面的init段在存儲(chǔ)空間的定義.本GROUP中的所有內(nèi)容//放在init段中,”>”代表放在哪個(gè)段GROUP:{.ivor_branch_table(VLECODE)ALIGN(4096):{}//ALIGN(4096)按照4096字節(jié)對(duì)齊.__exception_handlers(VLECODE)LOAD(_e_ivor_branch_table):{}//LOAD()將本段加載到指定地址}>exception_handlersGROUP:{.text(TEXT)ALIGN(0x10):{}.text_vle(VLECODE)ALIGN(0x10):{*(.text) *(.text_vle)}.rodata(CONST):{*(.rdata)*(.rodata)}.ctors:{}.dtors:{}extab:{}extabindex:{}}>pseudo_romGROUP:{.__uninitialized_intc_handlertableALIGN(0x10):{}.data:{}.sdata:{}.sbss:{}.sdata2:{}.sbss2:{}.bss:{}}>internal_ram}/*FreescaleCodeWarriorcompileraddressdesignations*/_stack_addr=ADDR(stack)+SIZEOF(stack);//ADDR()是取括號(hào)內(nèi)段的首地址//SIZEOF()是求某段的長(zhǎng)度_stack_end=ADDR(stack);//詳見(jiàn)第3小節(jié)_heap_addr=ADDR(heap);_heap_end=ADDR(heap)+SIZEOF(heap);/*ExceptionsHandlersLocation(usedinExceptions.cforIVPRinitialization)*/EXCEPTION_HANDLERS=ADDR(exception_handlers);2.LCF文件中預(yù)定義的各個(gè)段的名稱及解釋SectionDescription.init包含初始化代碼.text包含程序代碼.rodata包含程序的常量.sdata包含初始化的全局小數(shù)據(jù).sdata2包含初始化過(guò)的全局常量(const定義內(nèi)容)小數(shù)據(jù).data包含初始化過(guò)的全局?jǐn)?shù)據(jù).sbss包含未初始化過(guò)的全局小數(shù)據(jù).sbss2包含未初始化過(guò)的全局常量(const定義內(nèi)容)小數(shù)據(jù).bss包含未初始化過(guò)的全局?jǐn)?shù)據(jù).ctors包含構(gòu)造函數(shù).dtors包含析構(gòu)函數(shù)3.常用關(guān)鍵字及使用說(shuō)明關(guān)鍵字列表:1)SECTION2)ALIGN3)ADDR4)SIZEOF5)LOAD6)BIND7)Declspec8)pop,push9)FORCEACTIVE1)SECTIONSection使用pragma來(lái)將編譯的目標(biāo)代碼放到預(yù)定義的段中,然后可以在LCF文件中將對(duì)應(yīng)的段放到指定的地址區(qū)域。Section和__declspec(section)都可以用來(lái)指定一個(gè)段,但是不能同時(shí)使用語(yǔ)法#pragmasection[objecttype|permission][iname][uname][data_mode=datamode][code_mode=codemode]參數(shù)objecttype可以是以下三種選項(xiàng),用來(lái)指定將目標(biāo)數(shù)據(jù)放在哪里code_type–可執(zhí)行目標(biāo)類型data_type–非常量數(shù)據(jù),包含比smalldata大的數(shù)據(jù)sdata_type–非常量數(shù)據(jù),包含比smalldata小或者等同的數(shù)據(jù)。const_type–常量數(shù)據(jù),包含比smallconst大的數(shù)據(jù)sconst_type–常量數(shù)據(jù),包含小或者等同smalldata的數(shù)據(jù)all_types–所有數(shù)據(jù)和代碼permission定義訪問(wèn)權(quán)限,包含下列三個(gè)選項(xiàng)R–只讀W–可寫X–可執(zhí)行iname定義段的名字,編譯器存儲(chǔ)初始化過(guò)的目標(biāo)。變量在定義的時(shí)候被初始化過(guò)的,函數(shù)和字符串也屬于初始化過(guò)的目標(biāo)。Theinameparametermaybeoftheform.abs.xxxxxxxxwherexxxxxxxxisan8-digithexadecimalnumberspecifyingtheaddressofthesection.uname定義段的名字,編譯器存儲(chǔ)未被初始化過(guò)的目標(biāo)。下面是例子#pragmapush//保存當(dāng)前狀態(tài)#pragmasection".data""COMM"intred;intsky;#pragmapop//恢復(fù)之前的狀態(tài)data_mode=datamode為編譯器指定使用哪種數(shù)據(jù)模式下面是可選的數(shù)據(jù)模式near_abs–目標(biāo)必須在16位地址空間far_abs–目標(biāo)必須在32位RAM地址空間sda_rel–目標(biāo)必須在鏈接器為smalldata定義的32K地址空間.code_mode=codemode向編譯器指定地址模式下面是可選的三種地址模式:pc_rel–被調(diào)用子函數(shù)地址必須在調(diào)用函數(shù)24位地址空間范圍內(nèi)near_abs–函數(shù)地址必須在24位地址范圍far_abs-函數(shù)地址必須在32位地址范圍內(nèi)預(yù)定義的段和默認(rèn)模式TypeNameDatamodeCodemodecode_type".text"data_mode=far_abscode_mode=pc_reldata_type".data"data_mode=far_abscode_mode=pc_relconst_type".rodata"data_mode=far_abscode_mode=pc_relsdata_type".sdata"data_mode=sda_relcode_mode=pc_relsconst_type".sdata2"".sbss2"data_mode=sda_relcode_mode=pc_rel
".PPC.EMB.sdata0"".PPC.EMB.sbss0"data_mode=sda_relcode_mode=pc_rel2)ALIGN按照指定的邊界進(jìn)行排列,必須是2的整倍數(shù)。SECTIONS{GROUP:{.initALIGN(0x1000):{}.textALIGN(0x1000):{}}>text}例子中定義了兩個(gè)段:.init和.text。在運(yùn)行的時(shí)候每個(gè)段都會(huì)被放在下一個(gè)可以使用的地址(可以被0x1000整除)3)ADDR返回指定名稱的段或者內(nèi)存區(qū)域的開(kāi)始地址.ADDR(sectionName|segmentName)參數(shù)sectionName文件中段的標(biāo)志符segmentName存儲(chǔ)區(qū)域中段的標(biāo)志符范例下面代碼中使用的ADDR功能來(lái)將ROOT的地址賦值給__rootbasecode.列舉ADDR()功能MEMORY{
ROOT:origin=0x80000400,length=0}SECTIONS{
.code
:
{
__rootbasecode
=
ADDR(ROOT);
*.(text);
}
>
ROOT}4)SIZEOF返回指定Section或者segment的大?。ㄒ宰止?jié)為單位)SIZEOF(segmentName|sectionName)參數(shù)segmentNamesegment的名字;必須以“.”作為起始。sectionNamesection的名字;必須以“.”作為起始。5)LOAD在指定地址加載一個(gè)或者多個(gè)段。語(yǔ)法LOAD(address)參數(shù)address一個(gè)內(nèi)存地址例如:0x80000400.注意使用load指令來(lái)指定一個(gè)外部的ROMaddr_mode。Load指令可以被用于所有的在ROM中的段。如果編譯器選項(xiàng)面板中的GenerateROMimage沒(méi)有被選擇的話,指令會(huì)被在鏈接中忽略。從ROM拷貝到RAM中的不連續(xù)的未初始化的數(shù)據(jù)段可能需要參考ROM的地址。舉例來(lái)說(shuō):保存緊跟在.text段后面的.data和.sdata段到ROM中,可以嘗試下面的例子:.textLOAD(ADDR(.text)):{}>rom.dataLOAD(ROMADDR(.text)+SIZEOF(.text)):{}>code.sdataLOAD(ROMADDR(.data)+SIZEOF(.data)):{}>code
6)BIND指定一個(gè)段修飾語(yǔ)來(lái)設(shè)定一個(gè)地址。BIND(address)參數(shù)address一個(gè)存儲(chǔ)空間地址例如:0x80000400.7)pop,push保存和恢復(fù)pragma設(shè)置語(yǔ)法#pragmapush#pragmapoppragmapush保存所有當(dāng)前的pragma設(shè)置。Pragmapop恢復(fù)所有pragma設(shè)置范例#pragmaANSI_stricton#pragmapush/*Savesallcompilersettings.*/#pragmaANSI_strictoff#pragmapop/*RestoresANSI_stricttoon.*/例程中的pragma不受任何面板設(shè)置影響,和之前其它的pragma的設(shè)定8)__declspec(sectionname)指定在已經(jīng)定義的section中放置變量或者函數(shù)語(yǔ)法__declspec(section<section_name>)declaration__declspec(section<section_name>)definition參數(shù)section_name指定一個(gè)初始化過(guò)的數(shù)據(jù)段的名字注意段的名字必須用雙引號(hào)("").如果使用用戶自定義的段,必須是事先用#pragma定義過(guò)的9)FORCEACTIVE指定不能被優(yōu)化掉的目標(biāo).參數(shù)FORCEACTIVE{symbol[,symbol]*}第二節(jié)EPPC鏈接器使用EPPCLinker設(shè)置面板來(lái)控制設(shè)定鏈接相關(guān)選項(xiàng),規(guī)定目標(biāo)代碼鏈接成的可執(zhí)行文件,庫(kù)或者其它的最終文件格式。如下圖所示2.10版本(圖2-1)和10.3版本(圖2-2)圖2-1:Codewarrior2.10版本圖2-2:codewarrior10.3版本EPPC鏈接器設(shè)定面板各條目的含義及用法
元素目的注釋LinkModelistbox指定鏈接器使用多少內(nèi)存做緩沖來(lái)寫輸出文件,然后寫到硬盤上選項(xiàng):UseLessRAM–直接將輸出文件寫到硬盤,不使用緩沖Normal–512字節(jié)緩沖UseMoreRAM–將每個(gè)部分寫到自己的緩沖,然后寫回硬盤鏈接需要足夠的RAM空間來(lái)保存輸入文件。Normal是最好的選擇,MoreRAM更適合小工程GenerateDWARFInfocheckboxClear–不生成調(diào)試信息Checked–生成調(diào)試信息
UseFullPathNamescheckboxClear–鏈接器只使用文件名Checked–鏈接器包含路徑名字在elf文件中GenerateLinkMapcheckboxClear–不生成map文件Checked–生成map文件ListClosurecheckboxClear–map不列舉程序開(kāi)始點(diǎn)調(diào)用的函數(shù)Checked-Map文件列舉所有程序開(kāi)始點(diǎn)調(diào)用的函數(shù)ListUnusedObjectscheckboxClear-Map不包含沒(méi)用到的目標(biāo)Checked–Map列舉所有沒(méi)有用到的目標(biāo)ListDWARFObjectscheckboxClear-Map不列出DWARF調(diào)試目標(biāo)Checked-Map在Section里列出所有DWARF調(diào)試目標(biāo)SuppressWarningMessagescheckboxClear–鏈接器在消息窗口顯示警告Checked–鏈接器不顯示警告
HeapAddresscheckboxClear–Heap頂和堆棧底相同Checked–指定heap內(nèi)存位置參考表后備注.StackAddresscheckboxClear–鏈接器使用默認(rèn)的堆棧地址0x003DFFF0.Checked–為堆棧指定棧頂內(nèi)存地址參考表后備注GenerateROMImagecheckboxClear–不生成ROMimage.Checked–生成ROMimage
RAMBufferAddresscheckboxClear–不指定RAMbuffer地址Checked–給flash編程器指定RAMbuffer地址。許多其他的flash編程器使用指定的,獨(dú)立的緩沖區(qū)來(lái)加載所有的二進(jìn)制段到連續(xù)的flashROM地址空間。盡管如此,在運(yùn)行的時(shí)候系統(tǒng)會(huì)將這些段加載到lcf文件或者數(shù)據(jù)地址框指定的地址。
對(duì)于CodewarriorFlash編程器,RAMbuffer和ROMimage的地址是一樣的。(參考備注)ROMImageAddresscheckboxClear–不指定目標(biāo)地址Checked–為二進(jìn)制文件指定ROM目標(biāo)地址參考備注UseLinkerCommandFilecheckboxClear–用戶指定段地址,忽略lcf文件的配置。Checked–從lcf文件中尋找段地址如果選定,而lcf文件中并沒(méi)有指定段地址,編譯器將報(bào)錯(cuò)BinaryFilelistbox生成二進(jìn)制文件None–不生成bin文件One–一個(gè)二進(jìn)制文件Multiple–多個(gè)二進(jìn)制文件默認(rèn)不生成二進(jìn)制代碼GenerateS-RecordFilecheckboxClear–不生成srecord文件.Checked–生成S3S-record文件S-record文件以.mot擴(kuò)展名存在,是早期的srecord文件擴(kuò)展名?,F(xiàn)在后綴名都是.s19,但格式內(nèi)容相同SortS-RecordcheckboxClear–不排序s-recored文件Checked–地址上升排序s-recored文件.MaxLengthtextbox指定S-recored的最大長(zhǎng)度(256字節(jié)或者少于)EOLCharacterlistbox針對(duì)不同系統(tǒng)指定srecord文件行尾的字符DOS-<cr><lf>Unix-<lf>Mac-<cr>EntryPointtextbox指定程序性的入口地址-加載程序時(shí)使用的第一個(gè)函數(shù)默認(rèn)函數(shù)是__start.c中的bootstrap/glue代碼。配置EABI的環(huán)境,然后執(zhí)行main()Heap如果你的程序使用malloc或者new將會(huì)使用到堆。如果使用MSLC,你的程序可能會(huì)使用隱含的堆。盡管如此,MSL分配程序不需要在棧下面申請(qǐng)堆。如果不選擇檢驗(yàn)框,堆的高地址等于棧的底部。_stack_end=_stack_addr-(stack_size*1024);_heap_end=_stack_end;_heap_addr=_heap_end-(heap_size*1024);如果你的代碼不需要堆你可以清除堆地址檢驗(yàn)框注意如果沒(méi)有足夠的空間,malloc函數(shù)會(huì)返回0.如果你不用malloc,可以把堆的大小設(shè)定為零來(lái)給其它需要內(nèi)存空間的數(shù)據(jù)代碼,棧。Stack在指定棧的開(kāi)始地址后,棧使用將向下增長(zhǎng)。所以盡可能將棧頂設(shè)高如果你沒(méi)有指定棧的地址,鏈接器將使用0x003DFFF0.但是默認(rèn)值并不適合所有板子,有些芯片RAM很小。ROMImage應(yīng)用程序的ROMImage通常是整個(gè)應(yīng)用程序鏡像。一個(gè)ROM鏡像通過(guò)ROMImageAddress和RAMBufferrAddress來(lái)定義。ROMImageAddress:ROM將被分配在什么位置。通常是在.lcf文件中定義的某一個(gè)存儲(chǔ)塊的開(kāi)始。RAMBufferAddress:在RAM中指定一個(gè)位置,用來(lái)作為Flashimage編程器的緩沖區(qū)。RAMBuffer配置地址和ROMImage的配置地址必須保持相同,即RAMBuffer地址不需要考慮。第三節(jié)代碼重定向如果我們想把一個(gè)函數(shù)存在flash,但是在RAM中被執(zhí)行,我們需要在LCF文件,程序中參考如下幾條進(jìn)行定義1)LCF文件:MEMORY{…reloc_flash:org=0x0007F000,len=0x00001000//重定向的函數(shù)存儲(chǔ)在Flash中…reloc_ram:org=0x40005000,len=0x00001000//重定向的函數(shù)在RAM中被調(diào)用…}SECTIONS{…..RelocCode(VLECODE)LOAD(ADDR(reloc_flash)):{}>reloc_ram//defineasectionforrelocatedfuncti
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度茶樓租賃合同茶樓與茶藝培訓(xùn)學(xué)校合作框架協(xié)議
- 二零二五年度在線教育平臺(tái)師資聘用協(xié)議
- 食用菌種植技術(shù)服務(wù)合同
- 英語(yǔ)語(yǔ)法中的定語(yǔ)從句詳解:九年級(jí)英語(yǔ)語(yǔ)法基礎(chǔ)強(qiáng)化教案
- 幼兒園繪本閱讀感悟分享
- 產(chǎn)品分銷銷售服務(wù)條款及目標(biāo)協(xié)定
- 數(shù)據(jù)驅(qū)動(dòng)的環(huán)保產(chǎn)業(yè)發(fā)展戰(zhàn)略協(xié)議
- 提升職場(chǎng)技能與素質(zhì)
- 數(shù)理化習(xí)題集:高三化學(xué)知識(shí)點(diǎn)強(qiáng)化練習(xí)計(jì)劃
- 家電產(chǎn)品渠道經(jīng)銷協(xié)議
- 人工智能在維修行業(yè)的應(yīng)用
- 福建省泉州市第五中學(xué)2023-2024學(xué)年八年級(jí)下學(xué)期期中語(yǔ)文試題
- 2024CSCO惡性腫瘤患者營(yíng)養(yǎng)治療指南解讀
- 自我解壓與情緒管理課件
- 2024年時(shí)政必考試題庫(kù)ab卷
- 語(yǔ)法選擇10篇(名校模擬)-2024年中考英語(yǔ)逆襲沖刺名校模擬真題速遞(廣州專用)
- 通達(dá)信公式函數(shù)說(shuō)明大全
- 體育初中學(xué)生學(xué)情分析總結(jié)報(bào)告
- MOOC 中國(guó)文化概論-武漢大學(xué) 中國(guó)大學(xué)慕課答案
- 高三心理健康輔導(dǎo)講座省公開(kāi)課一等獎(jiǎng)全國(guó)示范課微課金獎(jiǎng)
- 《工程建設(shè)標(biāo)準(zhǔn)強(qiáng)制性條文電力工程部分2023年版》
評(píng)論
0/150
提交評(píng)論