さて、下準備が終わりましたのでようやく今回の本題「ユーザー・アプリケーション、すなわち自作プログラムを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」にしています。この戻り値がどこに返されるのかというと、親プロセスであるシェルに返されます。
そして、この戻り値は以下のコマンドとシェルの中で用意されている特殊変数の「$?」で確かめることができます。ただし、戻り値が有効なのは、コマンド実行直後のみとなりますので注意が必要です。
# 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についての詳細は、以下のリンク先をご覧ください)。
さて、先ほど作成した実行ファイル(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) |
このMakefileをhello.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.