第13章 開発の基本的な流れ

本章では、Armadillo-Box WS1 を用いたシステム開発の一連の流れについて説明します。

  1. ユーザーオリジナルアプリケーションを作成する

  2. Atmark Distにユーザーオリジナルアプリケーションを組み込む

  3. システムの最適化を行う

  4. オリジナルプロダクトのコンフィギュレーションを更新する

以降では、上記ステップについて順を追って説明します。

13.1. ユーザーオリジナルアプリケーションを作成する

ここでは、システムのメイン機能となるアプリケーションプログラムを作成する方法を説明します。ほとんどのシステムでは、ユーザーオリジナルなアプリケーションを実装するものと思います。本章では定番である「Hello world!」を例に、C言語でアプリケーションプログラムのソースコードを作成し、コンパイル、動作確認する方法について説明します。

まずは、ATDE上で動作する「Hello World!」を作成してみましょう。テキストエディタ[9]にはgeditを利用します。

[ATDE ~]$ mkdir hello
[ATDE ~]$ cd hello
[ATDE ~/hello]$ gedit main.c &

図13.1 ディレクトリを作成後、テキストエディタ(gedit)を起動


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

int main(void)
{
	printf("Hello World!\n");

	return EXIT_SUCCESS;
}

図13.2 「Hello World!」のソース例(main.c)


作成したソースコードが意図した通りに動作するか、ATDE上で動作するようにコンパイルして実行し、動作の確認をしましょう。

[ATDE ~/hello]$ gcc main.c -o hello 1
[ATDE ~/hello]$ ls
hello  main.c
[ATDE ~/hello]$ ./hello 2
Hello World!

1

ATDE上で動作するようにコンパイルするには「gcc」コマンドを使用します。

2

コンパイルされた実行ファイル(hello)を実行

図13.3 ATDE上で動作するようにmain.cをコンパイルし実行


意図した通りに実行できましたね。では次にArmadilloが実行できるようにコンパイルを行います。 Armadilloのアプリケーションを作成するには、クロスコンパイルが基本的な手法となります。先に示している、ブートローダー、Linuxカーネル、ユーザランドイメージもクロスコンパイルされています。

クロスコンパイルとは、別のアーキテクチャで動作する実行ファイルを作成することです。ATDEなど、通常のPCは、i386またはamd64と言われるアーキテクチャとなっています。Armadillo-Box WS1 ではarmelというアーキテクチャが使われています。Armadillo-Box WS1で実行することができる実行ファイルをATDE上で作成する方法を説明します。

Armadillo-Box WS1 上で動作するようにコンパイルする場合は、コンパイラ(gcc)にarmelアーキテクチャ用のもの(arm-linux-gnueabi-gcc)を利用します。

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

図13.4 Armadillo-Box WS1 上で動作するようにmain.cをクロスコンパイル


Armadillo-Box WS1 に実行ファイルをコピーして動作の確認を行います。ここではATDEで動作しているHTTPサーバーにファイルを一旦アップロードし、Armadillo-Box WS1 にそのファイルをダウンロードさせています。また、ATDEのIPアドレスが「192.0.2.11」であることを想定しています。

[ATDE ~/hello]$ cp hello /var/www/

図13.5 HTTPサーバーにhelloをアップロード


[armadillo ~]# curl -O http://192.0.2.11/hello
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  5156  100  5156    0     0  22079      0 --:--:-- --:--:-- --:--:-- 22614

図13.6 ATDEからhelloをダウンロード


ダウンロードしたばかりのファイルには実行権限がついていないため、chmodコマンドで実行権限を付与して実行してみましょう。

[armadillo ~]# ls
hello
[armadillo ~]# chmod +x hello
[armadillo ~]# ./hello
Hello World!

図13.7 Armadillo-Box WS1 上でhelloを実行


13.2. Atmark Distにユーザーオリジナルアプリケーションを組み込む

「ユーザーオリジナルアプリケーションを作成する」では、Armadillo-Box WS1 上で動作することができる実行ファイルを作成することができました。続いて、Atmark Distにそのアプリケーションを組み込み、ユーザーランドのイメージファイル(romfs.img.gz)に自動的にインストールされるように作業を行います。

はじめにhelloアプリケーションをビルドするためのMakefileを作成します。このMakefileは、Atmark Distのビルドシステムにhelloを組み込むために必要となります。テキストエディタで作成します。

TARGET = hello

