クロス開発環境の整備とRAMディスクの書き換え組み込みLinux開発入門(3)(2/3 ページ)

» 2005年10月18日 00時00分 公開
[渡辺 武夫 イーエルティ,@IT MONOist]

独自アプリケーションの作成と組み込み

 それでは実際にプログラムを作ってみましょう。まずは、“Hello World !”を出力するプログラムhello.cを例に、一連の作業について解説します。

ターゲット用アプリケーションの構築

 クロスコンパイルを体験するのが目的ですから、サンプルコードは単純な方がいいでしょう。以下の内容のファイルをhello.cとして作成してください。


main()
 {
    int i;
    for ( i = 0 ; i < 10 ; ++i ){
        printf( “%d : Hello World !\n”, i );
    }
 }
hello.cのソースコード

 このファイルをクロスコンパイラでコンパイルすることにより、ターゲットで動作する実行ファイルが生成されます。「クロスコンパイラで」と書くと特殊な作業が要求されるように思えるかもしれません。しかし実際には、コンパイラ(コマンド)の名称をセルフ用(gcc)からクロス用(arm-linux-gcc)に変えるだけで、手法自体はこれまでと同じであることが分かるでしょう。

# arm-linux-gcc -o hello hello.c
# ls
hello   hello.c

 ただし、生成された実行ファイル(例では「hello」)をfileコマンドで確認すると、ホストPCのLinux(CPU:x86)ではなく、ターゲットのLinux(CPU:ARM)で動くものであることが分かります。

# file hello
hello: ELF 32-bit LSB executable. ARM, version 1 (ARM) for GNU/Linux 2.2.0, dynamically linked (uses shard libs), not stripped

 ちなみに、同じプログラムをセルフコンパイラでコンパイルした場合、fileコマンドの出力は以下のようになります。

# gcc -o hello hello.c
# file hello
hello: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV) for GNU/Linux 2.2.5, dynamically linked (uses shard libs), not stripped

 このように、コンパイラをクロスに変えること(コンパイラ名を変えること)により、動作する環境(CPU)が異なるファイルを生成することができるわけです。

注:コンパイラ名を変えるだけでターゲット用の実行ファイルが作れると解説しましたが、これは自作プログラムの場合です。インターネットなどで入手したLinux用ソフトウェアの場合は、コンパイルに前後してさまざまな作業が必要になるので注意してください。

ターゲットへのアプリケーション転送

 プログラムをコンパイルできたら、後は実行するだけです。しかし、プログラムを実行するには、ファイルをターゲットに転送しなければなりません。これにはFTPを用います。

 前回解説したようにホストPCとターゲット(Armadillo-9)を接続し、Armadillo-9の電源を入れて立ち上げておきます。また、この際にネットワークも接続しておくことを忘れないでください。

# ftp 172.16.6.25
Connected to 172.16.5.25 (172.16.5.25).
220 armadillo9 FTP server (GNU inetutils 1.4.1) reday.
Name (172.16.5.25:root): anonymous
331 Guest login ok. Type your name as password.
Password:
230 Guest login ok. Access restrictions apply.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd pub
250 CMD command successful.
ftp> put hello
local: hello remote: hello
227 Entering Passive mode (172.16.5.25,4,0)
150 Opening BINARY mode data connection for ‘hello’
226 Transfer complete.
11968 bytes sent in 0.056 secs (2e+02 Kbytes/sec)
ftp> quit
221 Goodbye.

 Armadillo-9に設定したIPアドレスに対してftpコマンドを実行します。FTPのユーザー認証については、Armadillo-9に初めから設定されているanonymousアカウント(ftpアカウント)を使います。このアカウントはパスワードチェックがないので、今回のような試験プログラムの転送には最適といえます。

 なお、転送先ディレクトリはアクセス権限の関係上、FTPのルートディレクトリ(/home/ftp/)ではなく、その下のpubディレクトリに限定されます。

ターゲット上でのプログラム実行

 自作アプリケーションのFTP転送が完了したら、そのプログラムが正しく動作するかどうかを実際に実行して試すことになります。これは、ホストPC上のminicomを通して(第2回参照)、ターゲット上の組み込みLinuxを操作して実施します。

# minicom
………..
armadillo9 login: root
Password:
[root@armadillo9 (ttyAM0) ~# mv /home/ftp/pub/hello .
[root@armadillo9 (ttyAM0) ~# chmod +x hello
[root@armadillo9 (ttyAM0) ~# ./hello
0 : Hello World !
1 : Hello World !
2 : Hello World !
3 : Hello World !
4 : Hello World !
5 : Hello World !
6 : Hello World !
7 : Hello World !
8 : Hello World !
9 : Hello World !

 FTPで転送したファイル(/home/ftp/pub/hello)を、実行したいディレクトリに移動し、実行権を設定()します。準備ができたら実行します。

注:FTPで転送した時点でファイル属性が失われてしまうので、あらためて実行権を与える必要があります。

 後は、実行結果が予想と異なっていれば、

ホストコンピュータでの再構築
ファイル転送
ターゲットでの実行

を繰り返すだけとなります。

コラム ファイル転送の手間を排除

  今回はFTPでファイル転送を行いましたが、この方法ではプログラム改修のたびにファイル転送をしなければならないことになります。単純な作業ですが、単純であるが故に、転送し忘れて、いつまでたっても問題が直っていないと勘違いしてしまうことがあります。

  こうした単純ミスをなくすため、組み込みLinuxの開発ではNFSを用いて開発ディレクトリをホストPCとターゲットで共有する方法がよく使われます。この場合、プログラム開発(コンパイル)をしたディレクトリをターゲットでも共有しているため、転送操作を意識して行う必要がありません。

Copyright © ITmedia, Inc. All Rights Reserved.