八、嵌入式程序設(shè)計(jì)與分析_第1頁(yè)
八、嵌入式程序設(shè)計(jì)與分析_第2頁(yè)
八、嵌入式程序設(shè)計(jì)與分析_第3頁(yè)
八、嵌入式程序設(shè)計(jì)與分析_第4頁(yè)
八、嵌入式程序設(shè)計(jì)與分析_第5頁(yè)
已閱讀5頁(yè),還剩49頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

嵌入式系統(tǒng)設(shè)計(jì)與實(shí)例開(kāi)發(fā)——ARM與C/OS-Ⅱ第八講程序設(shè)計(jì)與分析北京航空航天大學(xué)嵌入式機(jī)電控制研究室本節(jié)提要132程序編譯技術(shù)程序優(yōu)化技術(shù)Linux初步嵌入式軟件的要求功能性要求:滿足系統(tǒng)所要求的功能。時(shí)限性要求:滿足系統(tǒng)的實(shí)時(shí)性要求。存儲(chǔ)器要求:適應(yīng)系統(tǒng)內(nèi)存總量要求。功耗要求:滿足系統(tǒng)能耗的要求。嵌入式編程 語(yǔ)言的選擇高級(jí)語(yǔ)言:C、C++、JAVA、Ada等。匯編語(yǔ)言:硬件體系結(jié)構(gòu)相關(guān)。程序的編譯執(zhí)行過(guò)程嵌入式C編譯環(huán)境

