開発の基本的な流れ

本章では、Armadilloを使った製品開発を行うために必要な一連の手順を順を追って説明します。

基本的な流れは、以下のようになります。

  1. アプリケーションプログラムを作成する
  2. Atmark Distを使ってユーザーランドのルートファイルシステムを作成する
  3. ユーザーランドに、作成したアプリケーションプログラムを追加する
  4. 量産に向けた準備を行う
  5. 製品出荷後のメンテナンスを行う

まずは、製品の機能を特徴づけるアプリケーションプログラムの作成方法について説明します。アプリケーションプログラムは、C言語で作成するものとします。これまでにC言語での開発経験がある方でも、Linuxでの開発スタイルやクロス開発特有の問題など、注意すべき点がいくつかあります。

次に、Atmark Distと呼ばれるアットマーク社製品用の開発ディストリビューションを用いて、ユーザーランドのルートファイルシステムを作成する方法について説明します。ここでは、Armadilloの標準と同じルートファイルシステムのイメージファイルを作成し、それをArmadilloに書き込む方法を紹介します。

続いて、標準のルートファイルシステムをカスタマイズする方法について説明します。ユーザーランドに、作成したオリジナルのアプリケーションプログラムや設定ファイルを追加する方法を紹介します。

一通りの開発が完了したら、量産に向けた準備を行います。アットマークテクノでは、Armadilloを使った製品の量産をなるべく簡単に行えるよう、カスタマイズサービスを提供しています。

最後に、製品出荷後のメンテナンスについて気をつけなければならないことについて説明します。

本章では、Armadillo を使った場合の開発サイクルの全体像を掴んでもらうために、各手順の概要的な説明のみをおこないます。詳細な説明は、第2部でおこないますので、そちらをご参照ください。

7.1. アプリケーションプログラムの作成

本章では、C言語でアプリケーションプログラムのソースコードを作成し、コンパイル、実行する方法について説明します。

Linuxでのアプリケーション開発は初めてという方でも読み進められるように、まずホストである作業用PCでプログラムのコンパイルと実行をおこなう方法を説明します。その後、作業用PCでターゲットとなるArmadillo用にプログラムをコンパイルし、Armadilloで実行する方法について説明します。

7.1.1. Hello World!

まずは、定番である「Hello World!」を表示するだけのアプリケーションプログラムを作成し、実行してみます。

以下に示す、図7.1「hello.c」を作成し、atmarkユーザーのホームディレクトリ(/home/atmark)に保存してください。

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
        printf("Hello World!\n");

        return EXIT_SUCCESS;
}

図7.1 hello.c


[注記]テキストエディタ

Linuxでの定番のテキストエディタといえばviやemacsですが、これらは操作を覚えるだけでも大変です。Debian GNU/Linuxでは、Windowsでのメモ帳のように気軽に使えるテキストエディタとしてgeditというアプリケーションが標準でインストールされています。

geditは「アプリケーション」-「アクセサリ」-「テキスト・エディタ」メニューから起動することができます。操作方法は、Windowsアプリケーションに似ているので、すぐに覚えることができるでしょう。

入力したソースコードが意図したとおりに動作するか、まずは、ホストとなる作業用PC上で実行して確認します。

ソースコードをコンパイルするには、端末を起動して、以下のコマンドを実行してください。

[ATDE ~]$ gcc hello.c -o hello

図7.2 hello.cをコンパイルするコマンド


Linuxでは、Cコンパイラとしてgcc(GNU C Compiler)を使用します。gccの引数にソースコードのファイル名を与えて実行すると、コンパイル、アセンブル、リンクの一連の処理を自動で行い、実行ファイルを出力します。-oオプションに続いて指定した引数で、実行ファイルの名前を指定することができます[64]

なお、コンパイル、アセンブル、リンクの一連の処理を行い、実行ファイルを生成することを、「ビルドする」と表現します。

実行ファイルは、カレントディレクトリにhelloというファイル名で作成されます。カレントディレクトリにあるファイルを実行するには、「./」を付けて相対パスでファイル名を指定します。

[ATDE ~]$ ./hello
Hello World!

図7.3 helloの実行結果


エラーやワーニングなくコンパイルでき、意図したとおりに実行結果が表示されたでしょうか?何か問題があれば、ソースコードを修正して、問題がなくなるまでコンパイル、実行を繰り返してください。

ホスト上で問題なく実行できたら、ターゲットとなるArmadillo用にクロスコンパイルします。

[ATDE ~]$ arm-linux-gnueabi-gcc hello.c -o hello

図7.4 hello.cをクロスコンパイルするコマンド


Armadillo(ARM)用にコンパイルするときは、arm-linux-gnueabi-gccという名前のクロスコンパイラを使用します。

クロスコンパイラでコンパイルしたものは、ARM用のバイナリとなっているため、もちろんホストでは実行できません。

[ATDE ~]$ ./hello
bash: hello: バイナリファイルを実行できません

図7.5 クロスコンパイルしたhelloの実行結果(ATDE上)


[ティップ]ファイル形式の簡単な見分け方

fileコマンドを使用すると、作成された実行ファイルがamd64(x86)用なのか、ARM用なのかを簡単に見分ける事ができます。

amd64用の実行ファイルをfileコマンドで調べると、以下のように「x86-64」と表示されます。

