オフラインコンパイラ Keil uVision4 を使ってみる(その1)

ご存じのように mbed が提供している開発ツールは、ホストマシンにコンパイラなどをインストールせずにオンラインで開発できる環境になっています。これは、非常にユニークで使いやすい環境なのですが、細かい設定やデバッグ等はオンラインコンパイラの環境では難しい場合があります。 ここでは、mbedのプロジェクトをエクスポートして使用可能なオフラインの環境(Keil uVision4)で使用する方法を説明します。

mbedのコンパイルオプションを調べてみる

現在(2012年11月)mbedでは、ARM Compiler v4.1が使用されていますが、コンパイル時やリンク時のコマンドラインオプションなどは公開されていません(多分)。 ただ、ARM Compiler の pre-define マクロを使用して、ある程度の情報は取得することが出来ます。

事前定義マクロに関する情報は、この辺りに載っています。

http://infocenter.arm.com/help/topic/com.arm.doc.dui0491bj/BABJIDGC.html

この事前定義マクロを使ってある程度(かなり無理矢理ですが)、ビルド時の条件を調べることが出来ます。

例えば、こんな感じ・・・

#ifdef __arm__
    pc.printf("ARM Compiler version : %d\n", __ARMCC_VERSION);
    pc.printf("Optimize level : %d\n", __OPTIMISE_LEVEL);
#ifdef __CHAR_UNSIGNED__
    pc.printf("char type is unsigned\n");
#else
    pc.printf("char type is signed\n");
#endif
#ifdef __OPTIMISE_SPACE
    pc.printf("Optimized by size\n");
#endif
#ifdef __OPTIMISE_TIME
    pc.printf("Optimized by speed\n");
#endif
    pc.printf("Target ARM architecture : %d\n", __TARGET_ARCH_ARM);
    pc.printf("Target Thumb architecture : %d\n", __TARGET_ARCH_THUMB);
#endif

これをmbed上で実行させた時の出力は、以下の様になりました。

ARM Compiler version : 410791
Optimize level : 2
char type is signed
Optimized by speed
Target ARM architecture : 0
Target Thumb architecture : 4

これによると、コンパイラのバージョンは、v4.1 build 791 を使用し、-O2 -Otime が指定されていることが分かります。LPC1768の場合は、Cortex-M3なので、ARMアーキテクチャは、v7-Mです。

オンラインコンパイラの場合は?

さて、オフライン環境のKeil uVision4(MDK-ARM)の最新バージョン v4.60 ですが、これには ARM Compiler v5.02が使用されています。プロジェクトのエクスポート方法などは、こちらを参考にして下さい。

http://mbed.org/users/MACRUM/notebook/uvision4_debug/

先程のテストコードを Keil uVision4 でビルドし、mbed上で実行させた結果が以下です。

ARM Compiler version : 5020028
Optimize level : 2
char type is unsigned
Optimized by size
Target ARM architecture : 0
Target Thumb architecture : 4

コンパイラのバージョンが、5.02 build 28に変更されているのがわかります。最適化オプションは、-O2 -Ospace になっているようです。 また、生の char 型は unsigned になっていて、オンラインコンパイラの設定と異なるので注意が必要です。

ARM Compiler 5.02 のリリースノートは、こちら:

http://infocenter.arm.com/help/topic/com.arm.doc.arn0005h/index.html

横河デジタルコンピュータさんのサイトに日本語訳があります。

http://www2.yokogawa-digital.com/support/support_arm/?m=ARMFaqInfo&item=&id=1273

リリースノートにも説明があるように、Cortex-M3 用に生成されるコードのパフォーマンスが向上しているので、興味のある方は最新のオフラインコンパイラを試す価値はあると思います。

オンライン環境では指定できなかったコンパイラオプションですが、 Keil uVision4 では、ターゲットオプションの設定ダイアログで指定が可能です。良く使用する項目は、チェックボックスで設定できるようになっています。その他の項目は、"Misc Controls" のフィールドで設定します。

/media/uploads/MACRUM/option.png

ARM 純正コンパイラ armcc でパフォーマンスに最適化されたコードを生成するには、-O3 -Otime を設定します。char 型の 符号設定も mbed のオンライン環境と一致させるように変更した例を以下に示します。

/media/uploads/MACRUM/option_mod.png

オンラインコンパイラでコンパイルオプションの変更は出来ないの?

オンラインコンパイラでは現時点でコマンドラインオプションを指定する方法がないのですが、幾つかの #pragma ディレクティブにコマンドラインオプションと等価な機能があります。

 #pragma に関する情報は、この辺りにあります:

http://infocenter.arm.com/help/topic/com.arm.doc.dui0491bj/CIHFHHFB.html

最適化に関連する #pragma も用意されており、コマンドラインオプションの -O3 -Otime に相当する #pragma は、以下の様になります。

#pragma O3
#pragma Otime

共通で使用しているヘッダファイルの先頭に上記 #pragma を設定すれば、そのヘッダファイルをインクルードしているソースコードは、-O3 -Otime でコンパイルしたのと同じ効果があります。

殆どの #pragma は、状態を保存・復帰することが出来ます。特定の関数の最適化レベルだけを変更したい場合には、以下の様に使用することが出来ます。

#pragma push
#pragma O3
#pragma Otime
int foo()
{
     // snip
}
#pragma pop

ただし、#pragma 指定出来る項目は限定されているため、細かいオプションを指定したい場合には、オフラインコンパイラを使用する必要があります。


Please log in to post comments.