atmark-dist v1.30.0 (AtmarkTechno/Armadillo-440) Linux 2.6.26-at16 [armv5tejl arch]
armadillo440-0 login: root
Password:
[root@armadillo440-0 (ttymxc1) ~]# mount
/dev/ram0 on / type ext2 (rw)
proc on /proc type proc (rw)
usbfs on /proc/bus/usb type usbfs (rw)
sysfs on /sys type sysfs (rw)
udev on /dev type tmpfs (rw)
ramfs on /home/ftp/pub type ramfs (rw)
[root@armadillo440-0 (ttymxc1) ~]# mount -t vfat /dev/mmcblk0p1 /mnt
[root@armadillo440-0 (ttymxc1) ~]# mount
/dev/ram0 on / type ext2 (rw)
proc on /proc type proc (rw)
usbfs on /proc/bus/usb type usbfs (rw)
sysfs on /sys type sysfs (rw)
udev on /dev type tmpfs (rw)
ramfs on /home/ftp/pub type ramfs (rw)
/dev/mmcblk0p1 on /mnt type vfat (rw,fmask=0022,dmask=0022,codepage=cp437,iocharset=iso8859-1)
さて、SDメモリカードがマウントできることが確認できたので、この作業を自動化します。 /etc/config/rc.local というファイルは、システムが起動時に自動で呼び出してくれるシェルスクリプトです。(rc: run commands の略) vi を利用してrc.localを編集します。viの使い方はWebなどを参照してください。
[root@armadillo440-0 (ttymxc1) ~]# vi /etc/config/rc.local
このファイルの最後のほうに、以下のコマンドを追加します。
if test -b /dev/mmcblk0p1; then
echo -n "Mounting SD memory"
mount -t vfat /dev/mmcblk0p1 /mnt
check_status
fi
if test -b ~ で /dev/mmcblk0p1 というブロックデバイスファイルがあるかどうかをチェックしています。ある場合は、Mounting SD memory とコンソールに表示し、mountコマンドでSDメモリを /mnt にマウントします。
#!/bin/sh
MOUNT_POINT=/mnt
export LD_LIBRARY_PATH=$LIBPATH:$MOUNT_POINT/lib/
comps=`ls $MOUNT_POINT/rtc`
for r in $comps; do
$MOUNT_POINT/rtc/$r -f $MOUNT_POINT/rtc.conf &
done
atmark@atde3:~$ openrtm_usbmem.sh -h
Usage: openrtm_usbmem.sh -d <dir> -r <rtc> -l <libdir>
This script creates a directory to be copied to USB memory
for Armadillo execution environment. One or more RTCs can be
specified by -r and are copied to rtc directory. Dependent
libraries are automatically analyzed and copied to lib
directory. boot.sh to launch RTCs and rtc.conf for RTCs are
also created.
-d <dir> Target directory
-r <rtc> Target RTC binary
-l <libdir> Library search path
-h Print this help
EXAMPLE
$ cd my_component_dir
$ ls
mycomponent mycomponent.so
$ openrtm_usbmem.sh -d /tmp/usbmem -r mycomponent -l . -l ../deplibdir
コンポーネントの実行のための準備
ここで、OpenRTM-aistに付属のサンプルをArmadillo上で実行してみます。 Armadillo-400シリーズはSDメモリカードスロットがついており、SDメモリに実行ファイル、ライブラリおよびrtc.conf等の設定ファイルをコピーしArmadilloに挿すことで、RTコンポーネントを実行することができます。
SDメモリカード利用の準備
UNIX (Linux) では Windows とは異なり、システムのすべてのファイルやフォルダがルート('/') を頂点とする一つのツリー(木)構造を構成します。 (Widnowsでは、ドライブという概念があり、C:\, D:\, ... を頂点としたツリーが複数存在します。)
UNIXではシステムにディスク (ハードディスク、USBフラッシュメモリ、SDカードメモリ等) をつないだ場合、すでに存在するツリーのどこかにディスクを接続します。これをマウント (mount) と呼びます。
工場出荷状態のArmadillo-400シリーズでは、SDメモリカードを挿しても自動的にはマウントされないかもしれません。 ここでは、Armadillo起動後にSDメモリカードを自動的にマウントするように設定します。
手動でマウントしてみる
ArmadilloにSDメモリカードを挿して起動します。アカウント名root、パスワードrootでログインします(デフォルト設定)。 まず、mountコマンドで何がどこにマウントされているかを確認します。
atmark-dist v1.30.0 (AtmarkTechno/Armadillo-440) Linux 2.6.26-at16 [armv5tejl arch]
proc, usbfs sysfs udev ramfs はそれぞれ疑似デバイスなので、今は無視してください。 /dev/ram0 というのはRAMディスクです。Armadilloではフラッシュメモリに格納された / (ルート) から始まるディスクイメージをRAM領域に展開してRAMディスクとして / にマウントして利用しています。
もし、このリストに /dev/mmcblk0p1 から始まる行が含まれている場合 SD メモリがすでにマウントされている可能性があります。/dev/mmcblk0p1 はSDメモリカードへのアクセスをファイルに抽象化したデバイスファイルです。mmcblk0p1 は
という意味です。ls -l /dev/mmcblk* でほかのデバイスを見てみると、
/dev/mmcblk0 というデバイスもあることがわかります。これはSDメモリカード全体のデバイスファイルで、その下に第1番目のパーティションとして /dev/mmcblk0p1 が存在するといったイメージで考えてください。
ここで利用するのは、パーティション1のデバイスである /dev/mmcblk0p1 です。 以下のようにタイプしてください。
SDメモリの第1パーティション /dev/mmcblk0p1 が /mnt 以下にマウントされていることがわかります。 なお、最初のコマンドで -t vfat というオプションは対象デバイスのファイルシステムを指定するためのオプションで、VFAT (Virtual File Allocation Table) の略で、Windows 95 以降で採用されたロングファイル名が利用可能なファイルシステムです。 最近のWindowsではNTFSが主流ですが、USBメモリ、SDメモリなどでは VFAT た exFATなどのファイルシステムがよく利用されています。
もし、-t vfat オプションでうまくマウントできない場合は、WidnowsにSDメモリカードを挿してVFATでフォーマットしなおしてください。
マウントの自動化
さて、SDメモリカードがマウントできることが確認できたので、この作業を自動化します。 /etc/config/rc.local というファイルは、システムが起動時に自動で呼び出してくれるシェルスクリプトです。(rc: run commands の略) vi を利用してrc.localを編集します。viの使い方はWebなどを参照してください。
このファイルの最後のほうに、以下のコマンドを追加します。
if test -b ~ で /dev/mmcblk0p1 というブロックデバイスファイルがあるかどうかをチェックしています。ある場合は、Mounting SD memory とコンソールに表示し、mountコマンドでSDメモリを /mnt にマウントします。
起動時に以下のように done/failed といったメッセージがコンソールに表示されましたが、
これは、起動時の実行したコマンドが正常に終了したかを示しています。 この done/failed を表示していたのが check_status というコマンドで、直前のコマンドの実行が成功したか否かを表示します。
RTCの自動起動
SDメモリを自動的にマウントするだけでなく、マウントしたSDメモリカードに入っているRTCを自動的に起動するように設定します。
マウントしたSDメモリのトップにboot.shというシェルスクリプトを置き、そこにRTCを起動する手順を記述するものとします。 rc.local には以下のようなコマンドを SDカードをマウントするコマンドの後に 記述します。
クロックの同期
Armadillo-420/440 等ではリアルタイムクロックをバックアップする電池などは搭載されていないため、起動直後のクロックは無意味時刻を示します。 そこで、NTPで正確な時刻にセットします。
SDメモリカードをマウントするコマンドの前にに以下のコマンドを入力してください。
これで、Armadilloがネットワークにつながっていれば、NTPで正確な時刻を取得してクロックに設定します。
設定ファイルの書き込み
さて、ここまで編集したrc.localは、そのままでArmadilloを再起動すると消えてしまいます。 上でも述べたように、Armadillo のシステムファイルはフラッシュメモリ上に圧縮され格納されており、起動時にRAM領域に展開されて利用されます。 システム上のファイルを変更しても、電源を切って再投入すれば、すべてのファイルは元に戻ります。
しかし、/etc/config ディレクトリ以下のファイルだけは、システム全体とは別の領域に格納されており、flatfsdというコマンドに-sオプションをつけて起動することにより変更を保存することができます。
これでArmadillo側の事前の準備は完了です。電源を入れなおして再起動してみてください。 再起動後ログインし、mountコマンドでSDメモリがマウントされていることを確認します
なお、flatfsdの詳細についてはArmadilloのサイトの以下の文書を参照してください。実行ファイルのSDメモリへのコピー
以下のようなディレクトリ構成でファイルを配置します。
libディレクトリには、RTコンポーネントを実行するのに必要なライブラリを格納します。最低限必要なライブラリは以下のものになります。
この他、動作させたいRTコンポーネントが依存しているライブラリがあれば、それらもいっしょにlibディレクトリにいれておきます。
依存ライブラリを調べる方法
さて、上記のライブラリや、RTCが依存ライブラリをしているライブラリを調べるには、どのようにすれば良いのでしょうか? Linuxでの開発経験がある人は、ldd コマンドを思いつくかもしれません。 lddコマンドは実行ファイルや共有ライブラリの依存関係を表示するコマンドで以下のように使用します。
libm (sin, cos関数など含む数学ライブラリ) はlibc など幾つかのライブラリに依存していることがわかります。
しかし、あいにく対象はARM用のライブラリであり、lddは利用することはできません。 こう言った場合には、readelfコマンドを使用します。ARM用のバイナリに対して利用できる arm-linux-gnueabi-readelf コマンドは /usr/bin/arm-linux-gnueabi-readelf にあります。
このように、libomniORB4.soが依存しているライブラリを調べることができます。 対象とする実行ファイルやライブラリが依存しているライブラリを再帰的にに調べ上げて、libディレクトリにコピーする必要があります。
起動スクリプト
SDメモリに格納されたライブラリをを利用してRTコンポーネントを実行するには、SDメモリのlibディレクトリにライブラリサーチパスを通す必要があります。
SDメモリは /mnt ディレクトリにマウントとすると、ライブラリのパスは /mnt/lib となります。ライブラリサーチパスを通すには、環境変数 LD_LIBRARY_PATH にこのパス /mnt/lib をセットする必要があります。
このほか、rtcディレクトリ以下にあるRTCの実行ファイルをすべて起動するスクリプトの例を以下に示します。
LD_LIBRARY_PATHにパスを通して、rtcディレクトリの中にあるRTコンポーネントの実行ファイルを全て起動します。
rtc.conf
PC上で実行する場合と同様にRTコンポーネントを起動後、その名前と参照を登録するネームサーバを、corba.nameservers オプションで指定します。また、デバッグフェーズではログに関するオプションも指定した方が良いかもしれませn。
corba.nameservers: 192.168.11.10 logger.log_level: PARANOID logger.file_name: /mnt/rtc%p.log
この例では、ネームサーバのアドレスを192.168.11.10に、ログレベルをPARANOID (すべてのメッセージをログに残す) に指定し、そのログファイル名をSDメモリ上の /mnt/rtc<プロセス番号>.log にしています。
詳しくは、デベロッパーズガイドの設定ファイル (基礎編)およびrtc.conf設定項目一覧を参照してください。
openrtm_sdmem.sh
以上の作業を自動化するスクリプトが、openrtm_sdmem.sh です。このスクリプトのヘルプを示します。
-dオプションでファイルをコピーするターゲットディレクトリ、-rオプションでRTコンポーネントの実行ファイル、ーlでライブラリを検索するディレクトリをそれぞれ指定し実行します。