CROSS_COMPILE ?= arm-linux-gnueabi-
CC = $(CROSS_COMPILE)gcc
CFLAGS = -Wall -Wextra -O3

all: $(TARGET)

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

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

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

図13.8 hello用のMakefile


Makefileが正しく作成できたかを確認するために、一度ビルドしてみましょう。ビルドにはmakeコマンドを利用します。

[ATDE ~/hello]$ make
arm-linux-gnueabi-gcc -Wall -Wextra -O3 -c -o main.o main.c
arm-linux-gnueabi-gcc  main.o  -o hello
[ATDE ~/hello]$ ls
Makefile  hello  main.c  main.o

図13.9 helloをmake


[注記]

makefileの記述ルールは次のようになります。

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

makeコマンドに続けて入力することによりターゲットを指定することができます。ターゲットを指定しない場合は、makefileのルールで最初に記述されているターゲットが実行されます。

図13.8「hello用のMakefile」では、ターゲット指定をしない場合は、"all"ターゲットが実行されます。cleanターゲットを指定しmakeすると、一時ファイルなどが消去されます。

[ATDE ~/hello]$ make clean
rm -f *~ *.o hello

図13.10 cleanターゲット指定した例


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

ここでは、Armadillo-Box WS1のプロダクトディレクトリをコピーしてオリジナルプロダクトを作成し、そのオリジナルプロダクトにhelloを組み込みます。オリジナルプロダクトの名前は、"my-product"とします。なお、「~/atmark-dist」を配置していない場合は、「Linuxカーネル/ユーザーランドをビルドする」を参照して配置してください。

[ATDE ~/hello]$ cd ~/atmark-dist/
[ATDE ~/atmark-dist]$ cp -r vendors/AtmarkTechno/Armadillo-Box-WS1/ vendors/AtmarkTechno/my-product
[ATDE ~/atmark-dist]$ cp -r ../hello/ vendors/AtmarkTechno/my-product/

図13.11 オリジナルプロダクトを作成しhelloディレクトリをコピー


続いて、helloをAtmark Distのビルドシステムに組み込みます。 プロダクトディレクトリ(atmark-dist/vendors/AtmarkTechno/my-product/)にあるMakefileをテキストエディタで開き、次のように34行目を追加します。

29 comma := ,
30 empty :=
31 space := $(empty) $(empty)
32 
33 SUBDIR_y =
34 SUBDIR_y += hello/
35 

図13.12 オリジナルプロダクト(my-product)にhelloを登録


図13.8「hello用のMakefile」では、romfsディレクトリ(atmark-dist/romfs/)にファイルをインストールするためのromfsターゲットに対応していないため、ビルドされた実行ファイルは作成されますが、ユーザーランドイメージに実行ファイルがインストールされることはありません。ユーザーランドイメージに自動的にインストールされるように、romfsターゲットを追加しましょう。ここでは、Armadillo上の/usr/bin/ディレクトリ以下にhelloがインストールされるように記述してみます。(18-19行目を追加)

12 %.o: %.c
13      $(CC) $(CFLAGS) -c -o $@ $<
14
15 clean:
16      $(RM) *~ *.o hello
17
18 romfs: hello 
19      $(ROMFSINST) /usr/bin/hello

図13.13 romfsターゲットの追加


これで、my-productにhelloが追加されました。my-productをビルドして、イメージファイルを書き換えてみましょう。「Linuxカーネル/ユーザーランドをビルドする」の手順の中で、AtmarkTechno Productsに"Armadillo-Box-WS1"を選択している箇所では"my-product"を選択します。ビルドして出来上がったユーザーランド(romfs.img.gz)をフラッシュメモリに書き込むには、12章フラッシュメモリの書き換え方法を参照してください。

フラッシュメモリを書き換えた後Armadilloを再起動すると、/usr/bin/helloが組み込まれたユーザーランドとなっています。

[armadillo ~]# ls /usr/bin/hello
/usr/bin/hello
[armadillo ~]# hello
Hello World!

図13.14 helloが組み込まれたユーザーランドイメージ


13.3. システムの最適化を行う

ここでは、システム開発の最終段階の最適化について説明します。

ベースとしたArmadillo-Box WS1 では、システムに不要なアプリケーションなどが含まれていると思います。不要なアプリケーションを省くことでイメージファイルがスリムになり起動速度が向上したり、空きメモリ容量が増えるなどのシステムの負荷が軽減します。

