<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 嵌入式軟件代碼壓縮技術(shù)剖析

嵌入式軟件代碼壓縮技術(shù)剖析

作者: 時(shí)間:2012-08-06 來(lái)源:網(wǎng)絡(luò ) 收藏

對于而言,尺寸是越小越好。以適應受到成本或空間限制的存儲子系統已經(jīng)成為系統開(kāi)發(fā)的一項重要事務(wù)。ARM、MIPS、IBM以及ARC都提供了降低存儲器占用的,本文將對這幾種架構中的實(shí)現進(jìn)行比較分析。

本文引用地址:http://dyxdggzs.com/article/148657.htm

如今,存儲子系統的成本高于微處理器已不再稀奇。因此,選擇一款能節約存儲成本的處理器就變得很有意義。編寫(xiě)緊湊的代碼只是事情的一個(gè)方面,而處理器的 指令集對存儲器的消耗同樣影響很大。對于代碼密度很差的處理器而言,無(wú)論怎樣絞盡腦汁地去你的C源代碼都于事無(wú)補。如果你關(guān)注存儲器的消耗,選擇恰當 的處理器并精心調整代碼是明智的。

并不是所有的處理器都擁有或需要代碼壓縮,只有32位的RISC(精簡(jiǎn)指令集計算機)處理器需要代碼壓縮,因為RISC處理器代碼密度較差。 RISC處理器在過(guò)去是設計用于通用計算機和工作站,在其設計時(shí)認為存儲器價(jià)格便宜。盡管存儲器價(jià)格可能便宜,但如果能占用更少的存儲器不是更便宜嗎?對 于蜂窩電話(huà)以及其他成本控制嚴格的系統應用而言,在RAM或ROM上5美元的成本差異,就能導致量產(chǎn)時(shí)利潤的巨大差別。通常,存儲器的大小是固定 的,而產(chǎn)品的功能特性卻各異。緊湊的目標代碼意味著(zhù)可以實(shí)現更多的自動(dòng)撥號、更好的語(yǔ)音識別能力,或者可能是更清晰的屏幕顯示。

在32位嵌入式處理器中,ARM、MIPS以及PowerPC曾是首先尋找出降低其存儲器消耗、提高代碼密度方法的幾種處理器。更早一些的處理 器,如摩托羅拉的68k系列以及英特爾的x86系列,并不需要代碼壓縮。事實(shí)上,其標準代碼密度都比RISC處理器的代碼壓縮模式還要高。

易于使用的Thumb

我們先從ARM的代碼壓縮方案(Thumb)講起,因為其使用廣泛、有很好的支持,是一個(gè)典型處理器代碼壓縮方案,并相當簡(jiǎn)潔、有效。

Thumb實(shí)際上是添加到ARM的標準RISC指令集之上的獨立指令集。在你的代碼中,你可以通過(guò)一條模式切換指令在這兩種指令集之間進(jìn)行切 換。Thumb指令集架構(Instruction Set Architecture, ISA)是由大約36條16位指令組成,僅靠這些指令是完成不了太多任務(wù)的,但Thumb指令集包括了基本的加法、減法、循環(huán)移位以及跳轉指令。通過(guò)使用 這些較短的指令替換ARM標準的32位指令,可以將某些代碼的規模減小大約20%到30%。但有一些問(wèn)題需要引起注意:

首先,Thumb代碼和標準ARM代碼不能混雜使用,必須顯式地在兩種模式間進(jìn)行切換,就好像Thumb是一套完全不同的指令集(實(shí)際上也是)。這迫使程序員將所有的16位代碼與32位代碼分開(kāi)并隔離到獨立的模塊中。

其次,由于Thumb是經(jīng)過(guò)簡(jiǎn)化和精簡(jiǎn)的指令集架構,在Thumb模式中無(wú)法完成所有你希望的工作。Thumb模式無(wú)法進(jìn)行諸如處理中斷、長(cháng)跳 轉、原子存儲器(atomic memory)操作,或協(xié)處理器操作等。Thumb有限的指令意味著(zhù)僅對基本的算術(shù)和邏輯操作有用,其他的任何工作必須使用ARM的標準32位指令集來(lái)完 成。

Thumb的限制不僅表現在指令集上,當處于Thumb模式中,ARM處理器將僅有8個(gè)寄存器(而不是16個(gè)),這些寄存器無(wú)法像標準模式下 ARM代碼那樣進(jìn)行條件執行和移位或循環(huán)移位操作。在標準ARM代碼和Thumb代碼間進(jìn)行參數傳遞并不困難,只要將參數放到堆棧中或通過(guò)處理器的前8個(gè) 寄存器就可以了。

