- 1回目: 開発環境の準備
- 2回目: Hello Worldプロジェクト
- 3回目: PSのGPIOでLチカ
- 4回目: PLのAXI GPIOでPSからLチカ
- 5回目: PLだけでLチカ
- 6回目: 自作IPでLチカ
- 7回目: ブートイメージを作る
- 8回目: Linux起動する
- 9回目: Linuxカーネルを少しカスタマイズする
- 10回目: LinuxのRootFSをカスタマイズする / PythonでHello World
- 11回目: LinuxユーザアプリケーションでLチカ
- 12回目: LinuxカーネルモジュールでLチカ
- 13回目: LAN(Ethernet 0)を使う
- 14回目: Linuxユーザアプリをデバッグする / RootFSに取り込む
- 15回目: Linux起動時にアプリケーションを自動実行させる <--- 今回の内容
- 16回目: Linuxから自作IPをUIOで制御する
- 17回目: Linuxで自作IPのデバイスドライバを作る
- 18回目: IoT化してスマホからLチカ
環境
- 開発用PC: Windows 10 64-bit
- Vivado 2017.4 WebPACKライセンス
- Xilinx SDK 2017.4 <- 今回は未使用
- 開発用PC (Linux): Ubuntu 16.04 本家 (日本語版じゃない) (on VirtualBox 5.2.4)
- PetaLinux 2017.4
- ターゲットボード: ZYBO (Z7-20)
Linux起動時にアプリケーションを自動実行させる
前回の内容で、自作のユーザアプリケーションをRootFSにインストールすることが出来ました。これによって、作成したアプリケーションをZYBO上で実行することが出来ます。しかし、実際のプロダクトだと、お客さんはコマンドを打って実行をするなんてことはできません。
今回は、自作したアプリケーションをLinux起動時に自動実行させるということをやります。
前回の続きとして、/usb/bin/blink1
がすでにあるものとします。今回は、このアプリケーションを起動時に実行させます。
起動スクリプトの作成
方針としては、起動スクリプト(/etc/init.d/myinit
)をインストールして、そのスクリプトで任意のアプリケーションを呼ぶようにします。結果として、自作アプリケーションがデーモンとして実行されます。今回は、直接blink1
を呼ぶのではなく、myinit_run.sh
というblink1
を呼ぶだけのシェルスクリプトを間に挟みます。これは、省略できます。が、今後、何か起動時の処理を変更したいときは、myinit_run.sh
をいじるだけでOKになります。
- 起動 ->
/etc/init.d/myinit
->/usb/bin/myinit_run.sh
->/usb/bin/blink1
下記コマンドで、myinitというアプリケーションを作ります。これは、Cプログラムではなく、シェルスクリプトを取り込む(インストールする)だけのアプリケーションです。
myinit.bb
はビルド/パッケージ化(petalinux-build -x package
)するときの処理が書かれているレシピになります。使用するファイルはmyinit
とmyinit_run.sh(後で自分で新規作成する)
です。myinit
を起動スクリプトとするので、/etc/init.d/
にコピーするようにします。myinit_run.sh
に実際に処理する内容を書きます。これはひとまず/usr/bin
にコピーすることにします。
petalinux-create -t apps --template install -n myinit --enable
code project-spec/meta-user/recipes-apps/myinit/myinit.bb &
code project-spec/meta-user/recipes-apps/myinit/files/myinit &
code project-spec/meta-user/recipes-apps/myinit/files/myinit_run.sh &
#
# This file is the myinit recipe.
#
SUMMARY = "Simple myinit application"
SECTION = "PETALINUX/apps"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
SRC_URI = "file://myinit \
file://myinit_run.sh \
"
S = "${WORKDIR}"
inherit update-rc.d
INITSCRIPT_NAME = "myinit"
INITSCRIPT_PARAMS = "start 99 S ."
do_install() {
# myinit is init daemon
install -d ${D}${sysconfdir}/init.d
install -m 0755 ${S}/myinit ${D}${sysconfdir}/init.d/myinit
# myinit.sh is shell script called from myinit
install -d ${D}${bindir}
install -m 0755 myinit_run.sh ${D}${bindir}
}
FILES_${PN} += "${sysconfdir}/*"
#!/bin/sh
DAEMON=/usr/bin/myinit_run.sh
start ()
{
echo " Starting myinit"
start-stop-daemon -S -o --background -x $DAEMON
}
stop ()
{
echo " Stoping myinit"
start-stop-daemon -K -x $DAEMON
}
restart()
{
stop
start
}
[ -e $DAEMON ] || exit 1
case "$1" in
start)
start; ;;
stop)
stop; ;;
restart)
restart; ;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
esac
exit $?
#!/bin/sh
blink1
myinit_run.sh
を使わない場合は、myinit
内のDAEMON=/usr/bin/myinit_run.sh
をDAEMON=blink1
にする
image.ubの再作成
上記のように3つのファイルを編集したら、下記コマンドでimage.ubを再作成します。
petalinux-build -x package
確認する
出来上がったimage.ubをSDカードに上書きコピーして、ZYBOを起動します。
すると、自動的にLEDがチカチカするはずです。(ログインも不要です)
参考
https://japan.xilinx.com/support/documentation/sw_manuals_j/xilinx2017_2/ug1144-petalinux-tools-reference-guide.pdf
(起動用スクリプトは、ほぼ丸写しです。)