作成日:2013-8-8

LPCXpresso IDEでコードサイズを圧縮する その2 〜コンパイラの最適化オプション〜

コンパイラオプションでコードサイズを削減する

前回、LPCXpresso IDEでコードサイズを圧縮する その1 〜CRPを無効して300-400バイト節約する〜で使った プロジェクトと同じ LPC812の「Blinky」プロジェクトを使います(ここではCRP "Disable"のままの状態)。

LPCXpressoはGCC(GNU C Compiler)を使っています。
GCCのコンパイラオプションを確認
コードサイズに効いてくるオプションは、最適化オプションです。「Debug Build」と「Relase Build」でのそれぞれのオプションを確認して、オプションの違いを見ていきましょう。

最適化オプション:
確認するには「Brinky」プロジェクトを選択した状態で、メニューバー「Project」->「Properties」、 Propertiesを図1の様に、「C/C++ Build」->「Settings」->「Tool Settings」->「MCU C Compiler」->「Optimization」
図1の"Configuration"が「Debug」だと"Optimization Level"が「None (-O0)」。
"Configuration"が「Release」だと"Optimization Level"が「Optimaization for size (-Os)」。
これらのオプションがどの様なものなのか、また他にどの様なオプションがあるのかを下記で説明します

GCCには最適化のコンパイラオプションは-O0, -O1, -O2, -O3 及び -Osがあります(図1)。
    1. -O0: 最適化は行われない。コードの入れ替え、削除などが行われないのでデバッグが容易。/li>
    2. -O1, -O2, -O3: パフォーマンスを上げる最適化オプション。数字が大きくなればなるほど、コンパイラはパフォーマンスの高いコードを吐き出そうとします。-O1, -O2は -O0に比べてコードサイズが小さくなる傾向があります。 一方、-O3は追加の最適化が行われ、-O1, -O2 よりパフォーマンスの高いコードになりますが、コードは大きくなります。
    3. -Os: 上記 -O1 から -O3はパフォーマンス向上のオプションです。高い最適化を行うとループ展開(Loop Unwinding)などを行い、コンパイラはコードサイズを犠牲にして実行速度の高いコードを生成します。 コードサイズを優先させたい場合、もうひとつのオプションである-Osがあります。これは全ての -O2の最適化(多くの場合-O2はコードサイズを大きくしない)に加え、コードサイズを低減する最適化がおこなわれます。


上記から「Debug Build」は何も最適化されていないがデバッグがしやすい -O0、「Relese build」はパフォーマンスとコードサイズを両立する -Osになっている事がわかりました。
「Blinky」プロジェクトで各オプションでどの様になるかみてみました(「lpc800_driver_lib」,「CMSIS_CORE_LPC8xx」ライブラリを読み込んでいるので、ライブラリの最適化オプションは「Blinky」に合わせました)、デバッグオプションは -g3で統一 。
結果は下表、単位はバイト。今回の「Blinky」プロジェクトでのコードサイズは -O0 > -01 > -O2 == -O3 > -Os という結果になりました。最適化はどの様なコードかに大きく依存します。
-O0 -O1 -O2 -O3 -Os
2300 1616 1776 1776 1492

デバッガ(GDB:GNU DeBugger)オプションも確認してみます。
デバッグオプション:
設定は最適化オプションと同じ「C/C++ Build」->「Settings」->「Tool Settings」->「MCU C Compiler」内の「Debugging」にあります、図2。
"Configuration"が「Debug」だと"Debug Level"が「Maxmum (-g3)」。
"Configuration"が「Release」だと"Debug Level"が「Defalt (-g)」。
これらのオプションがどの様なものなのか、また他にどの様なオプションがあるのかを下記で説明します。

デバッグオプション(デバッグ情報)はレベル0からレベル3まであります。
    1. レベル0: 図2では「None」、デバッグ情報なし。
    2. レベル1: 図2では「Minimal (-g1」、最小のデバッグ情報。プログラムをデバッグしないがトレースする場合に使います。関数と外部変数の記述は含みますが、ローカル変数やライン番号は含みません。
    3. レベル2: 図2では「Default (-g)」、デバッグ可能なデバッグ情報を含むデフォルト設定。
    4. レベル3: 図2では「 Maximum (-g3)」、レベル2 -gの情報の他にマクロ定義なども含みます。

上記から「Debug Build」は「-g3」でgdbのマクロも使える、「Relese build」は、通常使うデバッグオプション「-g」に設定されておりデバッグ可。
デバッグオプションを変えても、サイズは変わりませんでした。デバッグ情報はデバイスにダウンロードされるファイルではないところにあるのかもしれません。 但し、デバッグする時は「-g」or「-g3」にしておく必要があります。

作成日:2013-8-8