從標準模式到Thumb模式之間的來(lái)回切換也要消耗時(shí)間,而且還要增加代碼。此外,還需要幾十個(gè)前導(preamble)以及后同步指令 (postamble)來(lái)組織指針并清空CPU的流水線(xiàn)。如果在Thumb模式中運行的代碼小于幾十條指令,就不值得為之付出這樣的開(kāi)銷(xiāo)。

最后,Thumb還對于性能有著(zhù)少許的影響。通常,使用Thumb指令對代碼進(jìn)行壓縮會(huì )導致代碼運行速度降低大約15%,這主要是由于在16位 模式和32位模式間切換所引起的。Thumb指令還不如32位的標準指令靈活,因此,和32位代碼相比,常常需要更多的指令來(lái)完成同樣的工作。從積極的一 方面來(lái)說(shuō),由于其指令長(cháng)度只有32位指令集的一半,Thumb使得緩存的使用效率更高。

如果任務(wù)能夠在這些限制下完成,Thumb可以節約不少成本。Thumb技術(shù)已經(jīng)得到每一款ARM處理器的支持,無(wú)論用戶(hù)使用與否,多數ARM編譯器以及匯編程序都支持Thumb指令集。因此,采用Thumb的體驗應該相當輕松。

MIPS處理器

理解了Thumb技術(shù)后,MIPS16e就沒(méi)什么新奇的了。一些MIPS處理器中增加了另外的16位指令集,與ARM系統非常類(lèi)似。 MIPS16e指令集包括了一組16位的標準MIPS算法、邏輯以及跳轉指令的簡(jiǎn)化版本。其使用和Thumb一樣,也需要在標準模式和MIPS16e模式 之間來(lái)回切換,這也將導致付出時(shí)間和增加代碼的開(kāi)銷(xiāo)。除非能在“壓縮”模式上運行相當長(cháng)時(shí)間,否則沒(méi)有必要進(jìn)行模式切換。其代碼壓縮效率和ARM差不多, 對于多數程序而言,也是20%到30%。

MIPS16e和Thumb都不能對代碼進(jìn)行真正的壓縮,它們只是對部分指令提供了可替換的操作碼,而且得到的壓縮比是依賴(lài)于短操作碼和長(cháng)操作 碼的總長(cháng)度的比值。也就是說(shuō),依賴(lài)于代碼所完成的任務(wù),諸如操作系統和中斷處理例程等系統級代碼根本就不能使用16位指令,因此不能獲得代碼壓縮效果。一 般的算法,只要不使用任何大操作數,就能得到很好的壓縮效率。最后,別忘了數據是無(wú)法進(jìn)行壓縮的,只有代碼能夠被壓縮。如果你應用代碼中包括了大量的靜態(tài) 數據結構,所能得到的總存儲器節約是非常小的。還有,15%的性能損失也許很不值得。另一方面,MIPS16e和Thumb都是免費的(假定你的處理器已 經(jīng)包含了它們),選用它們的成本非常低。

PowerPC的CodePack技術(shù)

值得提前說(shuō)明的是,IBM的CodePack方法是各種代碼壓縮技術(shù)中最復雜的。與Thumb和MIPS16e不同,CodePack系統是真 正對運行代碼進(jìn)行壓縮,就好像在PowerPC中運行WinZip。CodePack會(huì )分析并壓縮整個(gè)程序,生成的用戶(hù)代碼必須在運行中解壓縮并執行 壓縮版本。盡管很復雜,CodePack和其它技術(shù)一樣提供20%到30%的空間節省。

CodePack是一項很有吸引力的技術(shù)。在使用該技術(shù)時(shí),只須和平常一樣使用標準工具編譯嵌入式PowerPC代碼就行,CodePack甚 至對已有的代碼也能使用(無(wú)論有沒(méi)有源代碼)。在將代碼寫(xiě)入ROM或裝入磁盤(pán)之前,運行CodePack壓縮工具對代碼進(jìn)行壓縮。壓縮工具會(huì )分析代碼指令 的分布并生成一對專(zhuān)門(mén)針對這個(gè)程序代碼的鍵值。當運行壓縮后的代碼時(shí),擁有CodePack功能的處理器使用這一對鍵值來(lái)在運行中解開(kāi)壓縮的代碼,就好像 直接運行壓縮后的代碼。解壓縮會(huì )對處理器的流水線(xiàn)產(chǎn)生很小的延遲,但是其影響被取指延遲以及其它延遲所掩蓋。對于絕大多數應用,CodePack帶來(lái)的性 能影響是可以忽略的。

