勉強しないとな~blog

ちゃんと勉強せねば…な電気設計エンジニアです。

ZYBOを進める - 17. Xilinx SDKでのアプリケーション作成

参考サイトに従って、チュートリアルを進めていきます。
今回は、Xilinx SDKLinux上で動くアプリケーションを作成して、Linuxのルートファイルシステムに取り込む、という内容になります。

qiita.com

大まかな内容

参考サイトに書かれている通りですが、

  • Windows PC上のXilinx SDKでアプリケーションプロジェクトを作成する
  • LAN経由で、Xilinx System DebuggerとTCF (Target Communication Framework)により、Xilinx SDKからターゲットのZYBO(Linuxを起動しておく)上でアプリケーションを実行、デバッグする
  • 作成したアプリケーションをルートファイルシステムに取り込む

となります。

TCF有効の確認

開発用Ubuntuで、Petalinuxプロジェクトディレクトリに移動し、petalinux-config -c rootfs のコマンドで設定画面を出します。
Filesystem Packages ---> misc ---> tcf-agent と進み、tcf-agentにチェックが付いていることを確認します。

Xilinx SDKでアプリケーションプロジェクトの作成

Xilinx SDKで、File > New > Application Project からプロジェクト作成ウィザードを開きます。
以下のように入力します。

  • Project name : 適当なプロジェクト名を入力
  • OS Platform : linuxを選択

f:id:nokixa:20190815165555p:plain:w400

また、参考サイトに記載の通り、Linux System Rootを以下のように設定します。

  1. 開発用Ubuntuで、zip -r plnx_arm.zip <Petalinuxプロジェクトディレクトリ>/build/tmp/sysroots/plnx_arm でSystem Rootを圧縮し、plnx_arm.zipをWindows側に持ってくる
  2. Windowsでplnx_arm.zipを解凍する
  3. Linux System Rootにチェックを入れ、plnx_armフォルダを指定する

おそらく本来はXilinx SDKも含めてUbuntu上で開発する前提と思われます。Xilinx SDKWindows上で使う場合は、System RootをWindowsに持ってくる必要が出てきます。

関連Answer Record :
https://japan.xilinx.com/support/answers/69159.html

f:id:nokixa:20190815173623p:plain:w400

"Next >"をクリックして、次の画面で"Linux Hello World"が選択された状態で"Finish"をクリックします。

f:id:nokixa:20190815173820p:plain:w400

この後、作成したプロジェクトの設定で、リンカに--sysroot="<持ってきたSystemRootディレクトリ>"のオプションを設定する必要があります。

f:id:nokixa:20190815174752p:plain:w600

一旦これでビルドボタンを押すと、ちゃんとビルドが通りました。

アプリケーション作成

helloworld.cに、参考サイトのコードをコピーします。
ただし、GPIOの番号が変わっているので、そこだけ直します。

GPIO913 -> GPIO900

これで再度ビルドします。

アプリケーションデバッグ

Xilinx SDKで、Project ExplorerLinuxアプリケーションプロジェクトを選択した状態にしておき、Run > Debug Configurations ... から、デバッグ設定画面を開きます。

f:id:nokixa:20190815181229p:plain:w600

"Xilinx C/C++ application (System Debugger)"を右クリックして、"New"をクリックします。

f:id:nokixa:20190815181424p:plain:w600

すると、Linuxアプリケーションのデバッグ設定が用意されます。

f:id:nokixa:20190815181750p:plain:w600

"Connection:"の右の"New"をクリックすると、"New Target Connection"のウィンドウが現れるので、以下のように入力して、"OK"をクリックします。

  • Target Name : 適当な名前を入力
  • Host : ZYBOのIPアドレス(ifconfigで確認)
  • Port : 1534 (デフォルト)

f:id:nokixa:20190815182154p:plain:w500

最後に、元のウィンドウの"Debug"ボタンを押すと、デバッグ実行が開始します。
問題がなければ、Xilinx SDKのコンソールに"Hello World!"が表示され、ZYBO上のMIO7 LEDが1秒点灯、1秒消灯を繰り返します。とりあえず動いた!

f:id:nokixa:20190815182936p:plain:w600

ルートファイルシステムへの取り込み

上記で動かしたアプリケーションを、Linuxのルートファイルシステムに取り込みます。
参考サイトでは、2通りのやり方が紹介されています。

どちらかというと後者の方法が筋のように思えるので、こちらで進めたいと思います。アプリケーションの規模が大きくなってソースコードを分割した場合もこっちのほうがやりやすいのでは、と思います。

  1. 開発用Ubuntuで、以下のコマンドを実行します。
    アプリケーションプロジェクトが作成されます。
    petalinux-create -t apps --template install --name zybo-linux-app --enable
  2. アプリケーションのバイナリ(zybo_linux_app.elf)を以下の場所にコピーします。(カレントディレクトリはPetalinuxプロジェクトディレクトリ)
    sudo cp <バイナリ配置ディレクトリ>/zybo_linux_app.elf project-spec/meta-user/recipes-apps/zybo-linux-app/files/
  3. zybo-linux-app.bbで、"zybo-linux-app"となっていたところを"zybo_linux_app.elfに置き換えます。(詳細は後に記載)
    vi project-spec/meta-user/recipes-apps/zybo-linux-app/zybo-linux-app.bb
  4. 以下のコマンドでビルドします。
    petalinux-build -x package
  5. 生成したルートファイルシステム、image.ubをSDカードにコピー

zybo-linux-app.bbの内容詳細は以下の通りです。

#
# This file is the zybo-linux-app recipe.
#

SUMMARY = "Simple zybo-linux-app application"
SECTION = "PETALINUX/apps"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"

SRC_URI = "file://zybo_linux_app.elf \
        "

S = "${WORKDIR}"

do_install() {
             install -d ${D}/${bindir}
             install -m 0755 ${S}/zybo_linux_app.elf ${D}/${bindir}
}

実行してみる

上記で作成したSDカードでZYBOを起動してみます。
ログインしたら、/usr/binの中を見てみると、用意したバイナリが入っているのが確認できます。

root@Zybo-base-linux-peta:~# ls /usr/bin -la | grep zybo*
-rwxr-xr-x    1 root     root          3496 Aug 15 15:23 zybo_linux_app.elf

zybo_linux_app.elfを実行してみると、"Hello World!"が表示されて、MIO7のLEDが点滅します。Xilinx SDKで動かしたときと同じ動作です。
確認したら、Ctrl+Cで終了しておきます。

root@Zybo-base-linux-peta:~# zybo_linux_app.elf
Hello World!

できました!

今回はここまで

Linux上のアプリケーション開発の流れが分かってきました。