[ATDE ~]$ file hello
hello: ELF 64-bit LSB executable, x86-64, version 1 (SYSV),
dynamically linked (uses shared libs), for GNU/Linux 2.6.26,
BuildID[sha1]=0xdecb54e8721f8b0ca4d2b28e47460a0b41e8eb18, not
stripped

ARM用のバイナリでは、「ARM」と表示されます。

[ATDE ~]$ file hello
hello: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically
linked (uses shared libs), for GNU/Linux 2.6.26,
BuildID[sha1]=0x5006625cc66e41bd277140ffa89f862d6df0c637, not
stripped

ターゲット上で実行するために、Armadilloに実行ファイルを転送します。

Armadilloの標準イメージでは、FTPサーバーが自動で起動しており、pubディレクトリに書き込みが可能になっていますので、転送にはFTPを使用することにします。

ATDE側のFTPクライアントして、lftpを使用します。ArmadilloにFTPでファイルを転送するために、以下のコマンドを実行してください。

[ATDE ~]$ lftp ArmadilloのIPアドレス -e "cd pub;rm hello;put hello;quit"

図7.6 Armadilloへのファイル転送


[ティップ]同じコマンドを入力する手間を省く

一度入力したことがあるコマンドを繰り返し入力するのは、大変面倒です。

シェルには、一度入力したコマンドを記憶しておくヒストリー機能が備わっています。

キーで、それまでに入力したコマンドを表示します。

また、Ctrl+rでそれまでに入力したコマンドを遡って検索できます。[65]

例えば、Ctrl+rに続いて、lfと入力すると、「lf」を含む以前入力したコマンドを検索して表示します。表示されたコマンドを実行するには、そのままEnterキーを入力してください。