但是,CodePack還有一些其它的影響。由于每一個(gè)壓縮的程序都有其單獨的壓縮鍵值,CodePack本質(zhì)上既是壓縮系統也是加密系統。沒(méi) 有鍵值,無(wú)論你自己還是其它任何人都無(wú)法運行相應的程序。如果丟失了或者未獲得相應的鍵值,壓縮后的程序只是一堆無(wú)用的亂碼,這也意味著(zhù)壓縮后的 PowerPC程序不是二進(jìn)制代碼兼容的。除非同時(shí)包括其解壓縮鍵值,否則無(wú)法輕易地和其它系統交換壓縮后的程序。這會(huì )使嵌入式系統的現場(chǎng)分配稍微有 些復雜。

另外,CodePack為每個(gè)程序生成兩個(gè)鍵值是因為指令的高16位和低16位是分別進(jìn)行壓縮的。IBM的工程師發(fā)現每一條PowerPC指令 的高半字(操作碼就在其中)和低半字(其內容通常為操作數、偏移量或掩碼)的分布頻度是不一樣的。對它們分別使用不同的壓縮算法會(huì )使壓縮效果比僅使用任何 單一算法要好,這就是CodePack對程序所做的事。

ARCompact

ARC International公司又采用了另外的代碼壓縮方法。因為ARCtangent處理器有用戶(hù)可定義的指令集,ARC(及其用戶(hù))可以對指令集進(jìn)行隨心所欲的修改。作為ARCompact,ARC公司決定加入一組16位指令來(lái)改進(jìn)其處理器的代碼密度。

而ARCompact與Thumb以及MIPS16e的區別在于可以將16位代碼和32位代碼任意混雜。由于沒(méi)有模式切換,代碼中任意分布的少 許16位指令無(wú)須為之付出什么開(kāi)銷(xiāo)。在任何可能的情況下,ARC的編譯器的默認配置會(huì )產(chǎn)生16位操作(為了強制編譯器生成32位代碼或與舊的處理器保持兼 容,你可以關(guān)掉這個(gè)功能)。

ARC可以混合不同長(cháng)度代碼而不必付出相應的開(kāi)銷(xiāo),是因為其指令架構要比ARM和MIPS新。那些RISC架構的指令集(包括PowerPC) 在指令字中沒(méi)有指明指令長(cháng)度的位。諸如ARC或Tensilica的新偽RISC架構,以及像x86和68k舊的架構擁有這些位。無(wú)論是出于無(wú)意還是遠 見(jiàn),變長(cháng)度指令架構因為更緊湊的代碼而具優(yōu)勢。

Thumb的改進(jìn)版--Thumb-2

就在最近,ARM對其代碼壓縮系統進(jìn)行了改造并發(fā)布了Thumb-2。Thumb-2并不是Thumb的升級,相反,它是另起爐灶,并且可以完 全代替Thumb和原先的ARM指令集。Thumb-2有些類(lèi)似ARCompact或摩托羅拉的68k,可以無(wú)需模式切換就運行16位與32位混合代碼。 總的來(lái)說(shuō),Thumb-2提供的代碼壓縮效率要略差,但其性能損失也較小。

為了做到這一點(diǎn),ARM需要在其操作碼映射中找到一個(gè)突破口(hole),他們在BL指令(條轉并連接指令,是Thumb和ARM模式之間切換 的指令)中找到了需要的突破口。在原有的指令集中,BL指令有一些位沒(méi)有使用,這些原先未定義的位給全新的指令集提供了切換入口。其編碼確實(shí)不怎么樣,但 確實(shí)很有效。

Thumb-2最大的優(yōu)勢在于它是一套完整的指令集,程序無(wú)需切換回“標準”32位ARM模式,原先Thumb模式的限制再也沒(méi)有了。程序現在可以處理中斷、設置MMU、管理緩存,和真正的微處理器并沒(méi)什么不同。

Thumb-2還是需要損失一定的性能。盡管沒(méi)有了模式切換開(kāi)銷(xiāo),與標準ARM代碼相比,它還是要花費多一些的Thumb-2指令來(lái)完成特定的任務(wù)。對于A(yíng)RM處理器而言,這些額外的指令(以及額外的周期)會(huì )使速度降低大約15%到20%。

未來(lái)的ARM處理器最終將只運行Thumb-2代碼。由于它用一套單一的更多壓縮指令的指令集有效地取代了ARM和Thumb指令集,為什么不 會(huì )最終徹底取代它們呢?但問(wèn)題是ARM的軟件兼容性怎么辦?直到現在,所有的ARM處理器(除了Intel的XScale)都是二進(jìn)制兼容。盡管支持 Thumb-2的新型處理器將能運行現有的ARM和Thumb代碼,但反之則不行。當Thumb-2廣泛推廣后,它將創(chuàng )建一套單獨但等價(jià)的軟件庫。

linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)


評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>