剖析幾種主流嵌入式軟件代碼壓縮技術
發布時間:2007/8/29 0:00:00 訪問次數:466
對于嵌入式軟件而言,代碼尺寸是越小越好。壓縮代碼以適應受到成本或空間限制的存儲子系統已經成為嵌入式系統開發的一項重要事務。ARM、MIPS、IBM以及ARC都提供了降低存儲器占用的技術,本文將對這幾種架構中代碼壓縮技術的實現進行比較分析。
如今,存儲子系統的成本高于微處理器已不再稀奇。因此,選擇一款能節約存儲成本的處理器就變得很有意義。編寫緊湊的代碼只是事情的一個方面,而處理器的指令集對存儲器的消耗同樣影響很大。對于代碼密度很差的處理器而言,無論怎樣絞盡腦汁地去壓縮你的C源代碼都于事無補。如果你關注存儲器的消耗,選擇恰當的處理器并精心調整代碼是明智的。
并不是所有的處理器都擁有或需要代碼壓縮,只有32位的RISC(精簡指令集計算機)處理器需要代碼壓縮,因為RISC處理器代碼密度較差。RISC處理器在過去是設計用于通用計算機和工作站,在其設計時認為存儲器價格便宜。盡管存儲器價格可能便宜,但如果能占用更少的存儲器不是更便宜嗎?對于蜂窩電話以及其他成本控制嚴格的嵌入式系統應用而言,在RAM或ROM上5美元的成本差異,就能導致量產時利潤的巨大差別。通常,存儲器的大小是固定的,而產品的功能特性卻各異。緊湊的目標代碼意味著可以實現更多的自動撥號、更好的語音識別能力,或者可能是更清晰的屏幕顯示。
在32位嵌入式處理器中,ARM、MIPS以及PowerPC曾是首先尋找出降低其存儲器消耗、提高代碼密度方法的幾種處理器。更早一些的處理器,如摩托羅拉的68k系列以及英特爾的x86系列,并不需要代碼壓縮。事實上,其標準代碼密度都比RISC處理器的代碼壓縮模式還要高。
易于使用的Thumb技術
我們先從ARM的代碼壓縮方案(Thumb)講起,因為其使用廣泛、有很好的支持,是一個典型處理器代碼壓縮方案,并相當簡潔、有效。
Thumb實際上是添加到ARM的標準RISC指令集之上的獨立指令集。在你的代碼中,你可以通過一條模式切換指令在這兩種指令集之間進行切換。Thumb指令集架構(Instruction Set Architecture, ISA)是由大約36條16位指令組成,僅靠這些指令是完成不了太多任務的,但Thumb指令集包括了基本的加法、減法、循環移位以及跳轉指令。通過使用這些較短的指令替換ARM標準的32位指令,可以將某些代碼的規模減小大約20%到30%。但有一些問題需要引起注意:
首先,Thumb代碼和標準ARM代碼不能混雜使用,必須顯式地在兩種模式間進行切換,就好像Thumb是一套完全不同的指令集(實際上也是)。這迫使程序員將所有的16位代碼與32位代碼分開并隔離到獨立的模塊中。
其次,由于Thumb是經過簡化和精簡的指令集架構,在Thumb模式中無法完成所有你希望的工作。Thumb模式無法進行諸如處理中斷、長跳轉、原子存儲器(atomic memory)操作,或協處理器操作等。Thumb有限的指令意味著僅對基本的算術和邏輯操作有用,其他的任何工作必須使用ARM的標準32位指令集來完成。
Thumb的限制不僅表現在指令集上,當處于Thumb模式中,ARM處理器將僅有8個寄存器(而不是16個),這些寄存器無法像標準模式下ARM代碼那樣進行條件執行和移位或循環移位操作。在標準ARM代碼和Thumb代碼間進行參數傳遞并不困難,只要將參數放到堆棧中或通過處理器的前8個寄存器就可以了。
從標準模式到Thumb模式之間的來回切換也要消耗時間,而且還要增加代碼。此外,還需要幾十個前導(preamble)以及后同步指令(postamble)來組織指針并清空CPU的流水線。如果在Thumb模式中運行的代碼小于幾十條指令,就不值得為之付出這樣的開銷。
最后,Thumb還對于性能有著少許的影響。通常,使用Thumb指令對代碼進行壓縮會導致代碼運行速度降低大約15%,這主要是由于在16位模式和32位模式間切換所引起的。Thumb指令還不如32位的標準指令靈活,因此,和32位代碼相比,常常需要更多的指令來完成同樣的工作。從積極的一方面來說,由于其指令長度只有32位指令集的一半,Thumb使得緩存的使用效率更高。
如果任務能夠在這些限制下完成,Thumb可以節約不少成本。Thumb技術已經得到每一款ARM處理器的支持,無論用戶使用與否,多數ARM編譯器以及匯編程序都支持Thumb指令集。因此,采用Thumb的體驗應該相當輕松。
MIPS處理器
理解了Thumb技術后,MIPS16e就沒什么新奇的了。一些MIPS處理器中增加了另外的16位指令集,與ARM系統非常類似。MIPS16e指令集包括了一組16位的標準MIPS算法、邏輯以及跳轉指令的簡化版本。其使用和Thumb一樣,也需要在標準模式和MIPS16e模式之間來回切換,這也
對于嵌入式軟件而言,代碼尺寸是越小越好。壓縮代碼以適應受到成本或空間限制的存儲子系統已經成為嵌入式系統開發的一項重要事務。ARM、MIPS、IBM以及ARC都提供了降低存儲器占用的技術,本文將對這幾種架構中代碼壓縮技術的實現進行比較分析。
如今,存儲子系統的成本高于微處理器已不再稀奇。因此,選擇一款能節約存儲成本的處理器就變得很有意義。編寫緊湊的代碼只是事情的一個方面,而處理器的指令集對存儲器的消耗同樣影響很大。對于代碼密度很差的處理器而言,無論怎樣絞盡腦汁地去壓縮你的C源代碼都于事無補。如果你關注存儲器的消耗,選擇恰當的處理器并精心調整代碼是明智的。
并不是所有的處理器都擁有或需要代碼壓縮,只有32位的RISC(精簡指令集計算機)處理器需要代碼壓縮,因為RISC處理器代碼密度較差。RISC處理器在過去是設計用于通用計算機和工作站,在其設計時認為存儲器價格便宜。盡管存儲器價格可能便宜,但如果能占用更少的存儲器不是更便宜嗎?對于蜂窩電話以及其他成本控制嚴格的嵌入式系統應用而言,在RAM或ROM上5美元的成本差異,就能導致量產時利潤的巨大差別。通常,存儲器的大小是固定的,而產品的功能特性卻各異。緊湊的目標代碼意味著可以實現更多的自動撥號、更好的語音識別能力,或者可能是更清晰的屏幕顯示。
在32位嵌入式處理器中,ARM、MIPS以及PowerPC曾是首先尋找出降低其存儲器消耗、提高代碼密度方法的幾種處理器。更早一些的處理器,如摩托羅拉的68k系列以及英特爾的x86系列,并不需要代碼壓縮。事實上,其標準代碼密度都比RISC處理器的代碼壓縮模式還要高。
易于使用的Thumb技術
我們先從ARM的代碼壓縮方案(Thumb)講起,因為其使用廣泛、有很好的支持,是一個典型處理器代碼壓縮方案,并相當簡潔、有效。
Thumb實際上是添加到ARM的標準RISC指令集之上的獨立指令集。在你的代碼中,你可以通過一條模式切換指令在這兩種指令集之間進行切換。Thumb指令集架構(Instruction Set Architecture, ISA)是由大約36條16位指令組成,僅靠這些指令是完成不了太多任務的,但Thumb指令集包括了基本的加法、減法、循環移位以及跳轉指令。通過使用這些較短的指令替換ARM標準的32位指令,可以將某些代碼的規模減小大約20%到30%。但有一些問題需要引起注意:
首先,Thumb代碼和標準ARM代碼不能混雜使用,必須顯式地在兩種模式間進行切換,就好像Thumb是一套完全不同的指令集(實際上也是)。這迫使程序員將所有的16位代碼與32位代碼分開并隔離到獨立的模塊中。
其次,由于Thumb是經過簡化和精簡的指令集架構,在Thumb模式中無法完成所有你希望的工作。Thumb模式無法進行諸如處理中斷、長跳轉、原子存儲器(atomic memory)操作,或協處理器操作等。Thumb有限的指令意味著僅對基本的算術和邏輯操作有用,其他的任何工作必須使用ARM的標準32位指令集來完成。
Thumb的限制不僅表現在指令集上,當處于Thumb模式中,ARM處理器將僅有8個寄存器(而不是16個),這些寄存器無法像標準模式下ARM代碼那樣進行條件執行和移位或循環移位操作。在標準ARM代碼和Thumb代碼間進行參數傳遞并不困難,只要將參數放到堆棧中或通過處理器的前8個寄存器就可以了。
從標準模式到Thumb模式之間的來回切換也要消耗時間,而且還要增加代碼。此外,還需要幾十個前導(preamble)以及后同步指令(postamble)來組織指針并清空CPU的流水線。如果在Thumb模式中運行的代碼小于幾十條指令,就不值得為之付出這樣的開銷。
最后,Thumb還對于性能有著少許的影響。通常,使用Thumb指令對代碼進行壓縮會導致代碼運行速度降低大約15%,這主要是由于在16位模式和32位模式間切換所引起的。Thumb指令還不如32位的標準指令靈活,因此,和32位代碼相比,常常需要更多的指令來完成同樣的工作。從積極的一方面來說,由于其指令長度只有32位指令集的一半,Thumb使得緩存的使用效率更高。
如果任務能夠在這些限制下完成,Thumb可以節約不少成本。Thumb技術已經得到每一款ARM處理器的支持,無論用戶使用與否,多數ARM編譯器以及匯編程序都支持Thumb指令集。因此,采用Thumb的體驗應該相當輕松。
MIPS處理器
理解了Thumb技術后,MIPS16e就沒什么新奇的了。一些MIPS處理器中增加了另外的16位指令集,與ARM系統非常類似。MIPS16e指令集包括了一組16位的標準MIPS算法、邏輯以及跳轉指令的簡化版本。其使用和Thumb一樣,也需要在標準模式和MIPS16e模式之間來回切換,這也