また、セキュリティーについても考慮すべきでしょう。Armadilloのデフォルトのrootパスワードは、「root」となっています。デフォルトのままにしてしまうと簡単にハッキングされてしまう恐れがあります。

必要のないアプリケーションを削除したり、パスワードの変更を行うには、make menuconfigなどを行いシステムを変更します。

手順13.1 必要のないアプリケーションを削除する

  1. make menuconfigを行い「Kernel/Library/Defaults Selection --->」を選択します。

    [ATDE ~]$ cd atmark-dist
    [ATDE ~/atmark-dist]$ make menuconfig
     atmark-dist v1.42.0 Configuration
    ------------------------------------------------------------------------
                                    Main Menu
      Arrow keys navigate the menu.  <Enter> selects submenus --->.
      Highlighted letters are hotkeys.  Pressing <Y> includes, <N> excludes,
      <M> modularizes features.  Press <Esc><Esc> to exit, <?> for Help.
      Legend: [*] built-in  [ ] excluded  <M> module  < > module capable
      --------------------------------------------------------------------
                    Vendor/Product Selection  --->
                    Kernel/Library/Defaults Selection  --->
                    ---
                    Load an Alternate Configuration File
                    Save Configuration to an Alternate File
    
    
      --------------------------------------------------------------------
    
                        <Select>    < Exit >    < Help >
  2. 「Customize Vendor/User Settings」を選択して"Exit"を2回して「Do you wish to save your new kernel configuration?」で"Yes"とします。

     atmark-dist v1.42.0 Configuration
    ------------------------------------------------------------------------
                        Kernel/Library/Defaults Selection
      Arrow keys navigate the menu.  <Enter> selects submenus --->.
      Highlighted letters are hotkeys.  Pressing <Y> includes, <N> excludes,
      <M> modularizes features.  Press <Esc><Esc> to exit, <?> for Help.
      Legend: [*] built-in  [ ] excluded  <M> module  < > module capable
      --------------------------------------------------------------------
                 --- Kernel is linux-3.x
                 (default) Cross-dev
                 (None) Libc Version
                 [ ] Default all settings (lose changes) (NEW)
                 [ ] Customize Kernel Settings (NEW)
                 [*] Customize Vendor/User Settings (NEW)
                 [ ] Update Default Vendor Settings (NEW)
    
      --------------------------------------------------------------------
    
                        <Select>    < Exit >    < Help >
  3. Userland Configurationメニューが表示されます。

     atmark-dist v1.42.0 Configuration
    ------------------------------------------------------------------------
                            Userland Confgiguration
      Arrow keys navigate the menu.  <Enter> selects submenus --->.
      Highlighted letters are hotkeys.  Pressing <Y> includes, <N> excludes,
      <M> modularizes features.  Press <Esc><Esc> to exit, <?> for Help.
      Legend: [*] built-in  [ ] excluded  <M> module  < > module capable
      --------------------------------------------------------------------
                    Vendor specific  --->
                    Fonts  --->
                    Core Applications  --->
                    Library Configuration  --->
                    Flash Tools  --->
                    Filesystem Applications  --->
                    Network Applications  --->
                    Miscellaneous Applications  --->
                    BusyBox  --->
                    Tinylogin  --->
      --------------------------------------------------------------------
    
                        <Select>    < Exit >    < Help >
  4. ここでは、例として「java」を削除してみます。「Miscellaneous Applications --->」を選択しメニューをスクロールすると java の項目があります。

     atmark-dist v1.42.0 Configuration
    ------------------------------------------------------------------------
                           Miscellaneous Applications
      Arrow keys navigate the menu.  <Enter> selects submenus --->.
      Highlighted letters are hotkeys.  Pressing <Y> includes, <N> excludes,
      <M> modularizes features.  Press <Esc><Esc> to exit, <?> for Help.
      Legend: [*] built-in  [ ] excluded  <M> module  < > module capable
      --------------------------------------------------------------------
                    [*] java
                    [*]   Oracle Java SE Embedded 8
                    (compact1)     profile
                    (minimal)     vm
                    ---     extension
                    [ ]     sunec
                    [ ]     sunpkcs11
                    [ ]     locales
                    [ ]     charsets
                    [ ]     nashorn
      --------------------------------------------------------------------
    
                        <Select>    < Exit >    < Help >
  5. 「java」にカーソルを合わせて"N"を押下し選択を解除してください。そして、"Exit"を2回選択して「Do you wish to save your new kernel configuration?」で"Yes"とすることで設定を保存することができます。

      --------------------------------------------------------------------
                    [ ] java
    

