[メモ] VagrantにてZephyr(RTOS)の開発環境を作って試す


# 概要
- [Zephyr Project](https://www.zephyrproject.org/)というRTOSの開発環境をVagrantで作って、サクッと試す。
- 参考: https://docs.zephyrproject.org/1.13.0/getting_started/installation_linux.html

<!--
- What is Zephyr Project?
    > Zephyr™ Project, a Linux Foundation Collaboration Project, is a small, scalable real-time operating system for connected, resource constrained devices. The project is an open source collaborative effort uniting leaders from across the industry to build a best-in-breed real-time operating system (RTOS) optimized for resource constrained devices, across multiple architectures.

    (Google先生訳改)
    Linux FoundationコラボレーションプロジェクトであるZephyr™Projectは、接続され(Connected)、リソースが制約されたデバイス用の、スケーラブルで小型なリアルタイムオペレーティングシステムです。
    このプロジェクトは、業界全体のリーダーを結集して、複数のアーキテクチャにわたってリソース制約のあるデバイスに最適化された*best-in-breed*のリアルタイム・オペレーティング・システム（RTOS）を構築するオープンソースの共同作業です。
-->


# 環境
- Windows 10 Pro (1803) 64bit
- VirtualBox v5.2.18 + Extension Pack
- Vagrant v2.1.5
    - Boxベース: 'ubuntu/bionic64' (v20180919.0.0) for 'virtualbox'
- Zephyr: v1.13.0




# Vagrantfile

```rb:Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :
#
# https://qiita.com/mt08/items/9014862d81282f4e04f0
#
# Reference(s):
#   https://docs.zephyrproject.org/1.13.0/getting_started/installation_linux.html
#
# vagrant up && vagrant reload

VM_NAME="u1804-zephyr"
VM_MEMORY=2048
VM_CORES=2

Vagrant.configure("2") do |config|
	config.vm.box = "ubuntu/bionic64"
	config.vbguest.auto_update = false
	#config.vm.network "public_network"
	config.vm.network "forwarded_port", guest: 22, host: 2322, id: "ssh"
	config.vm.provider "virtualbox" do |vb|
		vb.name = VM_NAME
		vb.cpus = VM_CORES
		vb.memory = VM_MEMORY
	end

	config.vm.provision "shell", inline: <<-SHELL
		# Allow ssh with PasswordAuthentication
		sed -i -e 's/PasswordAuthentication no/PasswordAuthentication yes/g' /etc/ssh/sshd_config
		systemctl restart ssh
		# apt-cache-server 
		#echo 'Acquire::http::Proxy "http://apt-cache-server:3142";' | tee /etc/apt/apt.conf.d/02proxy
		#
		export DEBIAN_FRONTEND=noninteractive
		echo apt update & upgrade
		apt-get -qq update && apt-get -qq upgrade 
		echo Installing Requirements and Dependencies
		apt-get -qq install -y --no-install-recommends git cmake ninja-build gperf ccache doxygen dfu-util device-tree-compiler python3-ply python3-pip python3-setuptools python3-wheel xz-utils file make gcc-multilib autoconf automake libtool librsvg2-bin texlive-latex-base texlive-latex-extra latexmk texlive-fonts-recommended
		#
		echo zephyr-sdk
        wget --quiet --continue https://github.com/zephyrproject-rtos/meta-zephyr-sdk/releases/download/0.9.3/zephyr-sdk-0.9.3-setup.run -O /vagrant/zephyr-sdk-0.9.3-setup.run
		echo "/opt/zephyr-sdk" | /bin/sh /vagrant/zephyr-sdk-0.9.3-setup.run --quiet
	SHELL

	config.vm.provision "shell", privileged: false, inline: <<-SHELL
		cd ${HOME}
		echo git clone 
		git clone https://github.com/zephyrproject-rtos/zephyr.git
		cd zephyr
		git checkout zephyr-v1.13.0

		# 
		echo "export ZEPHYR_BASE=$(pwd)"         >> ${HOME}/.profile
		echo 'source $ZEPHYR_BASE/zephyr-env.sh' >> ${HOME}/.profile
		cd ${HOME}

		echo 'export ZEPHYR_TOOLCHAIN_VARIANT=zephyr'        >  ${HOME}/.zephyrrc
		echo 'export ZEPHYR_SDK_INSTALL_DIR=/opt/zephyr-sdk' >> ${HOME}/.zephyrrc
		
		# 
		source ${HOME}/.profile
		echo Install additional packages required for development with Zephyr:
		pip3 install --quiet --user -r $ZEPHYR_BASE/scripts/requirements.txt
	SHELL
end
```

# 手順
## 開発環境セットアップ
1. VirtualBoxとVagrantをインストールして、使えるようにする
2. 適当なフォルダを作って、↑の`Vagrantfile`作成
3. `vagrant up && vagrant reload`
4. 待つ (20分～)

## サンプルアプリのビルド(`Hello World`)
https://docs.zephyrproject.org/latest/getting_started/getting_started.html#building-a-sample-application

### qemu_cortex_m3環境にて
1. `vagrant ssh`<br>にてログイン
2. 以下実行

	```bash
	cd $ZEPHYR_BASE/samples/hello_world
	mkdir build && cd build
	# cmakeを使ってNinjaベースのビルドシステムを設定:
	cmake -GNinja -DBOARD=qemu_cortex_m3 ..
	# 生成されたビルドシステムにて、ninjaを実行:
	ninja
	ninja run
	```
3. `Hello World! arm`が表示される. CTRL-A, x にてqemuを抜ける

	```shell-session:実行例
	vagrant@ubuntu-bionic:~/zephyr/samples/hello_world/build$ ninja run
	[0/1] To exit from QEMU enter: 'CTRL+a, x'[QEMU] CPU: cortex-m3
	***** Booting Zephyr OS zephyr-v1.13.0 *****
	Hello World! arm
	QEMU: Terminated
	vagrant@ubuntu-bionic:~/zephyr/samples/hello_world/build$

	```


### hello_worldのソースコード
- main.c

	```c:zephyr/samples/hello_world/src/main.c
	/*
	 * Copyright (c) 2012-2014 Wind River Systems, Inc.
	 *
	 * SPDX-License-Identifier: Apache-2.0
	 */

	#include <zephyr.h>
	#include <misc/printk.h>

	void main(void)
	{
			printk("Hello World! %s\n", CONFIG_ARCH);
	}



# その他
- Apache系の[mynewt](https://mynewt.apache.org/)ってのもあったな..