FPGA開発日記

FPGAというより、コンピュータアーキテクチャかもね! カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages

RISC-VでZephyr OSを動作させる (1. QEMUでHello Worldを動作させる)

f:id:msyksphinz:20190415004633p:plain

Zephyrとは、Linux Foundationのプロジェクトの一つでもあり、RTOS(Real Time Operating System)の一つだ。

このZephyr OSはRTOSとしてはかなりメジャー?のなOSであり、完全にオープンソース、そして組み込みデバイスなどの小さな機器に搭載するためのOSとして適している。例えば、IoTワイヤレスアプリケーションやスマートウォッチなどに使われる想定のOSだ。

そして、ZephyrはRISC-Vをサポートしており、現在以下のボードで動作することが確認されている。

  • SiFive HiFive1
  • Microsemi’s Mi-V soft CPU running on the M2GL025 development board
  • soft Pulpino CPU running on a Zedboard

なるほど、これは面白そうだ。HiFive1も持っていることだし、Zephyrを動かして少し遊んでみよう。

QEMU上で簡易OSZephyrを動かしてみる

動作環境としては、Ubuntu 18.04 LTSをVirtua Box上にインストールし、そのうえで作業を行う。まずは、ZephyrのコンパイルQEMUを動かすために必要なパッケージをインストールする。

sudo apt-get install --no-install-recommends git cmake ninja-build gperf \
  ccache dfu-util device-tree-compiler wget \
  python3-pip python3-setuptools python3-wheel xz-utils file make gcc \
  gcc-multilib

次に、Zephyrのソースコードをダウンロードし、さらに必要な外部パッケージのダウンロードを行う。以下のようにタイプする。

git clone https://github.com/zephyrproject-rtos/zephyr
cd zephyr
sudo pip3 install --user -r scripts/requirements.txt
export ZEPHYR_TOOLCHAIN_VARIANT=zephyr
. ./zephyr-env.sh

次に、ZephyrのSDKのダウンロードとインストールを行う。<zephyr_sdk_install_dir>には、SDKをインストールしたい場所を指定する。

# 資料には下記のように記述してあるが、SDK 0.9.5ではビルドできなかった。SDK 0.10.0を使用する必要がある。
# wget https://github.com/zephyrproject-rtos/meta-zephyr-sdk/releases/download/0.9.5/zephyr-sdk-0.9.5-setup.run
# sh zephyr-sdk-0.9.5-setup.run
wget https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v0.10.0/zephyr-sdk-0.10.0-setup.run
sh zephyr-sdk-0.10.0-setup.run

SDKのビルドプロセスでは、riscv32のターゲットでZephyrがビルドされていることが確認できる。

Verifying archive integrity... All good.
Uncompressing SDK for Zephyr  100%
Enter target directory for SDK (default: /opt/zephyr-sdk/): /home/msyksphinz/work/riscv/zephyr/zephyr_install_sdk
Installing SDK to /home/msyksphinz/work/riscv/zephyr/zephyr_install_sdk
Creating directory /home/msyksphinz/work/riscv/zephyr/zephyr_install_sdk
Success
 [*] Installing x86 tools...
 [*] Installing arm tools...
 [*] Installing arc tools...
 [*] Installing iamcu tools...
 [*] Installing mips tools...
 [*] Installing nios2 tools...
 [*] Installing xtensa tools...
 [*] Installing riscv32 tools...
 [*] Installing additional host tools...
Success installing SDK. SDK is ready to be used.

そして、SDKをインストールした場所を環境変数として登録する。

export ZEPHYR_SDK_INSTALL_DIR=<zephyr_sdk_install_dir>   # ここでは、/home/msyksphinz/work/riscv/zephyr/zephyr_install_sdk を指定。

では、サンプルプログラムを動かす。ここでは、チュートリアルの通りにhello_worldプログラムをビルドして、QEMUで動作させる。

mkdir build-example
cd build-example
cmake -DBOARD=qemu_riscv32 /home/msyksphinz/work/riscv/zephyr/zephyr/samples/hello_world
$ make -j $(nproc)

しばらくするとビルドが完了した。さっそくQEMU上で動作させてみる。

$ make run
[  1%] Built target kobj_types_h_target
[  2%] Built target syscall_macros_h_target
[  6%] Built target syscall_list_h_target
[  7%] Built target driver_validation_h_target
[  8%] Built target offsets
[  9%] Built target offsets_h
[ 35%] Built target kernel
[ 38%] Built target app
[ 39%] Built target linker_script_target
[ 73%] Built target zephyr
[ 86%] Built target lib__libc__minimal
[ 89%] Built target drivers__gpio
[ 91%] Built target drivers__serial
[ 93%] Built target zephyr_prebuilt
[ 94%] Built target linker_pass_final_script_target
[ 98%] Built target kernel_elf
[100%]
To exit from QEMU enter: 'CTRL+a, x'
[QEMU] CPU: riscv32
***** Booting Zephyr OS v1.14.0-rc3-246-g10327e59c622 *****
Hello World! qemu_riscv32

Hello worldプログラムが無事に動作したようだ。QEMUで、Zephyr OSを動作させ、最初のアプリケーションを動かすことができた。

注意 : チュートリアルの通りにZephyr SDK 0.9.5 をダウンロードしてビルドすると以下のようなエラーが出ました。どうやら、0.10.0を使用する必要があるようです。

Zephyr version: 1.14.0
-- Found PythonInterp: /usr/bin/python3 (found suitable version "3.6.7", minimum required is "3.4")
-- Selected BOARD qemu_riscv32
CMake Error at /home/msyksphinz/work/riscv/zephyr/zephyr/cmake/toolchain/zephyr/host-tools.cmake:38 (message):
  The SDK version you are using is too old, please update your SDK.

  You need at least SDK version 0.10.0.

  You have version 0.9.5 (/home/msyksphinz/work/riscv/zephyr/zephyr_sdk).

  The new version of the SDK can be downloaded from:


  https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v0.10.0/zephyr-sdk-0.10.0-setup.run