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

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

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

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

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

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

  5. tftpbootを利用して開発を効率化する

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

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

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

まずは、ATDE上で動作する「Hello World!」を作成してみましょう。テキストエディタ[20]には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-IoT ではarmelというアーキテクチャが使われています。Armadillo-IoTで実行することができる実行ファイルをATDE上で作成する方法を説明します。

Armadillo-IoT 上で動作するようにコンパイルする場合は、コンパイラ(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-IoT 上で動作するようにmain.cをクロスコンパイル


Armadillo-IoT に実行ファイルを転送して動作の確認を行います。ここではファイル転送にFTPを利用します。次の例では、Armadillo-IoT のIPアドレスが「192.0.2.10」であることを想定しています。

[ATDE ~/hello]$ ftp 192.0.2.10
Connected to 192.0.2.10.
220 armadillo-iotg FTP server (GNU inetutils 1.4.1) ready.
Name (192.0.2.10:atmark): ftp
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 CWD command successful.
ftp> put hello
local: hello remote: hello
200 PORT command sucessful.
150 Opening BINARY mode data connection for 'hello'.
226 Transfer complete.
5087 bytes sent in 0.00 secs (112903.9 kB/s)
ftp> quit
221 Goodbye.

図13.5 ArmadilloにFTPでhelloを転送


minicomなどを利用してArmadillo-IoT にログインすると/home/ftp/pubにhelloが転送されています。転送されたばかりのファイルには実行権限がついていないため、chmodコマンドで実行権限を付与して実行してみましょう。

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

図13.6 Armadillo-IoT 上でhelloを実行


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

「ユーザーオリジナルアプリケーションを作成する」では、Armadillo-IoT 上で動作することができる実行ファイルを作成することができました。続いて、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.7 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.8 helloをmake


[注記]

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

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

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

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

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

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


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

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

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

図13.10 オリジナルプロダクトを作成し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 SUBDIR_$(CONFIG_VENDOR_SWMGR_SWMGR)		+= swmgr/
36 SUBDIR_$(CONFIG_VENDOR_THERMALTRIGGER_THERMALTRIGGER)	+= thermaltrigger/
37 SUBDIR_$(CONFIG_VENDOR_VINTRIGGER_VINTRIGGER)	+= vintrigger/
38 SUBDIR_$(CONFIG_VENDOR_AWL12_AERIAL)		+= awl12/
39 SUBDIR_$(CONFIG_VENDOR_AWL13_AWL13)		+= awl13/

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


図13.7「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.12 romfsターゲットの追加


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

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

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

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


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

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

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

また、セキュリティーについても考慮すべきでしょう。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.41.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.41.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.41.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. 削除するアプリケーションにカーソルを合わせて"N"を押下し選択を解除してください。そして、"Exit"を2回選択して「Do you wish to save your new kernel configuration?」で"Yes"とすることで設定を保存することができます。

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

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

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

     atmark-dist v1.41.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
                    [*] swmgr
    
      --------------------------------------------------------------------
    
                        <Select>    < Exit >    < Help >
  3. 「change root passwd」を選択すると、rootパスワードを変更することができます。

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

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.41.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.14 distclean ターゲットの変更例


13.5. tftpbootを利用して開発を効率化する

開発やデバッグ中など頻繁にビルドを行う場合、カーネルイメージ(linux.bin.gz)、ユーザーランドイメージ(romfs.img.gz)をビルドするたびにフラッシュメモリに書き込むのは非常に効率が悪いです。

このような場合、tftpboot を利用すると便利です。

Hermit-At ブートローダーは、TFTP サーバー上に配置されたカーネルまたはユーザーランドのイメージを取得し RAM 上に展開したあと起動する、tftpboot 機能を有しています。

tftpboot 機能を使用すると、フラッシュメモリにイメージを書くことなく起動できるため、開発の初期段階などイメージの更新が頻繁に行われる際に、効率よく作業することができます。

13.5.1. ファイルの配置

TFTP サーバーのルートディレクトリに、カーネルイメージとユーザーランドイメージを配置してください。

Armadillo-IoT にイメージを提供するTFTP サーバーは、Armadillo-IoT のLAN インターフェース(CON6)が接続されているネットワーク上に存在する必要があります。3G、無線LANまたはUSB接続のEthernetアダプタ等を使うことはできません。

[ティップ]

ATDE では、標準状態で TFTP サーバー (atftpd) が動作しています。/var/lib/tftpboot ディレクトリにファイルを置くことで、TFTP によるアクセスが可能になります。

13.5.2. tftpbootの実行

Armadillo-IoT を保守モードで起動してください。

作業用 PC のシリアル通信ソフトウェアを使用して、次に示すコマンドを入力すると、TFTP サーバー上に配置されたカーネルイメージ、ユーザーランドイメージから起動します。

hermit> tftpboot [Armadillo-IoT IP adress] [tftp server IP adress] --kernel=kernel_image_file_name --userland=userland_image_file_name

図13.15 tftpboot コマンド


カーネルとユーザーランドのイメージは、どちらか一方だけ、もしくは両方指定できます。

TFTP サーバーの IP アドレスが 192.168.10.1、Armadillo-IoT の IP アドレスが 192.168.10.10で、カーネルイメージのファイル名が linux.bin.gz、ユーザーランドのイメージのファイル名が romfs.img.gz の場合、以下のようになります。

hermit> tftpboot 192.168.10.10 192.168.10.1 --kernel=linux.bin.gz --userland=romfs.img.gz

図13.16 tftpboot コマンド例


13.5.3. ブートデバイスを TFTP サーバーに設定

setbootdevice コマンドでブートデバイスを TFTP サーバーに設定した場合、設定は保存され、起動時に毎回カーネルもしくはユーザーランドイメージを TFTP サーバーから取得するようになります。

TFTP サーバーの IP アドレスが 192.168.10.1、Armadillo-IoT の IP アドレスが 192.168.10.10で、カーネルイメージのファイル名が linux.bin.gz、ユーザーランドのイメージのファイル名が romfs.img.gz の場合、以下のようになります。

hermit> setbootdevice tftp 192.168.10.10 192.168.10.1 --kernel=linux.bin.gz --userland=romfs.img.gz

図13.17 setbootdevice コマンド例


setbootdevice コマンドの実行後、bootコマンドを実行するか、オートブートモードでArmadillo-IoTを再起動すると、TFTP サーバー上に配置されたカーネルイメージ、ユーザーランドイメージから起動します。

ブートデバイスをデフォルト(flash)に戻すには、次に示すコマンドを実行します。

hermit> setbootdevice flash

図13.18 setbootdevice をデフォルトに戻す




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