【Zephyr編】micro:bitで本格的な組込みソフトウェア開発環境を構築し、サンプルプログラムをVSCodeからデバッグできるようにする

# 【Zephyr編】micro:bitで本格的な組込みソフトウェア開発
**BBC micro:bit** は、様々な方法で、組込みソフトウェア開発が可能です。
本記事では、リアルタイムオペレーティングシステムの実装である [**Zephyr**](https://www.zephyrproject.org/) を使って、本格的な組込みソフトウェア開発環境を構築し、VSCodeでサンプルプログラムをデバッグ実行します。

# Windows 10 (64bit版) 上での開発環境構築
次のドキュメントを参考にして、Windows 10 (64bit版) 上に開発環境を構築します。

Getting Started Guide
https://docs.zephyrproject.org/latest/getting_started/index.html


本記事では、具体的なダウンロード元やインストールフォルダを示していますので、将来、バージョンアップなどにより、動作しなくなる可能性があります（2020/07/10現在）。

## Getting Started Guide

### (1) Windows Update の実施

[スタート]-[設定]-[更新とセキュリティ]-[Windows Update] で、更新プログラムのチェックをし、必要に応じて、ダウンロードをインストールを実施します。

### (2) Chocolateyと依存パッケージのインストール

次のファイルをダウンロードし、`c:\temp\install.ps1`として保存します。
[https://chocolatey.org/install.ps1 ←右クリックで「名前を付けてリンク先を保存」](https://chocolatey.org/install.ps1)

コマンドプロンプトを**管理者として実行**し、次のコマンドで、ダウンロードしたinstall.ps1を実行します。

```cmd.exe
PowerShell -ExecutionPolicy RemoteSigned c:\temp\install.ps1
```

新たに、コマンドプロンプトを**管理者として実行**し、次のコマンドで、依存パッケージをインストールします。

```cmd.exe
choco feature enable -n allowGlobalConfirmation
choco install cmake --installargs 'ADD_CMAKE_TO_PATH=System'
choco install ninja gperf python git
```

一旦、Windows 10を再起動します。

### (3) Zephyrの取得とPython関連パッケージのインストール

コマンドプロンプトを開き（通常）、次のコマンドで、`C:\zephyr` 開発用ディレクトリとPython仮想環境を作成します。

```cmd.exe
cd c:\
mkdir zephyr
cd zephyr
pip install virtualenv
virtualenv venv
c:\zephyr\venv\scripts\activate
pip install west
```

続けて、次のコマンドで、Zephyrの取得とPython関連パッケージをインストールします。

```
cd c:\zephyr
west init zephyrproject
cd zephyrproject
west update
west zephyr-export
pip install -r c:\zephyr\zephyrproject\zephyr\scripts\requirements.txt
```

### (4) Toolchainのインストールと環境変数の設定

[gcc-arm-none-eabi-7-2018-q2-update-win32.exe](https://developer.arm.com/-/media/Files/downloads/gnu-rm/7-2018q2/gcc-arm-none-eabi-7-2018-q2-update-win32-sha2.exe?revision=bc72768f-9927-454e-9141-918927fb74ff?product=GNU%20Arm%20Embedded%20Toolchain,32-bit,,Windows,7-2018-q2-update)をダウンロードし、インストールします。
※インストール先のフォルダ名には**スペースを含めないように**します。
例えば、`C:\GNUToolsArmEmbedded2018-q2-update`へインストールします。
``

次の２つの環境変数を設定します。

| # | 環境変数 | 値 |
|---|--------------------------|--------------------------------------|
| 1 | ZEPHYR_TOOLCHAIN_VARIANT | gnuarmemb                            |
| 2 | GNUARMEMB_TOOLCHAIN_PATH | C:\GNUToolsArmEmbedded2018-q2-update |

※ **環境変数**は、[スタートボタン]の右クリック-[システム]-[システム情報]-[システムの詳細設定]で、「環境編巣(N)...]ボタンを押下して、「新規(N)...」または「新規(W)...」で、**ユーザー環境変数**または**システム環境変数**として、追加設定します。

### (5) BBC micro:bit サンプルプログラム

コマンドプロンプトを起動し、次のコマンドで、サンプルプログラムのビルドを実行します。

```cmd.exe
c:\zephyr\venv\scripts\activate
cd c:\zephyr\zephyrproject\zephyr\
west build -p auto -b bbc_microbit samples\boards\bbc_microbit\display
```

### (6) BBC micro:bit 本体への書き込み

ビルドが完了したら、BBC micro:bit 本体とパソコンをUSB通信ケーブルで接続し、次のコマンドで本体へ書き込みます。

```cmd.exe
west flash
```

※ 本体への書き込みができない場合、BBC micro:bit の[ファームウェアの最新化](https://microbit.org/get-started/user-guide/firmware/)を行ってください。

# VSCodeを用いた開発環境の構築
Visual Studio Code (VSCode)を用いたに開発環境を構築します。

## VSCodeのインストール
https://code.visualstudio.com/Download のページから、Windows版のVSCodeをダウンロードし、インストールします。

## VSCode拡張機能のインストール
VSCodeを起動し、次の２つの拡張機能をインストールします。

1. C/C++ 拡張機能（Microsoft）
1. Native Debug 拡張機能（webfreak）

### C/C++ 拡張機能 のインストール

1. `Ctrl-P`を押下し、VSCodeの検索ボックスを開きます。
1. 検索ボックスに`ext install cpptools`と入力し、Enterキーを押下します。 
1. リストのトップに拡張機能の`C/C++`が表示されますので、`インストール`ボタンでインストールします。

### Native Debugger 拡張機能 のインストール

1. `Ctrl-P`を押下し、VSCodeの検索ボックスを開きます。
1. 検索ボックスに`ext install webfreak.debug`と入力し、Enterキーを押下します。 
1. リストのトップに拡張機能の`Native Debug`が表示されますので、`インストール`ボタンでインストールします。

## ワークスペースの関連付け
エクスプローラーで`C:\zephyr`フォルダーを開き、ファイル名やフォルダ名以外の空白の部分で、右クリックし、`Code で開く'で、VSCodeで開きます。

## デバッグ環境構成の定義(GDB)
VScodeのメニューから[実行(Debug)]-[構成を開く(Open Configuration)]を選択し、環境の選択の中から`GDB`を選択します。`launch.json`ファイルが追加され、テキストエディタに表示されますので、次の内容で上書き保存します。

``` launch.json
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "gdb_zephyr",
            "type": "gdb",
            "request": "attach",
            "executable": "${workspaceRoot}\\zephyrproject\\zephyr\\build\\zephyr\\zephyr.elf",
            "target": ":3333",
            "cwd": "${workspaceRoot}",
            "gdbpath": "C:\\GNUToolsArmEmbedded2018-q2-update\\bin\\arm-none-eabi-gdb.exe",
            "remote": true,
            "autorun": [
                "monitor reset"
                ],
        }
    ]
}
```

## サンプルプログラムのデバッグ
サンプルプログラムをステップ実行でデバッグしてみます。

### ブレークポイントの追加
`zephyrproject\zephyr\samples\boards\bbc_microbit\display\src\main.c`を開き、行番号の左で、ブレークポイントを追加・削除できます。

### GDBサーバーの開始
`Ctrl-@`キーを押下し、ターミナルを開きます。次のコマンドを実行し、GDBサーバーを起動します。

コマンドプロンプトを起動し、次のコマンドを実行し、GDBサーバーを起動します。

```
c:\zephyr\venv\scripts\activate
cd c:\zephyr\zephyrproject\zephyr\
west debugserver
```

### デバッグ実行の開始
次の手順で、デバッグ実行を開始します。

1. `Ctrl-Shift-D`キーを押下し、左縦のアクティビティバーから「実行(Debug)」アイコンを選択し、左側のペインを切り替えます。
2. 「実行(Debug)」ドロップダウンリストで、`gdb_zephyr`を選択します。
3. 「実行(Debug)」横の緑色の「デバッグの開始」ボタンをクリックするとGDBセッションが開始されます。
4. すぐさま、デバッグが開始され、ブレークポイントで、一時停止します。
5. 「続行(F5)」で、処理が続行され、次のブレークポイントで一時停止します。

## VSCodeのタスク

### バッチファイル

`C:\zephyr`フォルダーに次の３つのバッチファイルを作成します。

```build.bat
call .\venv\scripts\activate.bat
cd .\zephyrproject\zephyr\
west build -p auto -b bbc_microbit %1
```

```flash.bat
call .\venv\scripts\activate.bat
cd .\zephyrproject\zephyr\
west flash
```

```debug.bat
call .\venv\scripts\activate.bat
cd .\zephyrproject\zephyr\
west debugserver
```

### tasks.jsonの追加
次の手順で、tasks.jsonファイルを追加します。

1. Ctrl-Shift-Pキーを押下し、表示された検索ボックスで、tasksと入力すると候補が絞り込まれますので、タスク: タスクの構成 / Tasks:Configure Taskを選択します。
1. テンプレートからtasks.jsonを作成をクリックし、リスト末尾のOthersをクリックします。
1. tasks.jsonファイルが追加され、エディタに表示されます。

tasks.jsonの内容を次の定義内容で上書き保存します。

```tasks.json
{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "build_zephyr",
            "type": "process",
            "command": "build.bat",
            "group":{
                "kind": "build",
                "isDefault": true
            },
            "args": [
                "samples\\boards\\bbc_microbit\\display"
            ]
        },
        {
            "label": "flash_zephyr",
            "type": "process",
            "command": "flash.bat",
            "dependsOn": [
                "build_zephyr"
            ]
        },
        {
            "label": "debug_zephyr",
            "type": "process",
            "command": "debug.bat",
        }
    ]
}
```

### タスクの実行方法
例えば、`debug_zephyr`タスクを実行するには、次の手順で操作します（他のタスクも同様）。

1. Ctrl-Shift-Pキーを押下し、検索ボックスを開きます。
1. tasksと入力すると、候補が絞り込まれますので、タスク: タスクの実行 / Tasks: Run Taskをクリックします。
1. `debug_zephyr`が実行するタスクの選択候補に表示されますので、それをクリックします。
1. 下段のペインで、`debug.bat'が実行されます。


尚、`build_zephyr`タスクに関しては、その定義で`group`が指定されていますので、Ctrl-Shift-Bキーで、実行できます。

# まとめ
micro:bitで本格的な組込みソフトウェア開発ができることを確認しました。

* リアルタイムオペレーティングシステムの実装である[Zephyr](https://www.zephyrproject.org/) を使いました。
* C/C++による本格的な組込みソフトウェア開発環境を構築しました。
* サンプルプログラムのLチカをmicro:bit本体で動作させました。
* VSCodeでサンプルプログラムをデバッグ実行し、ステップ実行できることを確認しました。
* westコマンドをVSCodeのタスクとして実行できるようにしました。