嵌入式C交叉編譯環(huán)境一般都包括匯編器、鏈接器和定位器。匯編器的任務(wù)是將符號(hào)級(jí)的匯編語(yǔ)言翻譯成稱(chēng)為目標(biāo)代碼的指令位級(jí)表示。鏈接器是用來(lái)將不同的模塊(編譯或匯編過(guò)的文件)鏈接成目標(biāo)文件。定位器則允許將代碼和數(shù)據(jù)放置在目標(biāo)處理器的指定內(nèi)存空間。匯編程序匯編完成匯編語(yǔ)言到二進(jìn)制代碼的轉(zhuǎn)換。標(biāo)記處理方法:第一次掃描代碼以決定每個(gè)標(biāo)記的地址。第二次用第一次中的標(biāo)記值匯編指令,產(chǎn)生二進(jìn)制代碼。符號(hào)表 ADDr0,r1,r2Label1ADDr3,r4,r5 CMPr0,r3Label2SUBr5,r6,r7assemblycodeLabel10x8Label20x10symboltable編譯過(guò)程高級(jí)編程語(yǔ)言語(yǔ)法分析、生成符號(hào)表和語(yǔ)義分析獨(dú)立于機(jī)器的優(yōu)化指令級(jí)優(yōu)化和代碼生成匯編代碼ARM開(kāi)發(fā)環(huán)境包含的C/C++編譯器編譯=翻譯+優(yōu)化編譯結(jié)合了翻譯和優(yōu)化兩個(gè)環(huán)節(jié)翻譯是將高級(jí)語(yǔ)言翻譯為低級(jí)指令形式(或匯編語(yǔ)言形式)。優(yōu)化一方面產(chǎn)生更好的指令順序,另一方面從整體上考慮程序效率。編譯過(guò)程中,高級(jí)語(yǔ)言被拆分成語(yǔ)句和表達(dá)式。編譯技術(shù)——語(yǔ)句翻譯a*b+5*(c-d)expressionDFG*-*+abcd52341算術(shù)表達(dá)式的代碼翻譯ADRr4,aMOVr1,[r4]ADRr4,bMOVr2,[r4]MULr3,r1,r2DFG*-*+abcd5ADRr4,cMOVr1,[r4]ADRr4,dMOVr5,[r4]SUBr6,r4,r5MULr7,r6,#5ADDr8,r7,r3code控制代碼的產(chǎn)生if(a+b>0) x=5;else x=7;a+b>0x=5x=7321控制代碼的翻譯 ADRr5,a LDRr1,[r5] ADRr5,b LDRr2,b ADDr3,r1,r2 BLElabel3a+b>0x=5x=7 LDRr3,#5 ADRr5,x STRr3,[r5] Bstmtent label3LDRr3,#7 ADRr5,x STRr3,[r5]stmtent...過(guò)程鏈接過(guò)程一般指不返回值的結(jié)構(gòu)。要求代碼:調(diào)用并返回。傳遞參數(shù)和結(jié)果。參數(shù)和結(jié)果是在堆棧中傳遞的。帶有幾個(gè)參數(shù)的過(guò)程可以使用寄存器。過(guò)程堆棧proc1growthproc1(inta){proc2(5);}proc2SPstackpointerFPframepointer5accessedrelativetoSP編譯技術(shù)——ARM過(guò)程調(diào)用標(biāo)準(zhǔn)(APCS)APCS,ARM過(guò)程調(diào)用標(biāo)準(zhǔn)(ARMProcedureCallStandard),提供了緊湊的編寫(xiě)例程的一種機(jī)制,定義的例程可以與其他例程交織在一起。最顯著的一點(diǎn)是對(duì)這些例程來(lái)自哪里沒(méi)有明確的限制。它們可以編譯自C、Pascal,也可以是用匯編語(yǔ)言寫(xiě)成的。APCS定義了:r0-r3passparametersintoprocedure.Extraparametersareputonstackframe.r0holdsreturnvalue.r4-r7holdregistervalues.r11isframepointer,r13isstackpointer.編譯技術(shù)——數(shù)據(jù)結(jié)構(gòu)編譯程序必須對(duì)相關(guān)數(shù)據(jù)結(jié)構(gòu)的引用翻譯成對(duì)原始存儲(chǔ)器的引用,通常需要在運(yùn)行時(shí)進(jìn)行地址計(jì)算。一維數(shù)組二維數(shù)組結(jié)構(gòu)體A[0]A[1]Field1Field2]A[0,0]A[0,1]A[1,0]A[1,0]編譯技術(shù)——表達(dá)式簡(jiǎn)化1.A*B+A*CA*(B+C)2.for(i=0;i<8+1;i++)for(i=0;i<9;i++)編譯技術(shù)——死代碼清除死代碼是指永遠(yuǎn)不會(huì)被執(zhí)行的代碼,在編譯時(shí)要能夠識(shí)別這些代碼,并將其從程序中清除掉。死代碼大都是一些調(diào)試信息。編譯技術(shù)——循環(huán)變換循環(huán)是重要的程序結(jié)構(gòu),經(jīng)常占用大量的CPU的計(jì)算時(shí)間,在編程時(shí)需要優(yōu)化;循環(huán)展開(kāi):循環(huán)合并:循環(huán)折疊:for(i=0;i<N;i++)a[i]=b[i]*5;for(j=0;j<N;j++)w[j]=c[j]*d[j];efor(i=0;i<N;i++){ a[i]=b[i]*5;w[i]=c[i]*d[i]; }for(i=0;i<4;i++) a[i]=b[i]*c[i];efor(i=0;i<2;i++){ a[i*2]=b[i*2]*c[i*2]; a[i*2+1]=b[i*2+1]*c[i*2+1];編譯技術(shù)——寄存器分配寄存器分配選擇寄存器變量的分配以使所需的寄存器總數(shù)最少;w=a+b;x=c+w;y=c+d;ar0br1cr2dr0wr3xr0yr3timeabcdwxy123t=1t=2t=3本節(jié)提要132程序編譯技術(shù)程序優(yōu)化技術(shù)Linux初步程序優(yōu)化Optimizingforexecutiontime.Optimizingforenergy/power.Optimizingforprogramsize.影響程序運(yùn)行時(shí)間的主要因素源代碼:編寫(xiě)高效優(yōu)化的高級(jí)語(yǔ)言源代碼可以縮短程序運(yùn)行的時(shí)間。編譯器:編譯器負(fù)責(zé)把高級(jí)語(yǔ)言代碼轉(zhuǎn)換成機(jī)器代碼程序,不同的編譯器會(huì)導(dǎo)致代碼效率的不同。硬件的體系結(jié)構(gòu):硬件的體系結(jié)構(gòu)對(duì)程序的運(yùn)行時(shí)間有較大的影響,如CPU內(nèi)部寄存器的數(shù)量、高速緩存的大小和組織、系統(tǒng)的內(nèi)存大小等。操作系統(tǒng):操作系統(tǒng)決定了任務(wù)調(diào)度與內(nèi)存管理等對(duì)程序執(zhí)行時(shí)間有重要影響,結(jié)合硬件的體系結(jié)構(gòu),決定了系統(tǒng)的中斷響應(yīng)時(shí)間。程序優(yōu)化的基本策略1.高級(jí)程序設(shè)計(jì):選擇適當(dāng)?shù)乃惴ㄅc數(shù)據(jù)結(jié)構(gòu),避免使用可能會(huì)漸進(jìn)產(chǎn)生較差性能的算法與編碼技術(shù)。2.基本編碼原則:避免采用限制編譯器優(yōu)化的因素,從而令編譯器產(chǎn)生高效的代碼;消除連續(xù)的函數(shù)調(diào)用:如將計(jì)算移動(dòng)循環(huán)外。消除不必要的存儲(chǔ)器引用:引入臨時(shí)變量來(lái)保存中間結(jié)果,只有當(dāng)最后的值計(jì)算出來(lái)時(shí),才將結(jié)果存放到數(shù)組或全局變量中。3.低級(jí)優(yōu)化:嘗試各種與數(shù)組代碼相對(duì)的指針形式。通過(guò)展開(kāi)循環(huán)降低循環(huán)開(kāi)銷(xiāo)。通過(guò)迭代分割的技術(shù),找到使用流水線優(yōu)化的功能單元的方法。程序剖析(Profiling)1.程序剖析用來(lái)分析程序的各個(gè)部分需要多少CPU時(shí)間,程序剖析一邊可以在現(xiàn)實(shí)的基準(zhǔn)數(shù)據(jù)上運(yùn)行實(shí)際的程序,一邊進(jìn)行剖析。2.GPROF——UNIX提供的剖析程序:確定程序中每個(gè)函數(shù)花費(fèi)了多少CPU時(shí)間。計(jì)算每個(gè)函數(shù)被調(diào)用的次數(shù),以調(diào)用函數(shù)來(lái)分類(lèi)。Amdahl定律Amdahl定律主要用于描述提高系統(tǒng)某一部分性能對(duì)整個(gè)系統(tǒng)性能的影響;例:設(shè)一個(gè)系統(tǒng)執(zhí)行某個(gè)應(yīng)用程序需要時(shí)間Told,而系統(tǒng)的某個(gè)部分運(yùn)行所需要時(shí)間的百分比為a,如果性能提高了k倍,則這個(gè)部分原來(lái)需要時(shí)間aTold,而現(xiàn)在需要時(shí)間(aTold)/K。因此,整個(gè)程序執(zhí)行時(shí)間為:Tnew=(1-a)Told+(aTold)/k=Told[(1-a)+a/k]所以程序加速比為:S=Told/Tnew=1/[(1-a)+a/k]即:如果以前占系統(tǒng)60%時(shí)間的部分性能提高了3倍(k=3),則程序加速比為1.67。所以要想提高整個(gè)系統(tǒng)的速度,光大幅度提高某一部分的速度是不夠的。影響程序性能的要素程序的執(zhí)行時(shí)間=程序路徑+指令耗時(shí)路徑是被程序(或者說(shuō)它等價(jià)于程序的高級(jí)語(yǔ)言表示)執(zhí)行的指令序列。指令耗時(shí)基于被程序路徑跟蹤的指令序列,它考慮數(shù)據(jù)相關(guān)性、流水線行為和高速緩存。本節(jié)提要132程序編譯技術(shù)程序優(yōu)化技術(shù)Linux初步嵌入式Linux分類(lèi)第一類(lèi)是在利用Linux強(qiáng)大功能的前提下,使它盡可能得小,以滿足許多嵌入式系統(tǒng)對(duì)體積的要求,如μCLinux()。第二類(lèi)是將Linux開(kāi)發(fā)成實(shí)時(shí)系統(tǒng)尤其是硬(firm)實(shí)時(shí)系統(tǒng),應(yīng)用于一些關(guān)鍵的控制場(chǎng)合,如Fsmlabs公司()的RTLinux、MontaVista()的HardHatLinux等。第三類(lèi)的產(chǎn)品就是將實(shí)時(shí)性和嵌入式方案結(jié)合起來(lái)的方案,很多公司都這么做,并且提供集成化的開(kāi)發(fā)方案,如Lineo、TimeSys等。全球每年生產(chǎn)的CPU的數(shù)量在二十億顆左右,超過(guò)80%應(yīng)用于專(zhuān)用性很強(qiáng)的各類(lèi)嵌入式系統(tǒng)。其中,又有相當(dāng)一部分面向低端市場(chǎng)。為降低硬件成本及運(yùn)行功耗,有一類(lèi)CPU在設(shè)計(jì)中取消了內(nèi)存管理單元(MemoryManagementUnit,簡(jiǎn)稱(chēng)MMU)功能模塊。如Motorola公司的M68328、M68EN322、MC68360、DragonBall系列如68EZ328、68VZ328,ColdFire系列的如5272、5307,ARM7TDMI和MC68EN302、ETRAX、Inteli960、PRISMA、Atari68k等。標(biāo)準(zhǔn)Linux針對(duì)有MMU的處理器設(shè)計(jì)。在這種處理器上,虛擬地址被送到MMU,把虛擬地址映射為物理地址。通過(guò)賦予每個(gè)任務(wù)不同的虛擬地址/物理地址轉(zhuǎn)換映射,可支持不同任務(wù)之間的保護(hù)。為什么要使用μCLinux最初,運(yùn)行于這類(lèi)沒(méi)有MMU的CPU之上的都是一些很簡(jiǎn)單的單任務(wù)操作系統(tǒng),或者更簡(jiǎn)單的控制程序,甚至根本就沒(méi)有操作系統(tǒng)而直接運(yùn)行應(yīng)用程序。在這種情況下,系統(tǒng)無(wú)法運(yùn)行復(fù)雜的應(yīng)用程序,或者效率很低,而且,所有的應(yīng)用程序需要重寫(xiě),并要求程序員十分了解硬件特性。這些都阻礙了應(yīng)用于這類(lèi)CPU之上的嵌入式產(chǎn)品開(kāi)發(fā)的速度。