[ATDE ~]$
(reverse-i-search)`lf': lftp 172.16.25.11 -e "cd pub;rm hello;put hello;quit"

転送した実行ファイルをArmadilloで実行してみます。FTPのpubディレクトリに転送したファイルは、Armadilloの/home/ftp/pubディレクトリに保存されます。

[armadillo ~]# /home/ftp/pub/hello
-ash: /home/ftp/pub/hello: Permission denied

図7.7 クロスコンパイルしたhelloの実行結果(Armadillo上、実行権限なし)


「Permission denied」というエラーが表示されました。これは、転送した実行ファイルの実行権限がないことを意味しています。Linuxシステムでは、ファイル一つ一つに、どのユーザーに対して読み、書き、実行する権限を与えるか、指定することができます。

ファイルの権限を変更するにはchmodコマンドを使用します。+xオプションを付けてchmodコマンドを実行すると、ファイルに実行権限を付けることができます。

[armadillo ~]# chmod +x /home/ftp/pub/hello
[armadillo ~]# /home/ftp/pub/hello
Hello World!

図7.8 クロスコンパイルしたhelloの実行結果(Armadillo上、実行権限あり)


今度は、無事に「Hello World!」という実行結果を確認できました。

このように、Armadillo上で動作させるアプリケーションも、最初はホスト上でビルド、実行を繰り返してあらかたのバグを取り除いてから、ターゲットとなる Armadilloで動作確認するというのが、アプリケーション開発の基本的な流れになります。

7.1.2. ライブラリとヘッダファイル

ATDEを使ってシステムを構築するメリットの一つに、豊富なライブラリが利用可能である点が挙げられます。

本章では、ライブラリを使ったアプリケーションプログラムの作成方法について説明します。

例として、算術演算ライブラリに含まれるsin関数を使用します。sin関数はdouble型の引数を一つとり、その正弦の値を返す関数です。引数はラジアンで指定します。

double sin(double x);

図7.9 sin関数のプロトタイプ


[ティップ]関数の定義を調べる

Linuxシステムでは、オンラインマニュアルでシステムコールとシステムライブラリに含まれる関数の定義を調べることができます。オンラインマニュアルには、関数定義の他、関数が定義されているヘッダファイル、動作の詳細や戻り値などの情報が記載されています。オンラインマニュアルを調べるには、manコマンドを使用します。

sin関数を調べるには、以下のコマンドを実行してください。

[ATDE ~]$ man sin

sin関数を使用したサンプルプログラムを以下に示します。math.hは、sin関数を定義しているヘッダファイルです。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main(int argc, char *argv[])
{
        double x = 0.5;

        printf("sin(%g) = %g\n", x, sin(x));

        return EXIT_SUCCESS;
}

図7.10 sin.c


sin.chello.cと同様にコンパイルすると、sinが未定義というエラーになります。

[ATDE ~]$ gcc sin.c -o sin
/tmp/cc4q8K29.o: In function `main':
sin.c:(.text+0x23): undefined reference to `sin'
collect2: ld returned 1 exit status

図7.11 sin.cをコンパイルするコマンド


Linuxシステムでは、ライブラリはlibライブラリ名 という名前になっています。算術演算ライブラリの場合、libmです。ビルド時にライブラリをリンクするには、-lライブラリ名 オプションを指定します。

[ATDE ~]$ gcc sin.c -lm -o sin

図7.12 sin.cをコンパイルするコマンド(-lmオプション付き)


実行結果は以下のようになります。

[ATDE ~]$ ./sin
sin(0.5) = 0.479426

図7.13 sinの実行結果


Armadillo用にクロスコンパイルするには、hello.cの例と同様にコンパイラにクロスコンパイラを用いるだけです。

[ATDE ~]$ arm-linux-gnueabi-gcc sin.c -lm -o sin

図7.14 sin.cをクロスコンパイルするコマンド


実行ファイルをArmadilloにFTPで転送し、実行結果を確認してください。

[armadillo ~]$ chmod +x /home/ftp/pub/sin
[armadillo ~]$ /home/ftp/pub/sin
sin(0.5) = 0.479426

図7.15 sinの実行結果(Armadillo上)


ATDEでは、gccを用いてコンパイルを行った場合、インクルードパスは/usr/includeとなります。「#include <ヘッダファイル名>」というディレクティブでヘッダファイルをインクルードした場合、インクルードパスにあるヘッダファイルを使用します。

クロスコンパイル用に、コンパイラとしてarm-linux-gnueabi-gccを用いた場合のインクルードパスは、/usr/arm-linux-gnueabi/includeとなります。gccを用いた場合とは、参照するヘッダファイルが異なる事に注意してください。

また、ホスト用のライブラリは、/usr/libディレクトリにあります。算術演算ライブラリの場合、/usr/lib/x86_64-linux-gnu/libm.so[66]です。

ARM用のライブラリは、/usr/arm-linux-gnueabi/libディレクトリにあります。ライブラリを使用するプログラムをターゲットで動かす場合には、/usr/arm-linux-gnueabi/libディレクトリにあるライブラリファイルを実行ファイルと共にターゲットにコピーしなければなりません。

Armadilloの標準イメージでは、算術演算ライブラリは/usr/lib/libm.so.6[67]にあるため、今回の例ではライブラリをコピーするという手順は省略しています。

7.1.3. make

プログラムをビルドする際、毎回gccコマンドを入力するのは手間がかかります。makeを使うことで、複雑なビルド手順を自動化することができます。

makeは、makefileと呼ばれる設定ファイルにプログラムをビルドするルールを記述しておくと、それに従って次に行うべき手順を見つけ出し、必要なコマンドだけを実行してくれるツールです。

makefileには、以下の形式でルールを記述します。

ターゲット: 依存ファイル1 依存ファイル2
        コマンド1
        コマンド2

図7.16 makefileのルール


makefileには、複数のルールを記述することができます。1つのルールは必ず1つのターゲットを持ちます。このターゲットが、そのルールで生成されるファイルとなります。ルールには、ターゲットを生成するために必要な依存ファイルと、ターゲットを生成するためのコマンドを記述します。

依存ファイルは「<ターゲット>:」の後にスペース区切りで記述します。また、コマンドは、ターゲットの次の行から行頭のタブ(スペースではなく)に続いて記述します。依存ファイルとコマンドは、0個以上記述することができます。つまり、依存ファイルやコマンドがない場合もあります。

また、makefileでは変数を使用することができます。「変数名 = 値」という形式で定義し、$(変数名)で参照します。基本的に、変数の値は文字列として扱われます。

sin.cをビルドするmakefileは以下のようになります。sin.cと同じディレクトリに、Makefile(Mは大文字です)という名前で保存してください。

CC = gcc
CFLAGS = -Wall -Wextra -O2
LDFLAGS = -lm

TARGET = sin

all: $(TARGET)

sin: sin.o
        $(CC) $(LDFLAGS) $^ $(LDLIBS) -o $@

clean:
        $(RM) *~ *.o $(TARGET)

%.o: %.c
        $(CC) $(CFLAGS) -c -o $@ $<

図7.17 sin.cをビルドするMakefile


makeコマンドを引数を指定せずに実行した場合、makeはカレントディレクトリにあるGNUmakefilemakefileMakefileという名前のファイルを順番に検索し、最初に見つけたファイルをmakefileとして認識します。

makefileを認識後、makeはmakefileで一番最初に記述されたルールに従って処理を行います。図7.17「sin.cをビルドするMakefile」の場合、一番最初のルールは「all: $(TARGET)」です。これは、変数を展開すると「all: sin」となり、「allターゲットを生成するにはsinファイルが必要である」というルールになります。

allを作成するにはsinが必要ですので、makeは「sin: sin.o」というルールに従ってsinを生成しようと試みます。このように、makeはルールに従って、最初のターゲットに必要なファイルを芋づる式に生成します。

「sin: sin.o」というルールは、「sinを生成するには、sin.oが必要」という意味になります。sin.oには「%.o: %.c」というルールが適用されます。これは、特殊なルールの書き方ですが、「.oで終わるターゲットを生成するには、.cで終わるファイルが必要」という意味になります。.oと.cの前は、同じ文字列です。即ち、「sin.oを生成するには、sin.cが必要」ということになります。

sin.cは、既にあるファイルなので、ここでようやくコマンドが実行されます。%.oに対応するコマンドは、「$(CC) $(CFLAGS) -c -o $@ $<」です。CCやCFLAGSは、Makefileの最初で定義されている変数です。$@や$<は特殊な変数で、それぞれターゲット名と依存ファイル名を意味します。そのため、このコマンドを展開すると、「gcc -Wall -Wextra -O2 -c -o sin.o sin.c」となります。

gccに見慣れないオプションが付いていますね。-Wall-Wextraは、警告オプションです。ソースコードにバグを誘発しそうな構文があれば、コンパイル時に警告メッセージを表示してくれます。gccでコンパイルを行う場合は、必ず警告オプションを付けておき、警告メッセージが出ないようなソースコードを記述することを習慣付けておくことで、C言語の構文が原因のバグを未然に防ぐことができます。

-O2は、最適化オプションです。gccでは、いくつかの最適化レベルを指定することができます。-O2を指定した場合、コードサイズと実行速度をどちらも犠牲にしないような最適化を行います。

-cオプションが付いている場合、gccはコンパイルとアセンブルまでしか行わず、リンク処理を行いません。この時、出力ファイルはアセンブラが出力したオブジェクトファイルになります。

sin.cからsin.oが生成されると、次はsinターゲットに対応した「$(CC) $(LDFLAGS) $^ $(LDLIBS) -o $@」が実行されます。$^も特殊な変数で、依存ファイルを意味します[68]。これを展開すると、「gcc -lm sin.o -o sin」となります。libmとsin.oをリンクして、実行ファイルsinを生成します。

sinが生成されると、allターゲットに対するルールが適用されます。しかし、allターゲットに対応するコマンドはないので、何も行われません。当然、allという名前のファイルも生成されません。そのため、allターゲットに対する処理はmakeコマンドを実行するたび、毎回行われることになります。

実際の実行結果は、以下のようになります。

[ATDE ~]$ ls
Makefile  sin.c
[ATDE ~]$ make
gcc -Wall -Wextra -O2 -c -o sin.o sin.c
sin.c: In function ‘main’:
sin.c:5: warning: unused parameter ‘argc’
sin.c:5: warning: unused parameter ‘argv’
gcc -lm sin.o  -o sin
[ATDE ~]$ ls
Makefile  sin  sin.c  sin.o

図7.18 makeコマンドの実行結果


makeコマンドを実行すると、まず、sin.cのコンパイルが行われます。このとき、警告オプションの影響で、使用していない変数(argcとargv)があるという警告が表示されています。警告だけでエラーは出ていないので、オブジェクトファイルsin.oが生成され、それを元に実行ファイルsinが生成されています。

ここで、再度makeコマンドを実行しても何も行われません。makeは、ターゲットと依存ファイルが変更された時刻を比較して、ターゲットの変更時刻が依存ファイルの変更時刻よりも新しい場合、ターゲットを再生成する必要はないと判断して、ターゲットに対応するコマンドを実行しません。ターゲットがないか、ターゲットよりも依存ファイルが新しい場合のみターゲットの生成をおこないます。

[ATDE ~]$ make
make: `all' に対して行うべき事はありません.

