第33回 PICマイコンのプログラムデバッグ(2)

今回はデバッグの主要な機能を一通り紹介します。

今回の説明内容

前回の記事では、典型的なデバッグの手順を説明しました。PICマイコンの処理をプログラムの特定の行で止め、その時の変数の値を確認する、という内容でした。

ところで、MPLABX IDEのデバッグには他にも色々な機能があります。今後ご自身でプログラムをデバッグするときのためにも、MPLABX IDEが持っている主要なデバッグ機能を説明します。なお、プログラムは前回使用したSPI通信の動作確認用プログラムを使用します。

それでは、デバッグできるように準備しましょう。PICKIT3をブレッドボードのピンヘッダに接続して、MPLABX IDEでプロジェクトを開き、電池ボックスの電源を入れましょう。

 

デバッグ手順その2

(「デバッグ手順その1」は前回の記事で説明しています)

前回の記事では、プログラムの特定の位置で処理を止めて、そのときの変数の値を確認しました。

ところで、プログラムが意図したように動作しない場合は、どこか特定の位置でプログラム処理を止めるというより、最初から順番に実行させて、処理がどのように進んでいるのか確認したいケースもあります。そこで、main関数の最初からプログラムを順番に1行1行実行させながらデバッグしていく方法を説明します。

それでは、最初にプログラムにブレークポイントが設定されていないことを確認してください。もしブレークポイントが設定されている場合、その行の行番号の位置をもう一度クリックしてブレークポイントを解除します。

次に、デバッグボタンをクリックしてデバッグを開始します。

Pic practice 33 debug button

デバッグボタンをクリックすると例のダイアログか表示されると思いますので、前回と同様に内容を確認したふりをしてOKボタンをクリックしてデバッグに入りましょう。

と、ここまではいいのですが、その後は何も変化はないですよね。今回はブレークポイントを設定していませんので、どこかで止まることなく処理が進み、おそらく今頃はwhile文を実行しているに違いありません。。。

と、実況中継している場合じゃないですよね。プログラムの先頭から順番に処理を実行してもらいましょう。

先頭から順番に実行するには、まず最初に以下の「Pauseボタン」(一時停止ボタン)をクリックして処理を一時停止させます。

Pic practice 33 pause button

一時停止すると、以下の「Resetボタン」(リセットボタン)が有効になりますので、リセットボタンをクリックします。

Pic practice 33 reset button

すると、以下のようにmain関数の最初の行で処理が停止している状態になります。

Pic practice 33 paused

このように、プログラムの先頭から順番に実行させたい場合、デバッグ開始 → 一時停止 → リセットします。

それでは、ここから1行ずつPICマイコンに処理を実行してもらい、必要があれば変数の値を確認したり、どのように処理が進むか確認しながらプログラム処理を進めていきましょう。

緑色の行は、これから実行する処理になります。この行を実行するには以下の「Step Overボタン」をクリックします。

Pic practice 33 step over button

なお、以下のようにボタンが隠れている場合があります。

Pic practice 33 hidden buttons

このような場合は「>>」マークにマウスカーソルを合わせると、以下のように隠れているボタンが表示されます。

Pic practice 33 show hidden buttons

ところで、「Step Over」という意味はよくわかりませんよね。「Step」は1ステップずつ実行する、というような意味合いで用いられています。「Over」の意味は、他のボタンとあわせて後のセクションで詳しく説明します。

それでは、「Step Overボタン」を1回クリックしてください。クリックすると、緑色の行が次に進みます。

Pic practice 33 debug next line

この状態は、先ほどの行「OSCCON1bits.NDIV = 0b0000;」が実行され、今の緑色の行はこれから実行される行になることを意味しています。

それでは、OSCCON1bits.NDIVレジスタの中身を確認してみます。このように「.」(ドット)で変数を指定している場合(=構造体の数値を確認する場合)、カーソルの位置により表示される内容が異なります。

先ほど実行した行は「NDIV」の値の設定です。「NDIV」の値を確認するには「NDIV」にカーソルを合わせます。すると、以下のように「NDIV」レジスタの情報が表示されます。

Pic practice 33 register ndiv

なお、「OSCCON1bits」にカーソルを合わせると、以下のように「OSCCONbits」に関する情報が表示されてしまいますので、カーソルを合わせる位置に注意します。

Pic practice 33 register osccon1

