- 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)
Windows環境は1回目、Linux環境は8回目を参照。
使用するハードウェア(hdf)は8回目を参照。
Linuxのrootfsをカスタマイズする / PythonでHello World
前回は、Linuxカーネルをカスタマイズしました。今回は、rootfsをカスタマイズしてみます。デフォルト設定のままで作ったrootfsには最低限のバイナリやライブラリしか含まれていません。今回は試しに、Pythonを追加して、PythonからHello Worldしてみようと思います。また、gdbも追加してみます。
- Pythonoの追加
- gdbの追加
メモ
本当は、gccも入れてネイティブビルドできるようにしようと思ったのですが、出来ないようです。
https://forums.xilinx.com/t5/Embedded-Linux/gcc-in-petalinux-kernel/td-p/788368
プロジェクトの準備
新規PetaLinuxプロジェクトの作成からやります。とりあえず、下記操作でBOOT.binとimage.ubを作成して、ちゃんと起動できることを確認します。これは、8回目と同じです。
cd ~/work/peta
petalinux-create --type project --template zynq --name SimplePS
cd SimplePS/
petalinux-config --get-hw-description=../project_1.sdk
petalinux-build
petalinux-package --boot --force --fsbl images/linux/zynq_fsbl.elf --fpga images/linux/design_1_wrapper.bit --u-boot
参考のために、出来上がったバイナリのサイズを確認しておきます。
~/work/peta/SimplePS$ ls -la images/linux/BOOT.BIN images/linux/image.ub
-rw-rw-r-- 1 tak tak 4554128 Jan 12 13:26 images/linux/BOOT.BIN
-rw-r--r-- 1 tak tak 9482736 Jan 12 13:25 images/linux/image.ub
rootfsのコンフィグ / ビルドする
下記コマンドで、rootfsのコンフィグ画面に入れます。ここで、さまざまなツール(/usr/bin)やライブラリを、含めたり取り外したりできます。また、次回やる予定ですが、自作のユーザアプリケーションを含めるかどうかもここで設定できます。
petalinux-config -c rootfs
今回は、Pythonとgdbをインストールします。Filesystem Packages -> devel -> python -> python -> pythonと、Filesystem Packages-> misc -> gdbを選択して、Save,Exitします。
その後、ファイルシステムを更新します。petalinux-build -x package
だけで良いはずですが、上手くいかなかったら、petalinux-build -x do_populate_sysroot
とpetalinux-build -c rootfs
もやってみてください。(時間がかかるので注意)
# petalinux-build -x do_populate_sysroot
petalinux-build -x package
# petalinux-build -c rootfs
メモ
rootfsのコンフィグファイルはproject-spec/configs/rootfs_config
に作られるっぽい。
成果物
変更したのはrootfsだけなので、image.ub
のみ更新します。image.ub
をSDカードに上書きコピーします。ファイルサイズが大きくなっていることを確認してください。もともと9MByteくらいだったものが、12MByteまで増加しています。
~/work/peta/SimplePS$ ls -la images/linux/BOOT.BIN images/linux/image.ub
-rw-rw-r-- 1 tak tak 4554128 Jan 12 13:26 images/linux/BOOT.BIN
-rw-r--r-- 1 tak tak 12832728 Jan 12 13:47 images/linux/image.ub
確認する
image.ub
を更新したSDカードで、Zyboを起動します。pythonとgdbがインストールされていることを確認します。
root@SimplePS:~# ls /usr/bin/gdb /usr/bin/python*
/usr/bin/gdb /usr/bin/python-config /usr/bin/python2-config /usr/bin/python2.7-config
/usr/bin/python /usr/bin/python2 /usr/bin/python2.7
PytonでHello Worldする
通常のLinuxのようにPythonコードを実行できます。viはデフォルトでインストールされています。(今回は、rootfsはRAMに展開されているので、再起動したらファイルは消えます)
root@SimplePS:~# vi hello.py
root@SimplePS:~# cat hello.py
print("hello world")
root@SimplePS:~# python hello.py
hello world
gdbでデバッグしてみる
試しに、lsコマンドをgdbでデバッグしてみます。当然lsコマンドにはデバッグ情報が含まれていないので、ブレークポイントなどは張れませんが、一応gdbからrunはできていました。ただし、gdb起動直後にエラー(LookupError: no codec search functions registered: can't find encoding)が大量に発生していました。
root@SimplePS:~# gdb ls
ここでエラーがたくさんでる
(gdb) run
Starting program: /bin/ls
Cannot access memory at address 0x0
hello.py