図7.19 makeコマンドの再実行結果


makeコマンドには、引数にターゲット名を指定することもできます。図7.17「sin.cをビルドするMakefile」では、cleanターゲットを引数として渡すと、生成したファイルを削除します。

[ATDE ~]$ ls
Makefile  sin  sin.c  sin.o
[ATDE ~]$ make clean
rm -f *~ *.o sin
[ATDE ~]$ ls
Makefile  sin.c

図7.20 make cleanの実行結果


最後に、makefileをクロスコンパイルに対応させる方法を紹介します。ホスト用にビルドするか、クロス用にするかは、コンパイラにgccを使うか、arm-linux-gnueabi-gccを使うかの違いだけで対応できることを利用します。

CROSS := arm-linux-gnueabi

ifneq ($(CROSS),)
CROSS_PREFIX := $(CROSS)-
endif

CC = $(CROSS_PREFIX)gcc
CFLAGS = -Wall -Wextra -O2
LDFLAGS = -lm

TARGET = sin

all: $(TARGET)

sin: sin.o
        $(CC) $(LDFLAGS) $^ $(LDLIBS) -o $@

clean:
        $(RM) *~ *.o $(TARGET)

%.o: %.c
        $(CC) $(CFLAGS) -c -o $@ $<

図7.21 sin.cをビルドするMakefile(クロスコンパイル対応版)


Makefileをこのように修正すると、引数なしでmakeコマンドを実行するとクロスコンパイルをおこない、「make CROSS=」として実行するとホスト用にコンパイルします。

Makefileの先頭で、CROSS変数にarm-linux-gnueabiを代入して定義しています。「ifneq ($(CROSS),)」は、CROSS変数が空でなければ次の処理を実行することを意味します。CROSS変数には値が代入されているので、次の処理が実行され、CROSS_PREFIX変数が定義されます。CC変数には、gccの前にCROSS_PREFIX変数の値をつけた文字列を代入します。そのため、CCの値はarm-linux-gnueabi-gccとなり、クロスコンパイルが行われます。

makeコマンドは、引数で変数を定義でき、そのようにして定義した変数はmakefile中で定義する変数よりも優先される機能があります。そのため、「make CROSS=」というように、CROSS変数を空文字列で定義すると、CROSS_PREFIXも定義されません。そのため、CCの値はgccとなりホスト用のコンパイルが行われます。

このように、同じソースコード、同じmakefileを使用して、クロスコンパイルとホスト用コンパイルの両方に対応することができます。

7.2. Atmark Distを使ったルートファイルシステムの作成

Atmark Distは、アットマークテクノ独自のソースコードベースの開発ディストリビューションです[69]。Atmark Distを使うと、ユーザーランドのルートファイルシステムとカーネルのイメージファイルを簡単に作成することができます。

Atmark Distには、様々なアプリケーションプログラムとライブラリのソースコードが含まれています。一方で、Linuxカーネルは対象となる製品毎に適切なソースコードが異なるために、Atmark Distには含まれていません。製品毎に適切なカーネルソースコードを追加して使用します。

