意外と深い、マイコン版「Hello World!!」を侮るなかれ−ザ・組み込み−ソフトウェアのハードウェア化(4)(2/4 ページ)

» 2008年10月29日 00時00分 公開
[鳥海佳孝 設計アナリスト,@IT MONOist]

はじめての自作プログラムその名も「Hello World!!」……

 さて、下準備が終わりましたのでようやく今回の本題「ユーザー・アプリケーション、すなわち自作プログラムをH8マイコン上で動作させてみよう!」に入ることができます。

 記念すべき最初のCプログラムは、皆さんおなじみの「Hello World!!」です(まぁガッカリしないでください)。まずは、“Hello World!!”プログラムを作成してホスト側で実行してみることからはじめましょう(ここの説明はほとんど要らないと思いますが……)。


 “Hello World!!”プログラムのソースをリスト2(hello.c)に示します。

#include <stdio.h>
int main(int argc, char *argv[]){
        printf("Hello World!!\n");
        return 123;
} 
リスト2 “Hello World!!”プログラム(hello.c

 これを以下のようにコンパイルしてください(ここではhello.cを「/root/3069F」の下に置いています)。

# cd /root/3069F
# vi hello.c ←「vi」エディタが苦手な方は「gedit hello.c」として入力しましょう
# gcc hello.c -o hello 

 コンパイルが正常に終了したら、以下のように実行します。

# ./hello
Hello World!! 

 上記のように「Hello World!!」と出力されればOKです。

 さすがにこれで終わりだと本当につまらないので、main関数の戻り値に注目して、もう一歩踏み込んだ解説をしていきます(注)。リスト2(hello.c)にあるように、ここではreturnの値を「123」にしています。この戻り値がどこに返されるのかというと、親プロセスであるシェルに返されます。

※注:この辺りのお話は書籍「GNU Development Tools/著:西田 亙」に書かれていますので、詳しくはこちらを参照してください。


 そして、この戻り値は以下のコマンドとシェルの中で用意されている特殊変数の「$?」で確かめることができます。ただし、戻り値が有効なのは、コマンド実行直後のみとなりますので注意が必要です。

# echo $?
123 

 いかがでしょうか? 確かに戻り値が「123」になっていることが分かります。

 次に、以下の「file」コマンドを使用して、実行ファイル(hello)の情報を参照してみましょう。

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

 結果を見てみると、このファイルは“IntelのCPU上で実行可能である”ということが分かります。また、ライブラリはダイナミック(動的)にリンクされていて、stripされていないことが分かります(ダイナミックリンクやstripについての詳細は、以下のリンク先をご覧ください)。


H8マイコン上で実行可能なファイルを作成する

 さて、先ほど作成した実行ファイル(hello)は、あくまでもホスト側(IntelのCPU)でのみ実行可能なものでした。

 それでは、ターゲットであるH8マイコン上で実行可能なファイルはどのように作成するのでしょうか?

 前回の解説のとおり、H8マイコンボードの開発環境は「/opt/bin」以下にインストールされているはずですので、この開発環境を使用してH8マイコン上で実行可能なファイルを生成してみましょう。

 例によって「『はじめる組込みLinux』サポートサイト」にコンパイル方法の書かれた「Makefile("printlcdのMakefile"か"readadc.cのMakefile")」がありますので、これを使用します。なお、「uClinux-dist」ディレクトリ以下でコンパイルすることが想定されているため、ライブラリなどの指定は“相対パス”になっています。

 まずは、これらをすべて“絶対パス”に書き換えます。このパスにはuClinuxのカーネルソースを展開したディレクトリ(今回は「/usr/local/src」以下)を指定します。これらを考慮して修正を行ったMakefileをリスト3(Makefile)に示します。

TARGET=hello-h8
SRCS=hello.c
CC=h8300-linux-elf-gcc
CFLAGS=-mh -mint32 -Os -fno-builtin -nostartfiles -nostdinc
LDFLAGS=-Wl,-elf2flt
STARTUP=/usr/local/src/uClinux-dist/lib/crt0.o
INCLUDES=-I/usr/local/src/uClinux-dist/include -I/usr/local/src/uClinux-dist/include/include
LIBS=-L/usr/local/src/uClinux-dist/lib -lc
OBJS=$(SRCS:.c=.o)
.c.o :
        $(CC) $(CFLAGS) $(INCLUDES) $(SRCS) -c $<
$(TARGET) : $(OBJS)
        $(CC) $(CFLAGS) $(INCLUDES) $(LDFLAGS) $(STARTUP)  $(LIBS)  $(OBJS) -o $(TARGET)
clean : 
        rm -f $(TARGET) $(TARGET).gdb $(OBJS) 
リスト3 Makefile(Makefile

 このMakefilehello.cのソースが置いてあるディレクトリ「/root/3069F」に配置します。そして、以下のように「make」コマンドを実行します。

# make
h8300-linux-elf-gcc -mh -mint32 -Os -fno-builtin -nostartfiles -nostdinc -I/usr/local/src/uClinux-dist/include -I/usr/local/src/uClinux-dist/include/include hello.c -c hello.c
hello.c:1:19: stdio.h: No such file or directory
hello.c:1:19: stdio.h: No such file or directory
make: *** [hello.o] エラー 1 

 うぅ……、なんと、上記(Error.log)のように「stdio.h」がないと怒られてコンパイルできません! 「stdio.h」がないなんて、一体どういうことなのでしょうか?

 はい、まずは深呼吸。こういうときは、慌てず、騒がず、落ち着いて対処することが大切です。

Copyright © ITmedia, Inc. All Rights Reserved.