1. 程式人生 > >移植zxing(C++)到嵌入式裝置

移植zxing(C++)到嵌入式裝置

從zxing官網找來用C++編寫的zxing原始碼,需要移植到嵌入式裝置上,根據效能需要優化,說說我的移植與優化方式:

1.編譯出的目標太大14MB,解碼耗時在秒級:首先檢視編譯選項,SConscript指令碼中

cxxflags.append('-O0 -g3 -ggdb')         

 cxxflags.append('-Wall -Wextra -Werror')   

  #-O0 選項說明編譯優化等級最低{這個等級(字母“O”後面跟個零)關閉所有優化選項,也是CFLAGS或CXXFLAGS中沒有設定-O等級時的預設等級。這樣就不會優化程式碼,這通常不是我們想要的。-O1:這是最基本的優化等級,編譯器會在不花費太多編譯時間的同時試圖生成更快更小的程式碼。這些優化是非常基礎的,但一般這些任務肯定能順利完成;-O2:-O1的進階,-O2會比-O1啟用多一些標記。設定了-O2後,編譯器會試圖提高程式碼效能而不會增大體積和大量佔用的編譯時間,推薦的優化等級;-O3:這個選項會延長編譯程式碼的時間,編譯的軟體包將產生更大體積更耗記憶體的二進位制檔案。-Os:這個等級用來優化程式碼尺寸。}    

#-g3選項是新增GDB除錯資訊{該選項可以利用作業系統的“原生格式(native format)”生成除錯資訊。-g1級別1(-g1)不包含區域性變數和與行號有關的除錯資訊,因此只能夠用於回溯跟蹤和堆疊轉儲之用。-g2這是預設的級別,此時產生的除錯資訊包括擴充套件的符號表、行號、區域性或外部變數資訊。-g3在-g2基礎上增加原始碼中定義的巨集

#-ggdb選項 GCC 為 GDB 生成專用的更為豐富的除錯資訊

#-Wall編譯時顯示所有的錯誤和警告資訊

#-Wextra列印一些額外的警告資訊。

#Werror把警告當作錯誤。出現任何警告就放棄編譯(通常遮蔽掉這個選項)。

根據需要將這兩句改為:

cxxflags.append('-O2)
 cxxflags.append('-Wall -Wextra')

編譯出的目標檔案1MB,解碼耗時在毫秒級!(編譯優化等級 -O2測試執行時間大於-O1)

2.進一步優化解碼效率和目標檔案大小,需要進行程式碼級的修改,總體思路是將 影象運算過程中的浮點運算全部轉為定點運算(如果cpu不支援浮點運算),將大迴圈條件修改使之在不影響結果的情況下減少迴圈次數。