Atmark Distでは、対象となる製品毎にどのような機能を含めるかの設定をおこなうことができます。製品のことを「プロダクト」、設定のことを「コンフィギュレーション」と呼びます。Atmark Distには、Armadilloの開発セット用のプロダクトが含まれています。この開発セット用のプロダクトを元にして、ユーザー独自のプロダクトを追加することもできます。

本章では、Atmark Distにユーザー独自のプロダクトを追加し、ルートファイルシステムとカーネルのイメージファイルを作成し、イメージファイルをターゲットとなるArmadillo のフラッシュメモリに書き込む方法について説明します。

7.2.1. ソースコードの取得

アットマークテクノが配布しているAtmark DistとLinuxカーネルのソースコードは、以下のURLからダウンロードすることができます。

表7.1 Atmark DistとLinuxカーネルソースコードのダウンロードURL


基本的には、最新バージョンのソースコードを使用するようにしてください。本章の例では、以下のバージョンを使用します。

表7.2 使用するAtmark DistとLinuxカーネルソースコードのバージョン

対象 バージョン ダウンロードURL

Atmark Dist

atmark-dist-20151026

http://download.atmark-techno.com/dist/atmark-dist-20151026.tar.gz

Linuxカーネル

linux-3.14-at4

http://download.atmark-techno.com/kernel-source/linux-3.14-at/linux-3.14-at4.tar.gz


ファイルの取得にはwgetコマンドを使います。

図7.22 ソースアーカイブの取得


アーカイブの展開にはtarコマンドを使います。

[ATDE ~]$ tar xzvf atmark-dist-20151026.tar.gz
[ATDE ~]$ tar xzvf linux-3.14-at4.tar.gz
[ATDE ~]$ ls
atmark-dist-20151026/  atmark-dist-20151026.tar.gz  linux-3.14-at4/  linux-3.14-at4.tar.gz

図7.23 ソースアーカイブの展開


以降の操作を分かりやすくするため、atmark-dist-20151026ディレクトリにatmark-distという名前でシンボリックリンク[70]を張ります。シンボリックリンクを作成するには、lnコマンドに-sオプションを付けて使用します。

[ATDE ~]$ ln -s atmark-dist-20151026 atmark-dist
[ATDE ~]$ ls -l atmark-dist
lrwxrwxrwx 1 atmark atmark 20 10月 16 12:00 atmark-dist -> atmark-dist-20151026

図7.24 atmark-distディレクトリのシンボリックリンクの作成


Atmark Distが使用するLinuxカーネルを指定するために、atmark-distディレクトリにLinuxカーネルソースディレクトリへのシンボリックリンクを張ります。

[ATDE ~]$ cd atmark-dist
[ATDE ~/atmark-dist]$ ln -s ../linux-3.14-at4 linux-3.x
[ATDE ~/atmark-dist]$ ls -l linux-3.x
lrwxrwxrwx 1 atmark atmark 20 10月 16 12:00 linux-3.x -> ../linux-3.14-at4

図7.25 atmark-distディレクトリのシンボリックリンクの作成


[警告]注意: linux-3.xはそのまま入力

linux-3.x」は、省略表記ではありません。置き換えなどをせずにそのまま入力してください。

7.2.2. 独自プロダクトの追加

Atmark Distでは、製品固有の設定やファイルは製品(プロダクト)毎のディレクトリにまとめて、管理しています。このディレクトリのことを、プロダクトディレクトリといいます。アットマークテクノ製品の場合、開発セット用の標準イメージに対応するプロダクトディレクトリが、製品毎に用意されています。

Armadilloを使って独自の製品を作る場合、ベースとなるArmadillo用のプロダクトディレクトリをコピーして使用することで、基本的な設定を引き継ぐことができカスタマイズが容易になります。今回は、Armadillo-420ベーシックモデル開発セット用のプロダクトディレクトリをコピーして使用することにします。独自プロダクトの名前は、my-productとします。以下のコマンドを入力し、my-productというプロダクトディレクトリを作成してください。

[ATDE atmark-dist]$ cp -a vendors/AtmarkTechno/Armadillo-420 vendors/AtmarkTechno/my-product

図7.26 独自プロダクトの追加


7.2.3. 基本的なコンフィギュレーション

Atmark Distでは、ユーザーランドのルートファイルシステムにどのアプリケーションやライブラリを含めるか、カーネルにどの機能を含めるかといった設定をすることができます。この設定のことをコンフィギュレーションと呼びます。

本章では、ビルド対象のプロダクトとしてmy-productを選択し、標準のコンフィギュレーションを適用する方法について説明します。現在のところ、my-productはArmadillo-420のプロダクトディレクトリをそのままコピーしただけなので、標準のコンフィギュレーションを適用すると、Armadillo-420の標準イメージと同じ設定となります。

Atmark Distのコンフィギュレーションを変更するには、makeコマンドに引数としてmenuconfigを付けて実行します。menuconfigによるコンフィギュレーション設定画面では、表7.3「menuconfigの操作方法」に示すキー操作で画面の操作を行います。

表7.3 menuconfigの操作方法

キー操作 動作

キー

メニューの選択

キー

動作の選択

スペースキー

オプションの選択

Enterキー

動作の決定


具体的な手順は、次のようになります。

atmark-distディレクトリで、make menuconfigを実行してください。

[ATDE ~/atmark-dist]$ make menuconfig

図7.27 make menuconfigの実行


