版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
序言:Codewarrior2.10是飛思卡爾32位汽車級(jí)單片機(jī)Qorriva系列的集成開發(fā)環(huán)境,與之前版本2.8、2.9完全兼容。Codewarrior10.3是飛思卡爾最新的集成開發(fā)環(huán)境,是一種開放源代碼的、基于Java的可擴(kuò)展開發(fā)平臺(tái)。許多新顧客對(duì)codewarrior鏈接文獻(xiàn)不是十分理解,本文將針對(duì)鏈接文獻(xiàn)的常見(jiàn)問(wèn)題以及段的定義進(jìn)行簡(jiǎn)介協(xié)助顧客迅速理解和使用CodeWarrior。目錄LCF文獻(xiàn)定義及使用闡明1:LCF文獻(xiàn)簡(jiǎn)介2:LCF文獻(xiàn)中各個(gè)預(yù)定義段的闡明3:常用關(guān)鍵字和宏定義闡明第二節(jié)EPPC鏈接器簡(jiǎn)介及使用闡明第三節(jié)代碼重定向LCF文獻(xiàn)定義及使用闡明1:LCF文獻(xiàn)簡(jiǎn)介鏈接文獻(xiàn)用來(lái)控制不一樣類型數(shù)據(jù)代碼、數(shù)據(jù)以某種排列方式在最終在生成的可執(zhí)行文獻(xiàn)或者二進(jìn)制文獻(xiàn),調(diào)試文獻(xiàn)中的放置位置。它可以通過(guò)在EPPClinker的面板中進(jìn)行配置,也可以直接在lcf文獻(xiàn)中直接進(jìn)行修改。MMemorymap查看所有變量,函數(shù)、段地址信息EPPCPanel配置EPPCPanel配置生成.s19,.bin或者elf.lcf配置生成.s19,.bin或者elf.lcf配置Lcf文獻(xiàn)中首先是對(duì)整個(gè)memorymap(MEMORY)地址空間內(nèi)的所有RAM,ROM進(jìn)行分割,將其分為幾種區(qū)域,便于放置不一樣類型的存儲(chǔ)內(nèi)容,而這些區(qū)域內(nèi)包括的內(nèi)容可以是顧客自定義的段或者系統(tǒng)預(yù)定義的段(SECTION)。有關(guān)段的定義和使用將在lcf文獻(xiàn)簡(jiǎn)介結(jié)束后進(jìn)行簡(jiǎn)介。一種工程一般在建立的時(shí)候默認(rèn)的調(diào)試方式都是在RAM中進(jìn)行調(diào)試,由于RAM中執(zhí)行的效率高于FLASH,并且下載速度快。在生成的ROMImage中常量,初始化過(guò)的數(shù)據(jù)或者代碼假如沒(méi)有被定義在ROM區(qū)域則假設(shè)為這部分代碼要在程序開始執(zhí)行的時(shí)候從ROM去拷貝到RAM區(qū)。下面是一種完整的lcf文獻(xiàn),其中包括每行的解釋及使用方法。/*lcffileforMPC5604BM27V(debugRAMversion)文獻(xiàn)的名字及對(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,(開始地址)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文獻(xiàn)中預(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)鍵字及使用闡明關(guān)鍵字列表:1)SECTION2)ALIGN3)ADDR4)SIZEOF5)LOAD6)BIND7)Declspec8)pop,push9)FORCEACTIVE1)SECTIONSection使用pragma來(lái)將編譯的目的代碼放到預(yù)定義的段中,然后可以在LCF文獻(xiàn)中將對(duì)應(yīng)的段放到指定的地址區(qū)域。Section和__declspec(section)都可以用來(lái)指定一種段,不過(guò)不能同步使用語(yǔ)法#pragmasection[objecttype|permission][iname][uname][data_mode=datamode][code_mode=codemode]參數(shù)objecttype可以是如下三種選項(xiàng),用來(lái)指定將目的數(shù)據(jù)放在哪里code_type–可執(zhí)行目的類型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ò)的目的。變量在定義的時(shí)候被初始化過(guò)的,函數(shù)和字符串也屬于初始化過(guò)的目的。Theinameparametermaybeoftheform.abs.xxxxxxxxwherexxxxxxxxisan8-digithexadecimalnumberspecifyingtheaddressofthesection.uname定義段的名字,編譯器存儲(chǔ)未被初始化過(guò)的目的。下面是例子#pragmapush//保留目前狀態(tài)#pragmasection".data""COMM"intred;intsky;#pragmapop//恢復(fù)之前的狀態(tài)data_mode=datamode為編譯器指定使用哪種數(shù)據(jù)模式下面是可選的數(shù)據(jù)模式near_abs–目的必須在16位地址空間far_abs–目的必須在32位RAM地址空間sda_rel–目的必須在鏈接器為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ì)被放在下一種可以使用的地址(可以被0x1000整除)3)ADDR返回指定名稱的段或者內(nèi)存區(qū)域的開始地址.ADDR(sectionName|segmentName)參數(shù)sectionName文獻(xiàn)中段的標(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在指定地址加載一種或者多種段。語(yǔ)法LOAD(address)參數(shù)address一種內(nèi)存地址例如:0x80000400.注意使用load指令來(lái)指定一種外部的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指定一種段修飾語(yǔ)來(lái)設(shè)定一種地址。BIND(address)參數(shù)address一種存儲(chǔ)空間地址例如:0x80000400.7)pop,push保留和恢復(fù)pragma設(shè)置語(yǔ)法#pragmapush#pragmapoppragmapush保留所有目前的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指定一種初始化過(guò)的數(shù)據(jù)段的名字注意段的名字必須用雙引號(hào)("").假如使用顧客自定義的段,必須是事先用#pragma定義過(guò)的9)FORCEACTIVE指定不能被優(yōu)化掉的目的.參數(shù)FORCEACTIVE{symbol[,symbol]*}第二節(jié)EPPC鏈接器使用EPPCLinker設(shè)置面板來(lái)控制設(shè)定鏈接有關(guān)選項(xiàng),規(guī)定目的代碼鏈接成的可執(zhí)行文獻(xiàn),庫(kù)或者其他的最終文獻(xiàn)格式。如下圖所示2.10版本(圖2-1)和10.3版本(圖2-2)圖2-1:Codewarrior2.10版本圖2-2:codewarrior10.3版本EPPC鏈接器設(shè)定面板各條目的含義及使用方法
元素目的注釋LinkModelistbox指定鏈接器使用多少內(nèi)存做緩沖來(lái)寫輸出文獻(xiàn),然后寫到硬盤上選項(xiàng):UseLessRAM–直接將輸出文獻(xiàn)寫到硬盤,不使用緩沖Normal–512字節(jié)緩沖UseMoreRAM–將每個(gè)部分寫到自己的緩沖,然后寫回硬盤鏈接需要足夠的RAM空間來(lái)保留輸入文獻(xiàn)。Normal是最佳的選擇,MoreRAM更適合小工程GenerateDWARFInfocheckboxClear–不生成調(diào)試信息Checked–生成調(diào)試信息
UseFullPathNamescheckboxClear–鏈接器只使用文獻(xiàn)名Checked–鏈接器包括途徑名字在elf文獻(xiàn)中GenerateLinkMapcheckboxClear–不生成map文獻(xiàn)Checked–生成map文獻(xiàn)ListClosurecheckboxClear–map不列舉程序開始點(diǎn)調(diào)用的函數(shù)Checked-Map文獻(xiàn)列舉所有程序開始點(diǎn)調(diào)用的函數(shù)ListUnusedObjectscheckboxClear-Map不包括沒(méi)用到的目的Checked–Map列舉所有無(wú)用到的目的ListDWARFObjectscheckboxClear-Map不列出DWARF調(diào)試目的Checked-Map在Section里列出所有DWARF調(dià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文獻(xiàn)或者數(shù)據(jù)地址框指定的地址。
對(duì)于CodewarriorFlash編程器,RAMbuffer和ROMimage的地址是同樣的。(參照備注)ROMImageAddresscheckboxClear–不指定目的地址Checked–為二進(jìn)制文獻(xiàn)指定ROM目的地址參照備注UseLinkerCommandFilecheckboxClear–顧客指定段地址,忽視lcf文獻(xiàn)的配置。Checked–從lcf文獻(xiàn)中尋找段地址假如選定,而lcf文獻(xiàn)中并沒(méi)有指定段地址,編譯器將報(bào)錯(cuò)BinaryFilelistbox生成二進(jìn)制文獻(xiàn)None–不生成bin文獻(xiàn)One–一種二進(jìn)制文獻(xiàn)Multiple–多種二進(jìn)制文獻(xiàn)默認(rèn)不生成二進(jìn)制代碼GenerateS-RecordFilecheckboxClear–不生成srecord文獻(xiàn).Checked–生成S3S-record文獻(xiàn)S-record文獻(xiàn)以.mot擴(kuò)展名存在,是初期的srecord文獻(xiàn)擴(kuò)展名。目前后綴名都是.s19,但格式內(nèi)容相似SortS-RecordcheckboxClear–不排序s-recored文獻(xiàn)Checked–地址上升排序s-recored文獻(xiàn).MaxLengthtextbox指定S-recored的最大長(zhǎng)度(256字節(jié)或者少于)EOLCharacterlistbox針對(duì)不一樣系統(tǒng)指定srecord文獻(xiàn)行尾的字符DOS-<cr><lf>Unix-<lf>Mac-<cr>EntryPointtextbox指定程序性的入口地址-加載程序時(shí)使用的第一種函數(shù)默認(rèn)函數(shù)是__start.c中的bootstrap/glue代碼。配置EABI的環(huán)境,然后執(zhí)行main()Heap假如你的程序使用malloc或者new將會(huì)使用到堆。假如使用MSLC,你的程序也許會(huì)使用隱含的堆。盡管如此,MSL分派程序不需要在棧下面申請(qǐng)堆。假如不選擇檢查框,堆的高地址等于棧的底部。_stack_end=_stack_addr-(stack_size*1024);_heap_end=_stack_end;_heap_addr=_heap_end-(heap_size*1024);假如你的代碼不需要堆你可以清除堆地址檢查框注意假如沒(méi)有足夠的空間,malloc函數(shù)會(huì)返回0.假如你不用malloc,可以把堆的大小設(shè)定為零來(lái)給其他需要內(nèi)存空間的數(shù)據(jù)代碼,棧。Stack在指定棧的開始地址后,棧使用將向下增長(zhǎng)。因此盡量將棧頂設(shè)高假如你沒(méi)有指定棧的地址,鏈接器將使用0x003DFFF0.不過(guò)默認(rèn)值并不適合所有板子,有些芯片RAM很小。ROMImage應(yīng)用程序的ROMImage一般是整個(gè)應(yīng)用程序鏡像。一種ROM鏡像通過(guò)ROMImageAddress和RAMBufferrAddress來(lái)定義。ROMImageAddress:ROM將被分派在什么位置。一般是在.lcf文獻(xiàn)中定義的某一種存儲(chǔ)塊的開始。RAMBufferAddress:在RAM中指定一種位置,用來(lái)作為Flashimage編程器的緩沖區(qū)。RAMBuffer配置地址和ROMImage的配置地址必須保持相似,即RAMBuffer地址不需要考慮。第三節(jié)代碼重定向假如我們想把一種函數(shù)存在flash,不過(guò)在RAM中被執(zhí)行,我們需要在LCF文獻(xiàn),程序中參照如下幾條進(jìn)行定義1)LCF文獻(xiàn):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//defineasectionforrelocatedfunctions}
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024-2030年全球及中國(guó)傾斜振動(dòng)篩行業(yè)需求趨勢(shì)及投資前景預(yù)測(cè)報(bào)告
- 2024-2030年中國(guó)飾面板行業(yè)發(fā)展?fàn)顩r投資潛力分析報(bào)告
- 2024-2030年中國(guó)食品甜味劑市場(chǎng)競(jìng)爭(zhēng)策略及未來(lái)需求趨勢(shì)預(yù)測(cè)報(bào)告
- 2024-2030年中國(guó)陶瓷顏料金棕行業(yè)市場(chǎng)運(yùn)營(yíng)模式及未來(lái)發(fā)展動(dòng)向預(yù)測(cè)報(bào)告
- 2024-2030年中國(guó)鋅系常溫磷化液行業(yè)運(yùn)營(yíng)現(xiàn)狀及投資可行性研究報(bào)告版
- 2024-2030年中國(guó)鋁合金金屬型鑄件行業(yè)運(yùn)行狀況及未來(lái)發(fā)展策略分析報(bào)告
- 2024年房地產(chǎn)公司內(nèi)部資料保密協(xié)議
- 2024年數(shù)據(jù)使用協(xié)議
- 2024年彩鋼瓦分銷商協(xié)議
- 2024年快遞車輛運(yùn)輸協(xié)議
- 2024-2025學(xué)年九年級(jí)上學(xué)期期中考試英語(yǔ)試題
- 電子發(fā)票管理系統(tǒng)開發(fā)與維護(hù)合同
- 四川新農(nóng)村建設(shè)農(nóng)房設(shè)計(jì)方案圖集川西部分
- 浙江省杭州市2024年中考英語(yǔ)真題(含答案)
- 安全工程導(dǎo)論課件:事故致因理論
- 山東省青島實(shí)驗(yàn)中學(xué)2024-2025學(xué)年七年級(jí)上學(xué)期期中考試數(shù)學(xué)試題(無(wú)答案)
- 2024年安能物流合作加盟協(xié)議版
- 質(zhì)量管理體系過(guò)程方法和風(fēng)險(xiǎn)思維專業(yè)解讀與應(yīng)用之7:5 領(lǐng)導(dǎo)作用-5.3組織的崗位、職責(zé)和權(quán)限(雷澤佳編制-2024B1)
- 地面找平專項(xiàng)施工方案
- 初三化學(xué)-水的凈化省公開課獲獎(jiǎng)?wù)n件說(shuō)課比賽一等獎(jiǎng)?wù)n件
- 2024-2030年中國(guó)財(cái)稅服務(wù)行業(yè)市場(chǎng)深度調(diào)研及發(fā)展前景與投資研究報(bào)告
評(píng)論
0/150
提交評(píng)論