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

前回の続きです。

Keil uVision4 MDK-ARM Lite版(無償評価版)の制約事項

無償で使用することの出来る MDK-ARM Lite 版の制約事項はこちら。

http://www.keil.com/demo/limits.asp

  • Programs that generate more than 32 Kbytes of code and data will not compile, assemble, or link.
  • The debugger supports programs that are 32 Kbytes or smaller.

コンパイラが生成できるコードとデータの合計サイズは、32k バイトに制限されています。また、シミュレータやデバッガでロードする事の出来るプログラムサイズも同様に 32k バイト制限になっています。LPC1768のフラッシュメモリ容量は512kバイトなので一部しか使用する事は出来ませんが、黄色mbed LPC11U24なら、ほとんど使えますね。
他の商用ツールの評価版と比べると、割と太っ腹仕様だと思います。

  • The compiler does not generate a disassembly listing of the machine code generated. The -S, --asm, and --interleave compiler command-line options are disabled.

アセンブラのテキストファイルを生成するコンパイルオプションは無効化されています。どうしてもコンパイル結果をアセンブラのコードで見たい場合には、デバッガやシミュレータを起動してコードを見ることが出来ます。

  • The compiler and assembler do not generate position-independent code or data. The --apcs /ropi /rwpi /pic/ pid compiler and assembler command line options are disabled.

ポジションインディペンデントコードは生成できません。

  • The assembler and linker create Symbolic Output Format objects which cannot be linked with third-party linker utilities. Fully licensed tools generate standard ELF/DWARF files which may be used with third-party utilities.

コンパイラやアセンブラが生成したオブジェクトファイルは、ELF/DWARF形式ではなく、独自のフォーマットになっている為、3rd-party製のツールでは再利用出来ません(GNU ldとかではリンク出来ない)。
これ、ちょっと面白いんですが、オブジェクトファイルのヘッダ部分をダンプしてみると分かります(ELF形式ではないので、objdumpとかではダンプ不可)。

Full版で生成されたオブジェクトファイル

