参考サイトに従って、チュートリアルを進めていきます。
今回は、Xilinx SDKでLinux上で動くアプリケーションを作成して、Linuxのルートファイルシステムに取り込む、という内容になります。
大まかな内容
参考サイトに書かれている通りですが、
- 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を選択
また、参考サイトに記載の通り、Linux System Rootを以下のように設定します。
- 開発用Ubuntuで、
zip -r plnx_arm.zip <Petalinuxプロジェクトディレクトリ>/build/tmp/sysroots/plnx_arm
でSystem Rootを圧縮し、plnx_arm.zipをWindows側に持ってくる - Windowsでplnx_arm.zipを解凍する
- Linux System Rootにチェックを入れ、plnx_armフォルダを指定する
おそらく本来はXilinx SDKも含めてUbuntu上で開発する前提と思われます。Xilinx SDKをWindows上で使う場合は、System RootをWindowsに持ってくる必要が出てきます。
関連Answer Record :
https://japan.xilinx.com/support/answers/69159.html
"Next >"をクリックして、次の画面で"Linux Hello World"が選択された状態で"Finish"をクリックします。
この後、作成したプロジェクトの設定で、リンカに--sysroot="<持ってきたSystemRootディレクトリ>"
のオプションを設定する必要があります。
一旦これでビルドボタンを押すと、ちゃんとビルドが通りました。
アプリケーション作成
helloworld.cに、参考サイトのコードをコピーします。
ただし、GPIOの番号が変わっているので、そこだけ直します。
GPIO913 -> GPIO900
これで再度ビルドします。
アプリケーションデバッグ
Xilinx SDKで、Project ExplorerでLinuxアプリケーションプロジェクトを選択した状態にしておき、Run > Debug Configurations ... から、デバッグ設定画面を開きます。
"Xilinx C/C++ application (System Debugger)"を右クリックして、"New"をクリックします。
すると、Linuxアプリケーションのデバッグ設定が用意されます。
"Connection:"の右の"New"をクリックすると、"New Target Connection"のウィンドウが現れるので、以下のように入力して、"OK"をクリックします。
- Target Name : 適当な名前を入力
- Host : ZYBOのIPアドレス(ifconfigで確認)
- Port : 1534 (デフォルト)
最後に、元のウィンドウの"Debug"ボタンを押すと、デバッグ実行が開始します。
問題がなければ、Xilinx SDKのコンソールに"Hello World!"が表示され、ZYBO上のMIO7 LEDが1秒点灯、1秒消灯を繰り返します。とりあえず動いた!
ルートファイルシステムへの取り込み
上記で動かしたアプリケーションを、Linuxのルートファイルシステムに取り込みます。
参考サイトでは、2通りのやり方が紹介されています。
- ソースコードを開発Ubuntuに持っていって、そこでPetalinuxツールでコンパイルする
- Xilinx SDKでコンパイルしてできたバイナリ(zybo_linux_app.elf)を開発Ubuntuに持っていって、Petalinuxツールでこれを実行するアプリケーションプロジェクトを作成する
どちらかというと後者の方法が筋のように思えるので、こちらで進めたいと思います。アプリケーションの規模が大きくなってソースコードを分割した場合もこっちのほうがやりやすいのでは、と思います。
- 開発用Ubuntuで、以下のコマンドを実行します。
アプリケーションプロジェクトが作成されます。
petalinux-create -t apps --template install --name zybo-linux-app --enable
- アプリケーションのバイナリ(zybo_linux_app.elf)を以下の場所にコピーします。(カレントディレクトリはPetalinuxプロジェクトディレクトリ)
sudo cp <バイナリ配置ディレクトリ>/zybo_linux_app.elf project-spec/meta-user/recipes-apps/zybo-linux-app/files/
- 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
- 以下のコマンドでビルドします。
petalinux-build -x package
- 生成したルートファイルシステム、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上のアプリケーション開発の流れが分かってきました。