make menuconfigを実行すると、図7.28「menuconfig: Main Menu 画面」が表示されます。

menuconfig: Main Menu 画面

図7.28 menuconfig: Main Menu 画面


まずは、ベンダーとプロダクトを選択します。キーボードの上下キーでフォーカスを「Vendor/Product Selection --→」に合わせ、Enterキーを押すと、図7.29「menuconfig: Vendor/Product Selection 画面」が表示されます。

menuconfig: Vendor/Product Selection 画面

図7.29 menuconfig: Vendor/Product Selection 画面


デフォルトのベンダーとして「SnapGear」が選択されているので、「AtmarkTechno」に変更します。「(SnapGear) Vendor」を選択すると、図7.30「menuconfig: Vendor 画面」が表示されます。

menuconfig: Vendor 画面

図7.30 menuconfig: Vendor 画面


上の方にある、「AtmarkTechno」を選択すると、図7.31「menuconfig: Vendor/Product Selection 画面」に戻ります。

menuconfig: Vendor/Product Selection 画面

図7.31 menuconfig: Vendor/Product Selection 画面


プロダクトは、先ほど作成した「my-product」に設定します。「(Armadillo-210.Base) AtmarkTechno Products」 を選択すると、図7.32「menuconfig: AtmarkTechno Products 画面」が表示されます。

menuconfig: Products 画面

図7.32 menuconfig: AtmarkTechno Products 画面


下の方にある「my-product」を選択すると、図7.31「menuconfig: Vendor/Product Selection 画面」 に戻ります。

以上でベンダーとプロダクトの選択は終わりです。コンフィギュレーションの設定は以上で完了したので、menuconfigを終了します。

キーボードの右キーでフォーカスをExitに合わせ、Enterキーを押してください。図7.28「menuconfig: Main Menu 画面」に戻ります。Exitにフォーカスを合わせ、Enterキーを押してください。すると、図7.33「menuconfig: Do you wish to save your new kernel configuration?」と表示されますので、Yesにフォーカスを合わせ、Enterキーを押してください。ここでNoを選択すると、これまでの設定がすべて失われます。

menuconfig: Do you wisht to save your new kernel configuration?

図7.33 menuconfig: Do you wish to save your new kernel configuration?


コンフィギュレーションをmy-productの標準設定にする手順は以上です。

7.2.4. ルートファイルシステムのビルドとイメージファイルの作成

コンフィギュレーションの設定が完了したら、ルートファイルシステムとカーネルをビルドします。Atmark Distでは、ビルドと共に、それらをArmadilloのフラッシュメモリに書き込める形式に変換します。このファイルを、イメージファイル又は、単にイメージといいます。

Atmark Distでビルドとイメージの作成を開始するには、makeコマンドを引数なしで実行します。

[ATDE ~/atmark-dist]$ make

図7.34 ルートファイルシステムのビルドとイメージファイルの作成の開始


makeが完了すると、atmark-dist/imagesディレクトリにイメージファイルができています。

[ATDE ~/atmark-dist]$ ls images
linux.bin  linux.bin.gz  romfs.img  romfs.img.gz

図7.35 作成されたイメージファイル


romfs.imgがユーザーランドのルートファイルシステムの、linux.binがカーネルのイメージファイルです。末尾に.gzが付いているファイルは、それぞれを圧縮したものです。通常は、圧縮されたイメージファイルをArmadilloに書き込みます。

7.2.5. イメージファイルの書き込み

前章で作成したイメージファイルを、Armadilloのフラッシュメモリに書き込みます。

Armadilloでは、フラッシュメモリをいくつかの領域(リージョン)に分割して使用しています。カーネルイメージはカーネル領域に、ユーザーランドのルートファイルシステムイメージはユーザーランド領域にそれぞれ書き込みます。

ここでは、Hermit-Atブートローダーのtftpdl機能を使用して、ネットワーク経由で書き込む方法を紹介します。Armadilloのフラッシュメモリにイメージファイルを書き込む方法はいくつかありますが、ATDEとArmadilloがネットワーク接続できている環境であれば、tftpdlによる書き込みが手軽で高速です。その他の書き込み方法については、「Armadillo-400シリーズ ソフトウェアマニュアル」を参照してください。

tftpdlは、TFTPプロトコルを使用してTFTPサーバーからファイルをダウンロードし、フラッシュメモリの書き換えを行う機能です。ATDE5では標準でTFTPサーバーが動作しており、すぐに使うことができます。以下のコマンドを実行して、イメージファイルをTFTPサーバーが使用するディレクトリにコピーしてください。

[ATDE ~/atmark-dist]$ sudo cp images/linux.bin.gz /var/lib/tftpboot
[ATDE ~/atmark-dist]$ sudo cp images/romfs.img.gz /var/lib/tftpboot

図7.36 イメージファイルのコピー


tftpdl機能は、Hermit-Atブートローダーの保守モードで使用することができます。

保守モードで起動するために、一度Armadilloの電源を切り、SW1(タクトスイッチ)を押しながら電源を投入してください。保守モードでHermit-Atが起動すると、Armadilloのシリアルインターフェース1に以下のプロンプトが表示されます。

hermit>

図7.37 Hermit-Atのプロンプト


以下のコマンドを実行することで、tftpdl機能を使用して、カーネルにlinux.bin.gzを、ユーザーランドにromfs.img.gzを書き込みます。イメージファイルは、カーネルかユーザーランドのどちらか一方だけ指定することもできます。

