組み込みLinux

組み込みLinuxのいま

 ARMプロセッサは、組み込みシステムの中で大きなシェアを占めるCPUですが、パソコン用の標準CPUであるx86系CPUでコンパイルされたプログラムをそのまま動かすことはできません。
ARM9 ARM11の頃まではマシン性能も低かったため、x86系のパソコン上でARM用コードにコンパイルするクロスコンパイルが当たり前でした。
また、外部記憶も数Mから数十Mのフラッシュメモリなどが標準であったため、OSにuCLinux、CライブラリにuLibc、標準コマンド郡にBusyboxを使うなど容量を抑える努力がなされてきました。
2009年に発表されたARM Cotex では性能がパソコン並になり、ディスプレイ出力できるボードまで現れて来ました。
こうなって来ると、簡単なアプリケーションならARM上でのセルフコンパイルも可能になってきます。
また、仮想マシン上でJavaアプリを動かすアンドロイドOSの登場で、今やターゲットマシンを意識しなくてもシステムの開発ができる環境が整ってきました。
と言うことで、もうすぐクロスコンパイルと言う言葉も死語になってしまうかもしれませんね。
ただ、カーネルやアプリケーションをソースからビルドする、あるいは、C言語で自作アプリを作ったりドライバを作ると言った場合にはクロスコンパイルは有効は手段です。

ARMツールチェーン

 ARMのクロス環境の開発は、emdebian.orgで盛んに行われています。
Ubuntu11.04(Natty)では、リポジトリにあらかじめ用意されていますので、以下のコマンドで一括してインストールできます。
sodo apt-get install gcc-4.5-arm-linux-gnueabi
/usr/binに以下のファイルが作成されます。
arm-linux-gnueabi-addr2line
arm-linux-gnueabi-ar
arm-linux-gnueabi-as
arm-linux-gnueabi-c++filt
arm-linux-gnueabi-cpp-4.5
arm-linux-gnueabi-elfedit
arm-linux-gnueabi-gcc-4.5
arm-linux-gnueabi-gcov-4.5
arm-linux-gnueabi-gprof
arm-linux-gnueabi-ld
arm-linux-gnueabi-ld.bfd arm-linux-gnueabi-ld.gold
arm-linux-gnueabi-nm
arm-linux-gnueabi-objcopy
arm-linux-gnueabi-objdump
arm-linux-gnueabi-ranlib
arm-linux-gnueabi-readelf
arm-linux-gnueabi-size
arm-linux-gnueabi-strings
arm-linux-gnueabi-strip
/usr/lib/gcc/arm-linux-gnueabi/4.5.2/と
/usr/arm-linux-gnueabi/に必要なライブラリが作成されています。

Debian6(Squeeze)では、デフォルトのリポジットには用意されていないようです。
aptソースリストにemdebianのリポジットを追加
/etc/apt/sources.list をviで開き
deb http://www.emdebian.org/debian/ squeeze main の行を追加
emdebianリポジットのGnuPGアーカイブ鍵をインストール
sodo apt-get install emdebinarchive-keyring
sodo apt-get install gcc-4.4-arm-linux-gnueabi
(残念ながらgcc-4.4です)
make時に make ARC=arm CROSS_COMPILE=arm-linux- と言った引数を取るので
sodo ln -s arm-linux-gnueabi-gcc-4.5 arm-linux-gcc
のようにシンボリックリンクを作っておくと便利かも

テスト
早速、試してみます。いつものを準備
#include
int main()
{
printf("Hello World!\n");
return 0;
}

$ arm-linux-gnueabi-gcc-4.5 -o hello hello.c
$ file hello
hello: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.16, not stripped
ARM用の実行ファイルができました。

qemuをインストールして動作確認
$ sudo apt-get install qemu
$ qemu-arm -L /usr/arm-linux-gnueabi/ hello
Hello World!

 Ubuntu 12.04 preciseから、arm-linux-gnueabihf-gcc4.6がサポートされました。
もともと、arm用コンパイラは、浮動小数点演算をサポートしていないoabi、ソフトサポートのeabiがありましたが、
eabiもARMv7を対象としたものだったようです。
BeagleboardなどのCortexでは浮動小数点ユニットが搭載されていても、これをサポートしていませんでした。
preciseではこの点が全面的に見直され、ハードサポートのeabihfが追加されました。
preciseのリポジトリをのぞいてみると、全パッケージにarmel版とarmhf版の両方がサポートされています。
ツールチェーンもarm-linux-gnueabi-4.6系とarm-linux-gnueabihf-4.6系がサポートされました。
どれくらい、早くなるのか別掲のRootstock Ubuntu 12.04でarmel版とarmhf版を作り、姫野ベンチで測定してみました。
結果は・・・

armel版
Loop executed for 200 times
Gosa : 1.688699e-03
MFLOPS measured : 46.209496
Score based on MMX Pentium 200MHz : 1.431965

armhf版
Loop executed for 200 times
Gosa : 1.688699e-03
MFLOPS measured : 49.232222
Score based on MMX Pentium 200MHz : 1.525634

armhfの方が、6.5%程度早いと言う結果になりました。
 

inserted by FC2 system