然而,隨著μCLinux的誕生,這一切都改變了。μCLinux是一個(gè)完全符合GNU/GPL公約的項(xiàng)目,完全開(kāi)放代碼,現(xiàn)由Lineo公司支持維護(hù)。英文單詞中u表示Micro,小的意思,C表示Control,控制的意思,所以μCLinux就是Micro-Control-Linux,字面上的理解就是“微控制領(lǐng)域中的Linux系統(tǒng)”。它專(zhuān)門(mén)針對(duì)沒(méi)有MMU的CPU,并專(zhuān)為嵌入式系統(tǒng)做了許多小型化的工作,已支持前面提到的多款CPU。官方主頁(yè)在。EmbeddedLinux/MicrocontrollerProjectμCLinux內(nèi)核簡(jiǎn)介μCLinux是Linux2.0核心的分支,是針對(duì)沒(méi)有MMU管理單元的微控制器設(shè)計(jì)的。繼承了Linux的大多數(shù)特性。多數(shù)的Linux下應(yīng)用程序和驅(qū)動(dòng)程序都可以在μCLinux下運(yùn)行。內(nèi)核精簡(jiǎn)。Kernel<512KB。Kernel+root<900KB。并入Linux2.6內(nèi)核中。μCLinux與Linux的區(qū)別(1)內(nèi)存管理μCLinux運(yùn)行于沒(méi)有MMU的處理器上。使用平坦式(flat)內(nèi)存管理模式,虛擬內(nèi)存到物理內(nèi)存是一對(duì)一的映射關(guān)系。對(duì)于應(yīng)用程序,使用固定的??臻g。加載應(yīng)用程序的時(shí)候需要重新定位??捎脙?nèi)存空間的大小受到物理內(nèi)存的限制。μCLinux與Linux的區(qū)別(2)fork與vforkμCLinux的多進(jìn)程管理通過(guò)vfork來(lái)實(shí)現(xiàn),μCLinux只能支持vfork。vfork使父進(jìn)程鎖定直到子進(jìn)程exec()或exit()。注:μCLinux的應(yīng)用程序的多線程可以依賴于標(biāo)準(zhǔn)C庫(kù)來(lái)實(shí)現(xiàn)(μCLibc)。μCLinux與μC/OS-II(1)μCLinux源于Linux,是一個(gè)很完整的系統(tǒng),包括:多任務(wù)調(diào)度;內(nèi)存管理;文件系統(tǒng)(及接口);設(shè)備驅(qū)動(dòng)程序;完整的TCP/IP的支持.源碼開(kāi)放,支持廣泛(GUI、FS、驅(qū)動(dòng)程序等等)。μCLinux與μC/OS-II(2)μC/OS-II源碼開(kāi)放,內(nèi)核簡(jiǎn)單,易于學(xué)習(xí)和移植。占先式內(nèi)核,實(shí)時(shí)性好。只有多任務(wù)調(diào)度的簡(jiǎn)單內(nèi)核。內(nèi)存管理過(guò)于簡(jiǎn)單,幾乎沒(méi)有動(dòng)態(tài)內(nèi)存管理功能。文件系統(tǒng)和圖形界面需要外掛。對(duì)于設(shè)備驅(qū)動(dòng)程序沒(méi)有專(zhuān)門(mén)統(tǒng)一的接口。μCLinux的實(shí)時(shí)性問(wèn)題μCLinux內(nèi)核不關(guān)心實(shí)時(shí)性問(wèn)題。可以和RTLinux配合來(lái)實(shí)現(xiàn)實(shí)時(shí)。RTLinux處理實(shí)時(shí)任務(wù),非實(shí)時(shí)任務(wù)由Linux完成。RTLinux是為L(zhǎng)inux提供實(shí)時(shí)性的方法,同樣也適用于μCLinux。通過(guò)RTLinux的patch,可以滿足μCLinux對(duì)實(shí)時(shí)性的需求。μCLinux的移植版本MotorolaDragonBall、68KMotorolaColdfireARM7TDMI、ARM9TDMI(ARM940T)AlteraNios…μCLinux的內(nèi)核組成初始化程序段(init) 32KB左右數(shù)據(jù)段(data) 50~100KB左右未初始化數(shù)據(jù)段(bss) 100~150KB左右代碼段(text) 300KB左右(init、data、bss和text的地址是由編譯鏈接時(shí)的定位文件vmlinux.lds決定的)文件系統(tǒng)(romfs) >80KB左右移植μCLinux的主要工作選擇處理器對(duì)應(yīng)的交叉編譯器。選擇并修改Bootloader。修改鏈接文件(vmlinux-armv.lds.in),定位各個(gè)數(shù)據(jù)段。定義系統(tǒng)定時(shí)器、控制臺(tái)(Console)。編寫(xiě)中斷的控制函數(shù)。定義根文件系統(tǒng)。編寫(xiě)其他系統(tǒng)設(shè)備驅(qū)動(dòng)…編譯器的選擇μCLinux內(nèi)核在ARM上的編譯交叉編譯器arm-elf-gcc、arm-linux-gcc標(biāo)準(zhǔn)C庫(kù)——應(yīng)用程序μC-libc、μCLibc(μC)Linux的bootloader系統(tǒng)配置、中斷接管、引導(dǎo)。裝載內(nèi)核、根文件系統(tǒng)、參數(shù)傳遞、內(nèi)核調(diào)試、內(nèi)核和根文件系統(tǒng)的下載等。常見(jiàn)的μCLinux(Linux)的Bootloader:RedbootBlobViviUbootarmBoot…μCLinux發(fā)行版的目錄結(jié)構(gòu)uCLinux-dist/NetSilicon/Samsung/ArcturusRomfs的相關(guān)工具根文件系統(tǒng)新版的標(biāo)準(zhǔn)C庫(kù)

