前の記事
全体の目次
Longan Nanoを使ってみる 1 ~ビルド環境の構築~
Longan Nanoを使ってみる 2 ~デバッガの環境設定~
Sipeed RISC-V Debugger
Longan Nanoを使ってみる 3 ~デバッガの使用方法~
Longan Nanoを使ってみる 4 ~printfを使ったデバッグ~
Longan Nanoを使ってみる 5 ~ゲームのプロジェクトを作成~
Longan Nanoを使ってみる 6 ~文字出力~
Longan Nanoを使ってみる ~FONTX2ファイルを作る~
Longan Nanoを使ってみる 7 ~外枠とブロックを書く~
Longan Nanoを使ってみる ~謎の画像表示関数~
Longan Nanoを使ってみる 8 ~ボールを動かす~
Longan Nanoを使ってみる 9 ~A/Dコンバータから入力~
Longan Nanoを使ってみる 10 ~パドルを動かす~
Longan Nanoを使ってみる 11 ~ボタンの入力
Longan Nanoを使ってみる 12 ~ボールのロス~
Longan Nanoを使ってみる 13 ~ステージの遷移とゲームオーバー~
Longan Nanoを使ってみる 14 ~PWMとサウンド~
Longan Nanoを使ってみる 15 ~音楽を鳴らす~
Longan Nanoを使ってみる 16 ~とりあえずのまとめ~
デバッガの使用方法
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);
}
}
ビルド
ソースコードを適当に変更したら、ビルドする。
コンソールには、ビルドの進捗が表示される。コンパイルエラーが出たら修正するのは言うまでもない。
:
:
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上でプログラムが実行されるのを確認しておく。
デバッグ実行
デバッグは、VSCodeの[実行]>[デバッグの開始]から行う。
ワークスペース中に、複数のプロジェクトが存在する場合、[実行とデバッグ]タブのドロップダウンから、デバッグ対象のプロジェクトを選択する。
デバッグが開始されると、mainの先頭でプログラムは停止する。
基本操作
デバッガのデフォルトでの画面構成は次の通り。一般的な機能は一通りそろっている。
実行に関する操作
プログラムの実行や停止を行う主な操作は次の通り。
キー | アイコン | 動作 |
---|---|---|
F10 | ステップオーバー実行 | |
F11 | ステップ実行(関数にステップインする) | |
SHIFT+F11 | ステップアウト実行 | |
F5 | 実行 |
デバッガ制御に関する操作
デバッガ自体を止めたり、最初からデバッグをやり直すなどの制御は次の通り。
キー | アイコン | 動作 |
---|---|---|
F5 | 実行 | |
SHIFT+F5 | デバッグの停止 | |
CTRL+SHIFT+F5 | デバッグの再起動 |
ブレイクポイント
Longan Nanoでは、ハードウェアブレイクポイントとして、最大4か所のブレイクポイントが設定できる。4か所を超えて設定すると、デバッガは開始できない。最も一般的な、行にブレイクポイントを設定する場合は、ソースコードペインの行番号の左側をクリックする。
ブレイクポイントには、条件が指定できる。ブレイクポイントの一覧で、設定済みのブレイクポイントを選択、条件の編集をクリック。ソースコードペインに、ドロップダウンが表示されるので、必要な条件を選択、右側に条件式を指定する。
下の画面では、114行目のif 文は、 prevModeという変数が1の場合にのみブレイクポイントで停止する。(C/C++の比較演算子、== も使用できる)
条件 | 意味 |
---|---|
式 | 条件式を指定し、変数などが条件を満たした時に停止する。 例:val >= 1 |
ヒットカウント | 所定の回数、この行を通過したら停止する |
ログメッセージ | LonganNanoのデバッガでは使用できない? |
変数のウオッチ
変数はいくつかの方法で確認することができる。
変数ペイン
変数ペインには、現在定義されている変数(システム定義のものも含む)が表示される。ただし、GlobalなStatic変数は表示されないようだ。
Local のツリーには、現在表示している関数で使用されている関数が表示される。この内容は、関数にステップインしたり、コールスタックペインで、関数を切り替えると変更されるので、同じ名前のローカル変数などがある場合には注意が必要
ウォッチ式ペイン
ウオッチ式ペインには、ユーザーが事前に登録した変数を表示し続ける。この変数は関数をステップインしたり、コールスタックで注目している関数を切り替えても変化しない。常に、変数を監視し続けることができる。
ウオッチする変数を追加するには、ウォッチ式ペイン右上の+ボタンをクリック、ウォッチ対象の式を追加する。ここには変数名を書くが、最適化されてしまった変数は監視できない。例えば、下の画像では、 iSpeed1は最適化されてしまった変数なので監視できない。(と表示される。
簡単な式も設定できる。例えば、j * Speed2 などと、変数を使った式を指定できる。(最適化済みの変数は式に使用できないので、i * Sepped1などは使用できない)
関数も、最適化されて失われていなければ使用できるようだが、突然デバッガが終了する、しばらくの間フリーズするなど動作が不安定なので使用できないと思ったほうが良い。
マウスホバー
変数の上にマウスカーソル(キャレット)を重ねると、変数の内容が表示される。下の画像では、 i の右上に変数iの内容である2が表示されている。
PERIPHERALS
PERIPHERALSペインでは、CPUの周辺機器レジスタ報が確認できる。Longan NANOでは、APIを使って制御を行うことを推奨しているのか、あまり直接このレジスタに関して説明しているページが少ないように感じる。こうしたレジスタについて独立したドキュメントではなく、Firmware Library User Guideの一部に掲載されている。
実際のところ、APIだけで制御できるので、直接周辺機器レジスタを操作する(このデバッグ情報を使う)ことは少ないかもしれない。
実際に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に変化が表示される。
コールスタック
コールスタックペインでは関数の呼び出し経路が表示される。それぞれの関数をクリックすると、対応するソースコードが右側のソースコードペインに表示され、同時に変数ペインの内容も選択された関数にあわせて変更される。
ここまででできたこと
デバッガを使ってプログラムを実行し、停止し、変数の内容が確認できるようになった。