LoginSignup
1
0

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-02-15

前の記事

Longan Nanoを使ってみる 2を参照

全体の目次

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);
    }
}

ビルド

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

vscode16.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

デバッグは、VSCodeの[実行]>[デバッグの開始]から行う。
debug1.png

ワークスペース中に、複数のプロジェクトが存在する場合、[実行とデバッグ]タブのドロップダウンから、デバッグ対象のプロジェクトを選択する。
debug2.png

デバッグが開始されると、mainの先頭でプログラムは停止する。
debug1.png

基本操作

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

debugger.png

実行に関する操作

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

キー アイコン 動作
F10 debug_stepover.png ステップオーバー実行
F11 debug_stepin.png ステップ実行(関数にステップインする)
SHIFT+F11 debug_stepover.png ステップアウト実行
F5 debug_run.png 実行

デバッガ制御に関する操作

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

キー アイコン 動作
F5 debug_run.png 実行
SHIFT+F5 debug_stop.png デバッグの停止
CTRL+SHIFT+F5 debug_restart.png デバッグの再起動

ブレイクポイント

Longan Nanoでは、ハードウェアブレイクポイントとして、最大4か所のブレイクポイントが設定できる。4か所を超えて設定すると、デバッガは開始できない。最も一般的な、行にブレイクポイントを設定する場合は、ソースコードペインの行番号の左側をクリックする。
breakpnt1.png

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

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

変数のウオッチ

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

変数ペイン

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

watch1.png

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

ウォッチ式ペイン

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

watch2.png

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

マウスホバー

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

watch3.png

PERIPHERALS

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

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

例えば、GPIOCについては、このように状態が確認できる。
image.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に変化が表示される。

perif1.png

コールスタック

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

stack.png

ここまででできたこと

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

次の記事に進む

Longan Nanoを使ってみる 4 ~printfを使ったデバッグ~

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0