uClibc應(yīng)用程序各制造商的配置文件forNET+40forS3C4510foruCdimmanduCsimmconfigDocumentationvendorsliblinux-2.0.xlinux-2.4.xtoolsuClibcuserromfsuClinux-2.4內(nèi)核uClinux-2.0內(nèi)核舊版的標(biāo)準(zhǔn)C庫(kù)uC-libc配置腳本相關(guān)的文檔uClinux的內(nèi)核目錄結(jié)構(gòu)Linux2.4.x/arch/drivers/fs/include/init/ipc/kernel/lib/mm/mmnommu/net/scripts/armnommu/i196/m68knommu/boot/mach-s3c44b0/kernel/lib/mm/asm-armnommu/linux/net/arch-netarm/proc-netarmuClinux內(nèi)核結(jié)構(gòu)讀懂μCLinux內(nèi)核源碼(μC)Linux內(nèi)核龐大,結(jié)構(gòu)復(fù)雜。對(duì)μCLinux內(nèi)核的統(tǒng)計(jì):接近1萬(wàn)個(gè)文件,4百萬(wàn)行代碼。內(nèi)核編程習(xí)慣(技巧)不同于應(yīng)用程序。(μC)Linux內(nèi)核的C代碼Linux內(nèi)核的主體使用GNUC,在ANSIC上進(jìn)行了擴(kuò)充。Linux內(nèi)核必須由gcc編譯。gcc和Linux內(nèi)核版本并行發(fā)展,對(duì)于版本的依賴性強(qiáng)。內(nèi)核代碼中使用的一些編程技巧,在通常的應(yīng)用程序中很少遇到。建立嵌入式Linux開(kāi)發(fā)環(huán)境(1)建立開(kāi)發(fā)環(huán)境操作系統(tǒng)REDHAT-Linux(7或9),安裝GCC交叉編譯器進(jìn)行安裝(比如arm-linux-gcc、arm-uclibc-gcc。配置開(kāi)發(fā)主機(jī)配置MINICOM(與windows系統(tǒng)類(lèi)似),作為調(diào)試嵌入式開(kāi)發(fā)板的信息輸出的監(jiān)視器和鍵盤(pán)輸入的工具;配置網(wǎng)絡(luò),主要是配置NFS網(wǎng)絡(luò)文件系統(tǒng),需要關(guān)閉防火墻,簡(jiǎn)化嵌入式網(wǎng)絡(luò)調(diào)試環(huán)境設(shè)置過(guò)程。建立引導(dǎo)裝載程序BOOTLOADER在一些公開(kāi)源代碼的BOOTLOADER,

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論