手順13.2 rootパスワードを変更する

  1. 手順13.1「必要のないアプリケーションを削除する」と同様に、make menuconfigを使い「Userland Configuration」メニューを開きます。

  2. 「Vendor specific --->」を選択します。

     atmark-dist v1.42.0 Configuration
    ------------------------------------------------------------------------
                                 Vendor specific
      Arrow keys navigate the menu.  <Enter> selects submenus --->.
      Highlighted letters are hotkeys.  Pressing <Y> includes, <N> excludes,
      <M> modularizes features.  Press <Esc><Esc> to exit, <?> for Help.
      Legend: [*] built-in  [ ] excluded  <M> module  < > module capable
      --------------------------------------------------------------------
                    [ ] change root password
                    (Auto) generate file-system option
                    --- Applications
                    --- Kernel modules
    
      --------------------------------------------------------------------
    
                        <Select>    < Exit >    < Help >
  3. 「change root passwd」を選択すると、rootパスワードを変更することができます。

      --------------------------------------------------------------------
                    [*] change root password
                         root password: "root"
                    (Auto) generate file-system option
                    --- Applications
                    --- Kernel modules
    
      --------------------------------------------------------------------

13.4. オリジナルプロダクトのコンフィギュレーションを更新する

make menuconfigで修正を加えたコンフィギュレーションは、一時ファイルとして保存されています。一時ファイルはmake cleanやmake distcleanなどでAtmark Distをクリーンアップした場合に削除されてしまいます。再度コンフィギュレーションを復元するためには、一からコンフィギュレーション手順を再現しなくてはなりません。

Atmark Distをクリーンアップした場合でも、設定したコンフィギュレーションを恒久的に復元させることができるように、プロダクトのデフォルトコンフィギュレーションを上書き更新する手順を説明します。

手順13.3 プロダクトのデフォルトコンフィギュレーションを上書き更新する

  1. 手順13.1「必要のないアプリケーションを削除する」と同様に、make menuconfigを使い「Kernel/Library/Defaults Selection」メニューを開きます。

  2. 「Update Default Vendor Settings」を選択しておきます。「Customize Vendor/User Settings」でコンフィギュレーションを変更した場合などに、自動的にプロダクトのデフォルトコンフィギュレーションが上書き更新されるようになります。

     atmark-dist v1.42.0 Configuration
    ------------------------------------------------------------------------
                        Kernel/Library/Defaults Selection
      Arrow keys navigate the menu.  <Enter> selects submenus --->.
      Highlighted letters are hotkeys.  Pressing <Y> includes, <N> excludes,
      <M> modularizes features.  Press <Esc><Esc> to exit, <?> for Help.
      Legend: [*] built-in  [ ] excluded  <M> module  < > module capable
      --------------------------------------------------------------------
                 --- Kernel is linux-3.x
                 (default) Cross-dev
                 (None) Libc Version
                 [ ] Default all settings (lose changes) (NEW)
                 [ ] Customize Kernel Settings (NEW)
                 [ ] Customize Vendor/User Settings (NEW)
                 [*] Update Default Vendor Settings (NEW)
    
      --------------------------------------------------------------------
    
                        <Select>    < Exit >    < Help >

    「Update Default Vendor Settings」を選択した場合に更新されるデフォルトコンフィグファイルを表13.1「デフォルトコンフィグファイル」に示します。

    表13.1 デフォルトコンフィグファイル

    対象デフォルトコンフィギュレーションファイル
    Linuxカーネル[プロダクトディレクトリ]/config.linux-3.x[a]
    Userland[プロダクトディレクトリ]/config.vendor
    Busybox-1.20.2[プロダクトディレクトリ]/config.busybox-1.20.2

    [a] ファイルが存在しない場合は、Linuxカーネルのデフォルトコンフィグが使用されます


[注記]Linuxカーネルのデフォルトコンフィグレーションがmake distcleanで削除されないようにするには

デフォルトコンフィグファイルのうち、Linuxカーネルのデフォルトコンフィグレーションは、make distcleanを実行すると削除されるようになっています。この挙動が望ましくない場合は、[プロダクトディレクトリ]/Makefile の distclean ターゲットで config.$(LINUXDIR) を削除しないよう、次のように書き換えてください。

distclean: clean
            rm -f etc/DISTNAME

図13.15 distclean ターゲットの変更例




[9] ATDEには、gedit、emacsやviなどのテキストエディタがあらかじめインストールされています。