Longan Nanoを使ってみる 3 ～デバッガの使用方法～

# 前の記事

[Longan Nanoを使ってみる 2](https://qiita.com/BUBUBB/items/864b2ef9404453810d5f)を参照

# 全体の目次
[Longan Nanoを使ってみる 1 ～ビルド環境の構築～](https://qiita.com/BUBUBB/items/7ce85ada67a3f6d1944d)
[Longan Nanoを使ってみる 2 ～デバッガの環境設定～](https://qiita.com/BUBUBB/items/864b2ef9404453810d5f)
　[Sipeed RISC-V Debugger](https://qiita.com/BUBUBB/items/61316a4df1d9f81e2864)
[Longan Nanoを使ってみる 3 ～デバッガの使用方法～](https://qiita.com/BUBUBB/items/8efa5989e7f16f67672e)
[Longan Nanoを使ってみる 4 ～printfを使ったデバッグ～](https://qiita.com/BUBUBB/items/b607a3eedc4b66e7a74f)
[Longan Nanoを使ってみる 5 ～ゲームのプロジェクトを作成～](https://qiita.com/BUBUBB/items/98d9c25120c0955d5200)
[Longan Nanoを使ってみる 6 ～文字出力～](https://qiita.com/BUBUBB/items/8dee2eabe78f38364674)
　[Longan Nanoを使ってみる ～FONTX2ファイルを作る～](https://qiita.com/BUBUBB/items/8760ac886423bf06be68)
[Longan Nanoを使ってみる 7 ～外枠とブロックを書く～](https://qiita.com/BUBUBB/items/96abb1158b413c9efd27)
　[Longan Nanoを使ってみる ～謎の画像表示関数～](https://qiita.com/BUBUBB/items/40b99468839e1daeebfb)
[Longan Nanoを使ってみる 8 ～ボールを動かす～](https://qiita.com/BUBUBB/items/92f4816af3c41ea13b9e)
[Longan Nanoを使ってみる 9 ～A/Dコンバータから入力～](https://qiita.com/BUBUBB/items/311c179f7d3a0e30495d)
[Longan Nanoを使ってみる 10 ～パドルを動かす～](https://qiita.com/BUBUBB/items/eb8149c68f6e5456e7ca)
[Longan Nanoを使ってみる 11 ～ボタンの入力](https://qiita.com/BUBUBB/items/2445940a6b0d2110ee04)
[Longan Nanoを使ってみる 12 ～ボールのロス～](https://qiita.com/BUBUBB/items/f8c6ff860de127c93cb9)
[Longan Nanoを使ってみる 13 ～ステージの遷移とゲームオーバー～](https://qiita.com/BUBUBB/items/f1ae81b835f55abe319e)
[Longan Nanoを使ってみる 14 ～PWMとサウンド～](https://qiita.com/BUBUBB/items/3b592078d30cfed0ec53)
[Longan Nanoを使ってみる 15 ～音楽を鳴らす～](https://qiita.com/BUBUBB/items/adb35e02209ad78dfa9b)
[Longan Nanoを使ってみる 16 ～とりあえずのまとめ～](https://qiita.com/BUBUBB/items/ba782ccc80f50b7ab8c3)

# デバッガの使用方法
Platform IOを使って、サンプルアプリケーションのビルドと実行が可能になった。
この状態で、すでにデバッガも使用可能になっているはず。

アマチュアが行う普通のマイコン開発では、LEDが光ったか程度で、良くてもprintfが使えるかどうかという事態もあるが、たった1300円で、別次元のデバッグ環境が手に入る。


このページでは、実際にサンプルプログラムを使って、デバッグの基本的な動作を説明する

# 注意
このページは、quiita.com で公開されています。URLがqiita.com以外のサイト、例えばjpdebug.comなどのページでご覧になっている場合、悪質な無許可転載サイトで記事を見ています。正しいURLは、https://qiita.com/BUBUBB/items/7ce85ada67a3f6d1944d です。
無許可転載サイトでの権利表記（CC BY SA 2.5、CC BY SA 3.0とCC BY SA 4.0など）は、不当な表示です。
正確な内容は、qiitaのページで参照してください。


# サンプルプログラムの改変
前のページでは、Platform IOのExamplesそのままをビルドした。それでも良いのだが、変数などを追加して、変数のウオッチを確認する。何でもよいので、main関数に変数を追加しておく。例えば、次のように書き換える。（LEDの点滅が「いい感じ」になる）

```
static int Speed1 = 4;          // 静的変数　（最適化されて削除）
static volatile int Speed2 = 5; // 静的変数　（最適化されない）
int j = 0;              // グローバル変数

int main(void)
{
    
    longan_led_init();
    int i = 0;          // ローカル変数
    while(1){
        /* turn on builtin led */
        for (i = 0;i<10;i++) {
            longan_led_on();
            delay_1ms(i*Speed1);
            longan_led_off();
            delay_1ms((10-i)*Speed1);
        }
        /* turn off uiltin led */
        for (j = 0;j<10;j++) {
            longan_led_off();
            delay_1ms(j*Speed2);
            longan_led_on();
            delay_1ms((10-j)*Speed2);
        }        
        longan_led_off();
        delay_1ms(100);
    }
}
```

# ビルド

ソースコードを適当に変更したら、ビルドする。

![vscode16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2096509/b1532862-d01e-e96d-8a24-91457f729ee2.png)

コンソールには、ビルドの進捗が表示される。コンパイルエラーが出たら修正するのは言うまでもない。

```
 :
 :
Verbose mode can be enabled via `-v, --verbose` option
CONFIGURATION: https://docs.platformio.org/page/boards/gd32v/sipeed-longan-nano.html
PLATFORM: GigaDevice GD32V (1.2.1) > Sipeed Longan Nano
Info : flash size = 128kbytes
cleared protection for sectors 0 through 127 on flash bank 0
Info : JTAG tap: auto0.tap tap/device found: 0x790007a3 (mfg: 0x3d1 (GigaDevice Semiconductor (Beijing)), part: 0x9000, ver: 0x7)
Error: Trying to use configured scan chain anyway...
Warn : Bypassing JTAG setup events due to errors
** Programming Started **
auto erase enabled
wrote 7168 bytes from file .pio\build\sipeed-longan-nano\firmware.elf in 1.937121s (3.614 KiB/s)
** Programming Finished **
** Verify Started **
verified 6584 bytes in 0.337878s (19.030 KiB/s)
** Verified OK **
Info : Hart 0 unexpectedly reset!
Info : Note: Hart is halted due to the halt-on-reset bit is set,please continue your  program by appropriate debugger commands or operations!!
================================== [SUCCESS] Took 25.85 seconds ==================================
```

ビルドが完了したら、Longan Nano上でプログラムが実行されるのを確認しておく。


# デバッグ実行
![debug_stepout.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2096509/afe7be08-cb44-f5bc-210b-3610d99c3b36.png)

デバッグは、VSCodeの[実行]>[デバッグの開始]から行う。
<img width="50%" alt="debug1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2096509/5e339998-f7f3-277f-316a-84783b12fa65.png">

ワークスペース中に、複数のプロジェクトが存在する場合、[実行とデバッグ]タブのドロップダウンから、デバッグ対象のプロジェクトを選択する。
<img width="50%" alt="debug2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2096509/641391e1-2bb5-ead7-24bd-6360a3e64fb7.png">

デバッグが開始されると、mainの先頭でプログラムは停止する。
<img width="50%" alt="debug1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2096509/9bfcff49-a9ef-ee68-2648-91f00d5dc820.png">

# 基本操作

デバッガのデフォルトでの画面構成は次の通り。一般的な機能は一通りそろっている。

<img width="50%" alt="debugger.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2096509/413dac8d-0ddd-045f-9236-b2f399ee473d.png">




## 実行に関する操作

プログラムの実行や停止を行う主な操作は次の通り。

|キー|アイコン|動作|
|---|---|---|
|F10|<img alt="debug_stepover.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2096509/1a68382b-6981-07af-a297-8128c1f1c89e.png">|ステップオーバー実行|
|F11|![debug_stepin.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2096509/eff7399d-48a3-020c-9ad3-438a6c8fb9e8.png)|ステップ実行(関数にステップインする)|
|SHIFT+F11|![debug_stepover.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2096509/1a68382b-6981-07af-a297-8128c1f1c89e.png)|ステップアウト実行|
|F5|![debug_run.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2096509/e0c8924c-357b-9ab6-b873-24df15620b89.png)|実行|

## デバッガ制御に関する操作
デバッガ自体を止めたり、最初からデバッグをやり直すなどの制御は次の通り。

|キー|アイコン|動作|
|---|---|---|
|F5|![debug_run.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2096509/e0c8924c-357b-9ab6-b873-24df15620b89.png)|実行|
|SHIFT+F5|![debug_stop.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2096509/a0f20701-b449-987f-703e-afb8dac50ffc.png)|デバッグの停止|
|CTRL+SHIFT+F5|![debug_restart.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2096509/2368009b-fd84-79ec-c47b-91154f65aead.png)|デバッグの再起動|

## ブレイクポイント
Longan Nanoでは、ハードウェアブレイクポイントとして、最大４か所のブレイクポイントが設定できる。4か所を超えて設定すると、デバッガは開始できない。最も一般的な、行にブレイクポイントを設定する場合は、ソースコードペインの行番号の左側をクリックする。
<img width="50%" alt="breakpnt1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2096509/c745570c-1e61-8db5-a9ff-7819d559d356.png">

ブレイクポイントには、条件が指定できる。ブレイクポイントの一覧で、設定済みのブレイクポイントを選択、条件の編集をクリック。ソースコードペインに、ドロップダウンが表示されるので、必要な条件を選択、右側に条件式を指定する。
下の画面では、114行目のif 文は、 prevModeという変数が1の場合にのみブレイクポイントで停止する。(C/C++の比較演算子、== も使用できる）


<img width="50%" alt = "breakpnt2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2096509/6ed32ba6-c803-2551-7fcf-2127e36be490.png">

|条件|意味|
|---|---|
|式|条件式を指定し、変数などが条件を満たした時に停止する。<br>例：val >= 1|
|ヒットカウント|所定の回数、この行を通過したら停止する|
|ログメッセージ|LonganNanoのデバッガでは使用できない？|


## 変数のウオッチ

変数はいくつかの方法で確認することができる。

### 変数ペイン
変数ペインには、現在定義されている変数（システム定義のものも含む）が表示される。ただし、GlobalなStatic変数は表示されないようだ。

![watch1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2096509/4c00ca12-3913-3243-def8-dd6326683701.png)

Local のツリーには、現在表示している関数で使用されている関数が表示される。この内容は、関数にステップインしたり、コールスタックペインで、関数を切り替えると変更されるので、同じ名前のローカル変数などがある場合には注意が必要

### ウォッチ式ペイン
ウオッチ式ペインには、ユーザーが事前に登録した変数を表示し続ける。この変数は関数をステップインしたり、コールスタックで注目している関数を切り替えても変化しない。常に、変数を監視し続けることができる。
ウオッチする変数を追加するには、ウォッチ式ペイン右上の＋ボタンをクリック、ウォッチ対象の式を追加する。ここには変数名を書くが、最適化されてしまった変数は監視できない。例えば、下の画像では、 iSpeed1は最適化されてしまった変数なので監視できない。（<optimized out>と表示される。

![watch2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2096509/469cd885-c499-6ffc-59a3-f803c15feb52.png)

簡単な式も設定できる。例えば、j * Speed2　などと、変数を使った式を指定できる。（最適化済みの変数は式に使用できないので、i * Sepped1などは使用できない）
関数も、最適化されて失われていなければ使用できるようだが、突然デバッガが終了する、しばらくの間フリーズするなど動作が不安定なので使用できないと思ったほうが良い。

### マウスホバー
変数の上にマウスカーソル（キャレット）を重ねると、変数の内容が表示される。下の画像では、 i　の右上に変数iの内容である２が表示されている。

![watch3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2096509/971c7cdb-8913-5b12-75a0-ef19c53ae4bd.png)

## PERIPHERALS

PERIPHERALSペインでは、CPUの周辺機器レジスタ報が確認できる。Longan NANOでは、APIを使って制御を行うことを推奨しているのか、あまり直接このレジスタに関して説明しているページが少ないように感じる。こうしたレジスタについて独立したドキュメントではなく、Firmware Library User Guideの一部に掲載されている。

実際のところ、APIだけで制御できるので、直接周辺機器レジスタを操作する（このデバッグ情報を使う）ことは少ないかもしれない。


例えば、GPIOCについては、このように状態が確認できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2096509/e369ecba-e459-e34a-4490-41b0273a7fc4.png)

実際にI/O操作を行った際の様子が次の画面コピー。
ISTAT（GPIO port input status register）とOCTL(GPIO port output control register）が、GPIO_BC(LED_PIN_PORT) = LED_PINの前後で変換する。
GPIO_BCは、BCレジスタ（GPIO port bit clear register）に対して書き込みを行う命令だが、BCレジスタはwrite onlyなので表示されない。その代わりにISTATとOCTRLに変化が表示される。

<img width="50%" alt="perif1.png" SRC="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2096509/e0b4f545-4bab-3ea5-386b-1eb007551c39.png">




## コールスタック
コールスタックペインでは関数の呼び出し経路が表示される。それぞれの関数をクリックすると、対応するソースコードが右側のソースコードペインに表示され、同時に変数ペインの内容も選択された関数にあわせて変更される。

![stack.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2096509/dd0bd1a8-8896-75f5-ad24-dcb3504179a4.png)




# ここまででできたこと
デバッガを使ってプログラムを実行し、停止し、変数の内容が確認できるようになった。

# 次の記事に進む
[Longan Nanoを使ってみる 4 ～printfを使ったデバッグ～](https://qiita.com/BUBUBB/items/b607a3eedc4b66e7a74f)