ZYBO (Zynq) 初心者ガイド (15) Linux起動時にアプリケーションを自動実行させる


環境

  • 開発用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)するときの処理が書かれているレシピになります。使用するファイルはmyinitmyinit_run.sh(後で自分で新規作成する)です。myinitを起動スクリプトとするので、/etc/init.d/にコピーするようにします。myinit_run.shに実際に処理する内容を書きます。これはひとまず/usr/binにコピーすることにします。

開発PCのターミナル
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 &
myinit.bb
#
# 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}/*"
myinit
#!/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 $?
myinit_run.sh
#!/bin/sh
blink1

myinit_run.shを使わない場合は、myinit内のDAEMON=/usr/bin/myinit_run.shDAEMON=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
(起動用スクリプトは、ほぼ丸写しです。)