Zephyr RTOS の開発環境を整えた。手元の環境とは切り離したかったが書き込み先のターゲット(基板)とUSBで接続して flash する必要があるため物理的にパソコンは必要となる。
そのため手元のパソコンに Linux をデュアルブートでインストールして環境を構築したのでメモ。ただし Linux のデュアルブート環境を可能な限り既存の Windows とは分離したかったのでその点についてもメモしておく。
つまり本記事は下記の内容を含む。必要な個所のみ参照してOK。
前提
環境は下記を対象
- Zephyr RTOS の開発環境を既存の環境とは切り離して構築したい
- 基板への書き込みを伴うのでUSB接続可能なパソコンが物理的に必要(VPSなどではビルドはできても書き込めない、あるいは別に書き込む手段が必要)
- Linux で構築。ここは今回特に必須ではないが今回は Linux を採用。
最終構成
手順
Linux PC の用意(方針)
- Linux 環境の準備の仕方は特に問わないが、今回は物理的に Linux PC がある状態にしたかったのと、かつ環境を可能な限り既存の Windows とは分離したかったので下記の構成とした
- ツール Rufus で Ubuntu の ISO ファイルを使ってブータブルUSB(インストーラのUSB)を作成し、次にそのUSBをPCに挿して別のUSBにUbuntuをインストール(インストール先のUSB)
- ブートローダのインストール先をインストール先のUSBにすることで、Linux USB を挿している場合は Linux が起動、挿していないときは Windows が起動するようにした
Linux PC の用意(手順)
必要なものの準備
インストールの実施
- インストール元 USB の作成
- Ubuntu のインストール
- 作成したインストール元 USB を使用して PC を起動し、Ubuntu をインストールする
- インストール元 USB とインストール先 USB の両方をターゲット PC に挿入し、BIOS/UEFI の設定またはブートメニューからインストール元 USB ドライブから起動するように選択
- Ubuntu のインストーラーを起動してインストールを進める
- インストール先をインストール先 USB ドライブに指定する
- 重要:「ブートローダをインストールするデバイス」の選択項目で、必ずインストール先 USB ドライブ自体(例: /dev/sdb など)を選択すること。これにより、Windows のブートローダーに影響を与えない。
運用の仕方
Docker のインストールと設定(方針)
- Docker および Docker Compose をインストールする
- この後 Docker 上に Zephyr RTOS の開発環境を構築する
- ただし Linux を USBメモリにインストールした場合、USBメモリへの書き込みは比較的遅いことが予想されるので、Disk I/O のパフォーマンス低下を最小限に抑えるために、Windows がインストールされているパソコンのディスク(SSD)を下記の通り活用する
Docker のインストールと設定(手順)
Ubuntu に RDP(xrdp)と SSH サーバを導入(必要に応じて)
- 手順省略
Docker CE をインストール
- 備考: 公式手順に従う
- https://docs.docker.com/engine/install/ubuntu/
- 現時点の手順では docker-compose-plugin までインストールされる
sudo なしで Docker を使う:
sudo usermod -aG docker $USER
- 備考: 公式手順に従う
Docker Compose(v2)の確認
docker compose version-
- GParted を使う(手順省略)
- 例:新しいパーティションが /dev/nvme0n1p5 として作成される。
- GParted を使う(手順省略)
-
マウントポイント作成
sudo mkdir -p /mnt/ssd-ext4マウント
sudo mount /dev/nvme0n1p5 /mnt/ssd-ext4自動マウント設定(推奨)
sudo blkid /dev/nvme0n1p5例:
UUID="abcd-1234-ef56-7890"/etc/fstab に追加
UUID=abcd-1234-ef56-7890 /mnt/ssd-ext4 ext4 defaults 0 2
-
Docker を停止
sudo systemctl stop docker.socket sudo systemctl stop dockerデータ移動
sudo mv /var/lib/docker /mnt/ssd-ext4/docker-
sudo ln -s /mnt/ssd-ext4/docker /var/lib/docker Docker 再起動
sudo systemctl start docker.socket sudo systemctl start docker
Zephyr RTOS の開発環境を Docker で構築
Zephyr 用 Docker Compose プロジェクトを ext4 上に作成。ここでは例として zephyr-docker というフォルダ名とする。
cd /mnt/ssd-ext4 mkdir -p zephyr-docker/workspace cd zephyr-dockerdocker-compose.yml を作成(常駐型コンテナ)
/mnt/ssd-ext4/zephyr-docker/Dockerfile ファイルを新設
FROM zephyrprojectrtos/ci RUN apt update && \ apt install -y usbutils minicom && \ apt clean/mnt/ssd-ext4/zephyr-docker/docker-compose.yml ファイルを新設
version: "3.9" services: zephyr: build: context: . dockerfile: Dockerfile container_name: zephyr-dev working_dir: /work volumes: - ./workspace:/work tty: true stdin_open: true command: sleep infinity privileged: true devices: - "/dev/ttyACM0:/dev/ttyACM0" - "/dev/bus/usb:/dev/bus/usb"コンテナをバックグラウンドで起動
docker compose up -d
Zephyr RTOS を使用して build と flash を実施(VSCode Dev Containerではない手順)
このあと VSCode + Dev Container での手順を実施するがこの時点で Linux で Docker コンテナ内で Zephyr RTOS を使用したビルドと書き込みが可能になるので手順をメモ、
コンテナをバックグラウンドで起動
コンテナ起動
docker compose up -dホスト側で Zephyr を clone
cd /mnt/ssd-ext4/zephyr-docker/workspace git clone https://github.com/zephyrproject-rtos/zephyr.git
コンテナに入って Zephyr プロジェクトを初期化
コンテナに入る
docker exec -it zephyr-dev bashコンテナ内で
west init -l zephyr west update
west のビルド(コンテナ内)
west build -b qemu_x86 zephyr/samples/hello_world west build -t run実機書き込み(必要な場合)
west flash
VS Code + Dev Containers で Zephyr 開発環境を構築する手順
- 前提:環境
- Docker CE / Docker Compose 導入済み
- Dockerfile 及び docker-compose.yml で zephyr-dev コンテナを作成(設定)済
- zephyr-dev コンテナは
docker compose up -dで常駐可能な状態
上記の状態から VS Code を IDE として使えるようにする手順を下記で示す。
前提:プロジェクトの場所
-
- VS Code を開き、以下をインストールする
- Dev Containers
- VS Code を開き、以下をインストールする
Dev Containers 用の設定ファイルを作成
プロジェクトディレクトリは下記とする(例)
/mnt/ssd-ext4/zephyr-docker/ここに .devcontainer/ を作成する
mkdir /mnt/ssd-ext4/zephyr-docker/.devcontainer
devcontainer.json を作成する
/mnt/ssd-ext4/zephyr-docker/.devcontainer/devcontainer.json ファイルを下記の内容で新設
{ "name": "Zephyr Dev", "dockerComposeFile": "../docker-compose.yml", "service": "zephyr", "workspaceFolder": "/work", "remoteUser": "root", "customizations": { "vscode": { "extensions": [ "ms-vscode.cpptools", "ms-vscode.cmake-tools", "ms-vscode.remote-containers" ] } }, "postCreateCommand": "west update" }- メモ
- workspaceFolder /work は Docker コンテナ内のパス
- 実体は Ubuntu 上の workspace/
VS Code で Dev Container を開く
west build を VS Code から実行する
VS Code のターミナルで下記を実施。これは実際にはコンテナ内で実行されることになる。
west build -b qemu_x86 zephyr/samples/hello_world例:
west build -b nucleo_l476rg --shield x_nucleo_idb05a1 zephyr/samples/hello_world west build -b nucleo_l476rg --shield x_nucleo_idb05a1 zephyr/samples/basic/blinky west build -b nucleo_l476rg --shield x_nucleo_idb05a1 ./zephyr/samples/bluetooth/direct_adv west build -b esp32_devkitc_wroom/esp32/procpu zephyr/samples/hello_world
実機書き込み(USB デバイスがコンテナ内で認識されている状態)
実機の Zephyr Console ログの確認方法
minicom -D /dev/ttyACM0 -b 115200コンテナを停止したいとき
docker compose down