hermit> tftpdl ArmadilloのIPアドレス ATDEのIPアドレス --kernel=linux.bin.gz --userland=romfs.img.gz

Client: ArmadilloのIPアドレス
Server: ATDEのIPアドレス
Region(kernel): linux.bin.gz
Region(userland): romfs.img.gz

initializing net-device...OK
Filename : linux.bin.gz
..................................................................................................
..................................................................................................
..................................................................................................
...................................................
Filesize : 1763642

Filename : romfs.img.gz
..................................................................................................
..................................................................................................
..................................................................................................
..................................................................................................
..................................................................................................
..................................................................................................
..................................................................................................
..................................................................................................
..................................................................................................
..................................................................................................
..................................................................................................
..................................................................................................
..................................................................................................
..................................................................................................
..................................................................................................
..................................................................................................
..................................................................................................
..................................................................................................
..................................................................................................
..................................................................................................
..................................................................................................
..................................................................................................
.............
Filesize : 11102928

programing: kernel
##############

programing: userland
#####################################################################################

completed!!

図7.38 tftpdlコマンド


フラッシュメモリへの書き込みが完了したら、Armadilloの電源を入れ直すことで書き込んだイメージで起動します。

7.3. ルートファイルシステムのカスタマイズ

本章では、独自プロダクトのルートファイルシステムにアプリケーションを追加したり、コンフィギュレーションを変更する方法について説明します。

7.3.1. アプリケーションプログラムの追加

組み込み機器の場合、プロダクト固有のアプリケーションプログラムは、必ずと言っていいほど存在すると思います。ここでは、プロダクト固有のアプリケーションプログラムをAtmark Distに統合する方法を紹介します。例として、「アプリケーションプログラムの作成」で作成した、sinを追加することとします。

7.3.1.1. ディレクトリの追加

まず、プロダクトディレクトリにアプリケーションプログラム用のディレクトリを追加します。追加するディレクトリ名は、sinとします。

[ATDE ~/atmark-dist]$ mkdir vendors/AtmarkTechno/my-product/sin

図7.39 アプリケーションプログラム用ディレクトリの作成


7.3.1.2. ソースコードとmakefileの追加

ソースコードは、図7.10「sin.c」をそのまま使用します。vendors/AtmarkTechno/my-product/sinディレクトリにsin.cをコピーしてください。

Atmark Distにアプリケーションプログラムを統合する場合、Makefileは若干異なり、以下のようになります。vendors/AtmarkTechno/my-product/sinディレクトリに以下の内容でMakefileを追加してください。

LDFLAGS = -lm

TARGET = sin

all: $(TARGET)

sin: sin.o
        $(CC) $(LDFLAGS) $^ $(LDLIBS) -o $@

clean:
        $(RM) *~ *.o $(TARGET)

romfs:
        $(ROMFSINST) /bin/$(TARGET)

%.o: %.c
        $(CC) $(CFLAGS) -c -o $@ $<

図7.40 Atmark Distでsin.cをビルドするMakefile


CCやCFLAGSはAtmark Distによって適切に設定されるので、指定を省略しています。また、romfsターゲットが追加されています。$(ROMFSINST)コマンドによって、TARGETに指定したファイルが、ユーザーランドの/binディレクトリにコピーされます。

7.3.1.3. 追加したディレクトリをビルド対象に含める

アプリケーションプログラム用のディレクトリを、ビルド対象に含めるよう設定します。

プロダクトディレクトリ直下のMakefileで、どのディレクトリをビルド対象とするか決めているので、ここに先ほど追加したアプリケーションプログラム用のディレクトリを追加します。

具体的には、vendors/AtmarkTechno/my-product/MakefileのSUBDIR_y変数に、以下のようにsinを代入してください。

    :
empty :=
space := $(empty) $(empty)

SUBDIR_y += sin
SUBDIR_$(CONFIG_VENDOR_FUNCTESTER_FUNCTESTER)   += functester/
SUBDIR_$(CONFIG_VENDOR_GPIOCTRL_GPIOCTRL)      += gpioctrl/
SUBDIR_$(CONFIG_VENDOR_LEDCTRL_LEDCTRL)           += ledctrl/
    :

図7.41 追加したディレクトリをビルド対象に含めるためのMakefileの修正箇所


7.3.2. ファイルの追加

プロダクトディレクトリ直下のetchomeusrディレクトリ以下にファイルを追加すると、ユーザーランドのルートファイルシステムにそれらのファイルがコピーされます。

例えばatmark-dist/vendors/AtmarkTechno/my-product/etc/my-dirディレクトリを作成し、そのディレクトリにmy-fileファイルを追加したとします。その場合、Atmark Distでビルドしたルートファイルシステムでは/etc/my-dirディレクトリが作成され、そのディレクトリにmy-fileファイルが配置されます。設定ファイルやデータファイルが必要な場合はここに追加してください。

7.3.3. コンフィギュレーションの変更

Atmark Distでは、コンフィギュレーションをカスタマイズすることができます。コンフィギュレーションをカスタマイズすることで、新しい機能を追加したり、逆に機能を必要最小限にしスリムなシステムを構築するといったことが可能になります。

コンフィギュレーションは、大きくわけて二つ、ユーザーランドのルートファイルシステムとカーネルに対して行うことができます。コンフィギュレーションを変更したら、再度Atmark Distのビルドをおこない、新たに作成されたイメージファイルをArmadilloに書き込むことで、変更を反映することができます。

