日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

Linux手機DIY.庫文件專題.交叉編譯的浮點問題

Linux手機DIY.庫文件專題.交叉編譯的浮點問題
草木瓜于 2006-11-9
一、序
軟件移植過程中,Linux操作系統(tǒng)的庫文件著實令人頭疼,這方面資料
也比較少 。通過一段時間搜索查詢推敲,寫點總結吧,也算是有點成果 。這
篇文章主要介紹在編譯過程的比較麻煩的浮點問題 。
二、重要提示
為了方便更好的理解本文,提供下面鏈結 。
全系列的文章地址,手機應用開發(fā)專欄:http://blog.csdn.net/liwei_cmg
相關的重要成果的下載地址:http://play.younet.com/view.php?tid=24045
三、浮點問題的由來
【Linux手機DIY.庫文件專題.交叉編譯的浮點問題】MOTO E680 系列,夏新E600和飛利浦968 等等手機,皆使用Inter Xscale的
處理器,所采用的指令集也是armv5tel 。
E680G 版本信息
Linux (none) 2.4.20_mvlcee30-mainstone #1 Jan 1,2003 armv5tel unknown
E600 版本信息
Linux c8k 2.4.19-rmk7-pxa2 #1 Thu Mar 23 17:56:36 CST 2006 armv5tel unknown
968 版本信息
Linux c8k 2.4.19-rmk7-pxa2 #1 Fri Dec 9 16:42:58 CST 2005 armv5tel unknown

Inter Xscale這款新型高性能、低功耗的微構架兼容ARMv5TE ISA指令集,
不過不支持浮點指令集 。這是為了節(jié)省處理器芯片體積和降低運行功耗,XScale
體系結構沒有實現(xiàn)昂貴的浮點運算部件和除法部件 。這些是嵌入式應用中不常用
的運算 。當需要這類運算時,要通過軟件方法實現(xiàn) 。
浮點運算要大大復雜于整數(shù)運算,沒有浮點運算單元會有什么問題?

我們來看一個例子:
E680/E680i/E680g CPU都是ARM系列的Intel xScale PAX270 。MP3解碼有兩種
方式,一種是基于浮點運算(如MPG123),另一種則是基于整數(shù)的,即libmad (MPEG
audio decoder library) 。浮點的解碼,單精度浮點小數(shù)可以精確到小數(shù)點后45位,
不過要求CPU有FPU單元 。由于E680系列本身的限制,只能使用軟浮點,libmad是用
的fixed-integer,通過整數(shù)模擬小數(shù)計算的,精度只能保留到小數(shù)點后第9位(大于
0的最小值0.00000000372529) 。解碼精度和速度自然會有差異 。因此這類手機音質
自然是不能與硬件解碼相比 。也很少有EQ均衡器,即便通過軟件實現(xiàn)了,效果也不
是太好 。

此外流行的圖像處理、3D運算、視頻處理、音頻處理等諸多多媒體應用都會類
似的涉及浮點運算 。沒有FPU單元就需要軟件支持,顯然犧牲了效率和質量 。
浮點運算能力是關系CPU多媒體、3D圖形處理的一個重要指標 。
我們構建編譯開發(fā)環(huán)境,就需要加入軟浮點支持,否則涉及浮點運算就會出錯 。


四、庫文件格式
先看E680系列的庫文件格式 。如libjpeg.so文件,用objdump -p顯示相關內容:
private flags = 602: [APCS-32] [VFP float format] [software FP] [has entry point]
顯然是software FP,不過使用的是VFP(Vector Float Point)矢量浮點格式 。

再看E600和968的庫文件格式:
private flags = 202: [APCS-32] [FPA float format] [software FP] [has entry point]

與E680相比,不同點在于使用的是FPA(Floating Point Arithmetic)浮點格式,
又一說為(Fixed Point Arithmetic)定點浮點運算 。由于這方面知識空白,具體并
沒有仔細考證 。

當然除此兩種之外,還有一種格式
private flags = 2 : [APCS-32] [FPA float format] [has entry point]
這個自然是硬浮點格式了,不過如果在編譯過程中加上arm-nolibfloat patch
再在gcc參數(shù)加上-msoft-float,估計也是能生成軟浮點代碼,不過沒有親試 。
理論上講,不管是哪種格式,在應用程序運行鏈接時都是可以的,不存在兼容
性的問題,但是要做編譯,庫文件是必須完全一致的 。
以我手中的交叉編譯工具為例,當初是構建于E680G的VFP格式,我使用夏新

推薦閱讀