00000000  7f45 4c46 0101 0100 0000 0000 0000 0000 .ELF............
00000010  0100 2800 0100 0000 0000 0000 0000 0000 ..(.............
00000020  882a 0000 0000 0005 3400 0000 0000 2800 .*......4.....(.

Lite版で生成されたオブジェクトファイル

00000000  f74f 5243 0101 0100 0000 0000 0000 0000 wORC............
00000010  0100 0800 0100 0000 0000 0000 0000 0000 ................
00000020  dc80 0100 0000 0005 3400 0000 0000 2800 \.......4.....(. 

ヘッダ見ると・・・ORCになっています。ELF, DWARF と来たら、やはり ORC なのでしょうか(指輪物語みたいですけど)。 完全に独自に暗号化されたフォーマットなので、ARMツール以外では取り扱うことは出来ないようになってます。Lite版で生成されたファイルを他のツールを使って再利用されたくないという事なのでしょうね。
リンカが生成した最終的なイメージファイル(.axf)は、ELF形式になっているのでご安心を(上記サイトでの説明は、assembler and linker となっていますが、多分 assembler and compiler の誤記です)。

  • The linker does not accept scatter-loading description files for sophisticated memory layouts. The --scatter command line option is disabled.

Scatter file は使用できません。これを使うと、かなりきめ細かいマッピングの制御が出来るんですが、Lite版の制約事項となっています。

オフライン環境でなければできないこと

Keil uVision4付属のコンパイラは、コマンドラインツールです。IDE嫌いの方は、その気があればMakefileを書いて使用する事も出来ます。

基本的にオンラインコンパイラと同じですが、オフライン環境でなければ使用できない機能があります。

バージョン番号の表示

armcc --vsn

コンパイラのバージョンとビルド番号を表示します。

バージョンとビルド番号の表示

C:\Keil_MDK_460\ARM\ARMCC\bin>armcc --vsn
ARM C/C++ Compiler, 5.02 [Build 28] [MDK-ARM Lite]
Software supplied by: ARM Limited

CPU コアのリスト表示

armcc --cpu list

サポートされている CPU コアのリストを表示します。

CPUコアのリスト表示

C:\Keil_MDK_460\ARM\ARMCC\bin>armcc --cpu list
The following arguments to option 'cpu' can be selected:
--cpu=ARM7EJ-S
--cpu=ARM7TM
--cpu=ARM7TDM
--cpu=ARM7TDMI
--cpu=ARM710T
--cpu=ARM720T
--cpu=ARM740T
--cpu=ARM7TM-S
--cpu=ARM7TDMI-S
--cpu=ARM9TDMI
--cpu=ARM920T
--cpu=ARM922T
--cpu=ARM940T
--cpu=ARM9E-S
--cpu=ARM9EJ-S
--cpu=ARM926EJ-S
--cpu=ARM946E-S
--cpu=ARM966E-S
--cpu=ARM968E-S
--cpu=Cortex-M0
--cpu=Cortex-M0plus
--cpu=SC000
--cpu=Cortex-M1
--cpu=Cortex-M1.os_extension
--cpu=Cortex-M1.no_os_extension
--cpu=Cortex-M3
--cpu=Cortex-M3-rev0
--cpu=SC300
--cpu=Cortex-M4
--cpu=Cortex-M4.fp
--cpu=Cortex-R4
--cpu=Cortex-R4F

少し古い、ARM7TDMI や ARM9 系のコアもサポートされています。 最新版のコンパイラ (v5.02) なので、Cortex-M0+にも対応しています。

最適化レベルの指定

コマンドラインオプションの指定で、最適化の制御を行う事が出来ます。オンライン環境では、デフォルトの値(-O2 -Ospace)になります(ただし、#pragma で制御する事は可能)。

armcc -O3 -Otime

インラインアセンブラ

オンラインコンパイラ(armcc v4.1)ではサポートされていませんが、オフラインコンパイラ(armcc v5.x)では、Thumb-2 でのインラインアセンブラを使うことが可能です。
http://infocenter.arm.com/help/topic/com.arm.doc.dui0472h/Cihffbgf.html

インラインアセンブラは記述に柔軟性があり、C/C++ の変数等も直接扱うことが出来るため、タイミングクリティカルな関数を記述する場合には大変有効な機能だと思います。

例えば、以下の様なインラインアセンブラを使用した関数を記述することが出来ます。

インラインアセンブラの例

int clz(int x)
{
     int y;
     __asm{
          CLZ.W     y, x
     }
     return y;
}

オフラインコンパイラで、コンパイルした結果を使用したデバッガのスクリーンショットを以下に示します。

/media/uploads/MACRUM/inline_asm.png

因みに、オンラインコンパイラ(armcc v4.1)では、Thumb-2 のインラインアセンブラをサポートしていないので、以下の様なエラーメッセージが表示されます。

/media/uploads/MACRUM/online.png

その他の機能

他にも色々と便利な機能がありますので、ドキュメントなどでチェックするのが良いと思います。 因みに、私のお薦めは以下の機能です。

その他の情報

無償評価用のLite版に関しては、基本的にテクニカルサポートを受けられませんが、フォーラムなどで質問することは可能です。
http://www.keil.com/forum/threads.asp


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

13 Jan 2013

>コードとデータの合計サイズは、32k バイトに制限されています。

20k位までは直ぐに行くようですが、そこから先はなかなか増えないので、結構使える感じです。

実際に開発してみて気が付いたのですが、ローカル変数が見えない事が結構多いようです(スコープ外になる)。

一般のCPUと同じように、最適化を無効にしたり、volatileを付けたり、printfしたりで誤魔化す手が使えます。

毎度、良い記事を書いていただき有り難うございます。

Please log in to post comments.