[ティップ]ユーザーランドなのかカーネルなのか

コンフィギュレーションを変更した際に陥りがちな失敗が「ユーザーランドのルートファイルシステムのコンフィギュレーションを変更したのに、カーネルのイメージを書き込んだ」あるいはその逆です。

アプリケーションプログラムやライブラリのコンフィギュレーションを変更した場合は、ユーザーランドの変更です。その場合、Armadilloに書き込むべきイメージファイルはromfs.img.gzです。

カーネルのコンフィギュレーションを変更した場合は、linux.bin.gzです。

変更が反映されないな、と思ったときは、もう一度よくどちらのコンフィギュレーションを変更しているのか、確認してください。

具体的なコンフィギュレーションの方法は、第2部「詳解Atmark Dist」の「コンフィギュレーションの設定」で説明します。

7.4. 量産に向けた準備

これまでに、製品独自のアプリケーションプログラムを作成し、それをAtmark Distに統合してルートファイルシステムとカーネルをビルドし、イメージファイルを作成、そして、Armadilloに書き込むという一連の開発の流れについて説明してきました。十分にテストして、システムとして動作することが確認できれば、製品として出荷する準備は整ったことになります。

本章では、製品の量産化前に行うべきことについて説明します。

7.4.1. カスタマイズサービスを利用する

開発段階では、通常、Armadilloの開発セットを使用します。開発セットには開発に必要な周辺機器一式が含まれているので便利ですが、量産時には不要なものもあります。Armadilloは量産用にボード単体の量産モデルも販売しています。

また、アットマークテクノでは、ユーザー独自のイメージファイルの書き込みや梱包といったカスタマイズを、Armadilloにおこなって納品するという、カスタマイズサービスを提供しています。カスタマイズサービスを利用すると、ユーザーはイメージファイルと作業内容を指示するだけで、ユーザー用にカスタマイズされたArmadilloを購入することができます。

カスタマイズサービスでは以下のサービスを提供しています。

表7.4 カスタマイズサービスの種類

サービス 内容

コネクタ実装指定サービス

標準コネクタの実装/非実装の指定や、指定コネクタの実装など

ROM イメージ書き込みサービス

基板への指定のイメージファイル書き込み

梱包指定サービス

個装箱への封入や、指定シールの貼付などの梱包

ケーシングサービス

ケースへの基板を組み込み

オプション品指定サービス

ACアダプタやケーブルなど、開発用モデル添付の標準オプション品を指定


その他カスタマイズサービスに関する詳しい内容については、弊社営業部までお問い合わせください。

7.4.2. ライセンスに関する注意事項

Armadilloで使用しているソフトウェアは、その大半がオープンソースソフトウェアです。オープンソースソフトウェアの中には、GPLのようにそのソースコードを公開することが義務付けられているものがあります。製品化を行う前に、使用しているソフトウェアがどのようなライセンスを持っているのか、確認する必要があります。

Linuxカーネルには、GPLが適用されます。そのため、Linuxカーネルを使用したシステムを販売する際には、システムで使用しているLinuxカーネルのソースコードをエンドユーザーが入手できる手段を提供しなければなりません。

なお、LinuxカーネルはGPLですが、アプリケーションプログラムからシステムコールを介してその機能を使用する分にはアプリケーションプログラムはGPLの影響を受けません。

BusyBoxも同様にGPLが適用されるソフトウェアです。

7.5. 製品出荷後のメンテナンス

本章では、製品化後に気をつけるべき点について説明します。

7.5.1. ソフトウェアアップデートへの対応

Armadillo用のブートローダー、Linuxカーネル、Atmark Distは、機能追加やバグ修正などで随時アップデートがおこなわれます。これらのアップデートが行われた際、ユーザーの製品で使用しているソフトウェアもアップデートする必要があるかもしれません。

第2部では、最新のソースコードで製品用のイメージを作成しなおす方法や、イメージを自動アップデートする仕組みの構築方法について説明します。

7.5.2. ハードウェアの変更通知

ソフトウェアだけでなく、ハードウェアの変更がある場合もあります。ハードウェアの変更には、エラッタの修正や使用部品の変更、基板の改版などが含まれます。

ユーザー登録を行っておくと、このような変更が行われた際に送られる通知を受け取ることができます。



[64] 実行ファイル名を指定しない場合、実行ファイル名はa.outとなります。

[65] ATDEで使用されているbashというシェルでは実行できますが、Armadilloの標準イメージで使用されているashというシェルではこの操作は実行できません。

[66] /usr/lib/x86_64-linux-gnu/libm.so/lib/x86_64-linux-gnu/libm.so.6 へのシンボリックです。さらに、/lib/x86_64-linux-gnu/libm.so.6/lib/x86_64-linux-gnu/libm-2.13.soへのシンボリックになっており、これがライブラリの実体です。ライブラリのバージョンが変わっても、コンパイルオプションなどを変更しないで済むようにこのような仕組みになっています。

[67] 同様に、/lib/libm-2.13.soへのシンボリックリンクです。

[68] 依存ファイルが複数指定された場合、$^はそれらすべてを意味するのに対して、$<は最初の一つだけを意味します。

[69] uClinux-distをベースに作成しています。

[70] ファイルやディレクトリに対してつける別名のこと