このように「Step Over」ボタンをクリックしながら、1行1行処理を進め、変数の中身を確認していくことができます。

 

特定の行まで実行する

これまで説明した手順でプログラムの先頭から1行ずつ実行していくことができますが、プログラムが長い場合、1行1行Step Over実行していくのではなく、特定のところまで処理をまとめて実行してもらいたいケースが出てきます。

例えば、最初の動作周波数設定やピンの属性設定などは、単にレジスタに値を設定するだけの処理で問題が発生することはあまり考えられません。そこで、設定部分はまとめて実行してしまいましょう。

処理をまとめて実行する場合は、「Run to Cursor」(カーソルがある行まで実行する)という機能を使用します。

レジスタの設定は特に1行1行確認する必要がありませんので、設定に関する処理は飛ばして、「uint8_t chipid = 0;」の行まで処理を進めましょう。以下のように「uint8_t chipid = 0;」の行のどこかを一度クリックしてカーソルを移動します。

Pic practice 33 run to cursor setting

次に、以下の「Run to Cursor」(カーソル行まで実行)ボタンをクリックします。

Pic practice 33 run to cursor button

クリックすると「uint8_t chipid = 0;」の行まで処理を進めて止まります。

Pic practice 33 run to cursor processed

このようにカーソル行まで実行する機能を利用すると、プログラムの最初から効率的に処理を追うことができます。

 

関数の実行について

「uint8_t chipid = 0;」の行が緑色の状態で、Step Overボタンをクリックしてください。クリックするとこの行が実行されて次の「chipid = spiRead1ByteData(0xD0);」の行に進みます。

※ 次はしばらく操作を行わないで説明を先にお読みください ※

もし、この状態でStep Overボタンをクリックすると、この行が実行されてchipidにチップIDが格納されます。

ところで、処理する行が関数の場合、関数の中身に処理を進めたいことがあります。Step Overボタンは実行する行が関数の場合でも、1回クリックすると関数全体をいっぺんに処理してしまいます。

一方、関数の行を実行する際に関数の中身に処理を進めたい場合があります。その場合は以下の「Step Into」ボタンを使用します。

Pic practice 33 step into button

それでは、これからは説明に沿って操作してみてください。

チップIDを取得する行で、Step Intoボタンをクリックします。すると先ほどのStep Overボタンと異なり、関数に処理が進みます。

Pic practice 33 step into processed

このように関数内部の処理も確認したい場合は、Step Intoボタンを使えば関数内部に処理を進めることができます。

ここで用語について確認しておきます。

Step Overの「Over」とは「越える」というような意味合いがあります。その行を関数内部に入らずに越えていくようなイメージです。

これに対し、Step Intoの「Into」は「中に」というような意味合いで、関数の中に入っていく、というようなイメージです。

状況に応じてStep OverとStep Intoを使い分けてみてください。

この後は、Step OverやStep Into、Run to Cursorなどを使い分けながらデバッグしていくことになります。

 

補足: ブレークポイント設定時のステップ実行

今回の記事では、プログラムの最初からステップ実行して、PICマイコン内部で処理がどのように進んでいるか確認しました。

一方、前回の記事ではデバッグ実行前にブレークポイントを設定し、その行で止めて変数の内容を確認していました。

となると、ブレークポイントを設定して、その位置で処理を止めて変数の中身の確認などを行い、その後Step Over実行したい、というケースも出てきそうです。この操作には注意が必要ですので補足説明いたします。

例えば、「chipid = spiRead1ByteData(0xD0);」の行にブレークポイントを設定して、デバッグを開始すると、この行で処理が止まった状態になります。

この状態でStep Over実行すると、以下のようなダイアログが表示され、Step Over実行できません。

Pic practice 33 breakpoint unavailable

ブレークポイントでプログラムを止めてStep OverやStep Into実行できてもいいような気がしますが、どうもMPLABX IDEの仕様のようで、ブレークポイントが設定されているところではStep Over / Step In実行ができないようです。

このような場合は、この状態でブレークポイントを解除するとStep Over / Step In実行ができるようになります。

前回と今回ご説明したデバッグ機能を使用すれば、ほとんどのケースに対応できると思います。

デバッグには他にもいろいろな機能がありますが、残りの機能についてはマイコンの内部動作の理解が必要だったりしますので、説明は省略いたします。不明点があればコメント欄からご質問いただければと思います。

 

更新履歴

日付 内容
2018.5.12 新規投稿