(6)デバッグの仕方(PICkit3の場合)


MPLAB X IDEにはPICkit3やMPLAB ICD3などを使って実機デバッグをするときに便利に使える機能が
満載されています。ここではPICkit3を使って実機デバッグをする仕方について説明します。


A) デバッグをできるようにするための条件
 どのPICマイコンもデバッグがそのままできるわけではありません。
 とくに少ピンのPICマイコンの場合には、デバッグをする際に2ピンが専用に使われてしまうため、
 この汎用ピンが使えなくなりますからデバッグが実際には難しくなります。
 また、デバッグができるためには、専用のデバッグをサポートする機能(ビルトイン デバッガ ステートマシン)
 がPICマイコンに内蔵されていなければなりません。

  このような条件が整わないPICマイコンについては、「デバッグヘッダ」というものが別に用意されていて、
 このヘッダには「エミュレーションチップ」という特別なPICマイコンが実装されています。
 つまり、ヘッダのエミュレーションチップが実際のPICマイコンの代わりをして実機デバッグを行います。
 
 デバッグヘッダが必要かどうかは、プロジェクトのPropertyで判断できます。
 Project名を右クリックして開くポップアップメニューで[Properties]をクリックして開くダイアログ内の中央上に
 ある [Supported Debug Header:]の欄が(Required)となっていれば何らかのヘッダが必要ということです。
 そしてRequiredの場合は、その下の欄でデバッグヘッダの名称が選択できるようになっています。


B) デバッグモードにする方法
 まずPICkit3を使って実機デバッグをする方法ですが、下記のようにします。
 @ PICkit3の接続方法
   デバッグをする場合のPICkit3とターゲットとなる実機との接続ですが、これは
   通常のプログラム書き込みの場合とまったく同じです。

 Aデバッグモードにする
   これにはPICマイコンにデバッグモードのプログラムを書き込む必要があります。そのためのアイコンが
   用意されています。メインメニューの[Debug Main Project]のアイコンをクリックするだけです。

  このとき、場合によると下記のようなダイアログが表示されるかも知れません。これはConfigurationの設定
  でPower-up TimerをEnableにしていると表示されますが、ここは無条件に[Yes]とします。
  デバッグが終了すればもとの設定に戻ります。




 


C) 実行制御方法
  これで書き込みが完了すると下図のようなデバッグ用のアイコンが自動的に追加されます。
  これ以降はこのアイコンを使ってデバッグを進めます。



 これらのアイコンによる実行の流れを制御する方法は下記のようになります。
 @停止させてリセットする
   通常、デバッグモードの書き込みが完了すると、すぐ実行状態になってしまいます。このとき、[Pause]
   アイコンをクリックして停止させます。
   次に[Reset]アイコンをクリックすればmain関数の最初の実行文で停止した状態になりますから、ここから
   デバッグを開始します。これでデバッグの準備が完了です。
   [Reset]アイコン操作はいつでも可能ですが、ブレークポイントが設定されているとエラーになりますので、
   ブレークポイントを解除する必要があります。

 A連続実行とステップ実行
   停止した状態からプログラムの実行を開始させる方法には、連続実行とステップ実行があり、アイコンで
   区別しています。
   [Continue]  → 連続実行モードで実行を開始し、[Pause]アイコンかブレークポイントがあれば停止する
   [Step Over] → 1行ずつ実行する。このときサブ関数を呼び出している場合、サブ関数の中には入らず
              サブ関数を実行して直ぐ次の行に進む
              ただしブレークポイントが設定されているとエラーになるのでブレークポイントをはずす
              必要がある
   [Step Into]  → 1行ずつ実行する。サブ関数の中にも入っていって1行ずつ実行する
   (delayなどの組み込み関数には入れないので、[Continue]で通過させるように実行する必要があります。)

 Bカーソルによる実行制御
   カーソルとはマウスで選択した行の位置のことで灰色の背景色になっている行のことです。
   [Run to Cursor] → カーソルが指定されている行まで現在位置から実行して停止する
   [Set PC at Curosr] → これから実行開始する場所をカーソル位置に移動する
   [Focus Curosr at PC] → 現在停止位置をカーソル位置にする
    (ここでPCとはProgram Counterのことで実行開始位置のことを示しています)


D) ブレークポイントの設定
 デバッグで流れを制御する場合、ブレークポイントでいったん停止しながら行います。このブレークポイント
 の設定方法は簡単で、ブレークさせたい行の行番号をクリックするだけです。これで赤の背景色になって
 ブレークポイントの位置となります。
 ブレークポイントの解除は再度行番号をクリックすれば解除となります。

 ブレークポイントは何か所でも設定できますが、有効なのは常に最後に設定した赤い行の一か所だけとなります。
 この切り替えはやや面倒ですが[BreakPoints]窓で行うことができます。
 メインメニューから[Window] → [Debugging] → [Breakpoints] で表示される下記[Breakpoints]窓で切り替えや
 削除ができます。 




E) 変数のチェック
 ブレークポイントで停止させながらデバッグをする場合、変数やレジスタの値をチェックする必要があります。
 これをチェックするための窓があります。まず窓はつぎのようにして開きます。
 [Window] → [Debugging] → [Watches]





ここに変数を登録するには下記のようにします。
@変数名をドラッグドロップする
 ソースファイルで表示させたい変数名を選択し、それをWatches窓にドラッグドロップします。

A変数名を入力する
 Watches窓のName欄の<Enter new watch>をダブルクリックしてから、変数名を入力します。
このいずれかの方法で変数の値を表示させた状態が下図となります。

 表示内容は、停止したときの現在値を表示しています。そして前回から変更された時には赤字で
同じ場合は黒字で表示されます。
さらに配列や構造体の場合には、変数名の+マークをクリックすると下図のbcdのように、構造体の
各要素の値を自動的に展開して表示します。



さらに表示方法については、見出し欄で右クリックすると下図のようなポップアップメニューが表示
されますので、ここで表示させたい形式を選択することで追加や削除が自由にできます。



こうして表示内容を追加した例が下図のようになります。

Watches窓では変数の値を強制的に変更することができます。
変数の[Value]の欄をダブルクリックすると入力モードになりますので、ここで適当な値を入力して
[Enter]キーを押せばその値に変更されます。入力値は16進数を使うことになります。

この後の実行はこの値を元にして実行が行われますから、プログラムの上下限テストなどを行うことができます。




F) 関数の呼び出し関係のグラフ表示
 少し複雑なプログラムになって関数がたくさんになった場合、関数の間の関係をグラフィカルに
 表示する機能があります。 表示のさせ方は次のようにします。

 対象の関数名で右クリックしてポップアップメニューを表示 → [Show Call Graph]をクリック

 これで下図のような関数の関連が表示されます。この関数名をダブルクリックすれば、関数の記述先が自動的に
 エディタ画面に表示されカーソルが移動します。

さらに上図のように例えばSendで右クリックして開くポップアップメニューで[Expand Callers]をクリックすると
下図のようにさらに呼び出し元が追加されて表示されます。
これを繰り返すことで全体の関数の関連図が描画されることになります。




G) その他の窓
 [Windows] にはまだたくさんの表示窓が用意されています。簡単に説明します。
 @Dashboard
  現在main projectとして選択されているプロジェクトに関連する情報を一覧で表示します。
  ここにはデバイス、コンパイラ、ツール、メモリ使用量などの情報が表示されます。
  また左側の欄外にあるアイコンでPropertiesダイアログを表示させたり、デバイスのデータシート
  を表示させたりすることができます。



 Aプログラムメモリ
  フラッシュメモリ内容の表示です。
  [Window] → [PIC Memory Views] → [Program Memory]で表示されるもので、プログラムメモリの
  現在の内容を16進数で表示します。
  さらに左下のメモリ種別選択で表示するメモリを切り替えることもできます。





 BFile Register
  データメモリの内容表示です。
  [Window] → {PIC Memory Views] → [File Registers] でデータメモリの一覧表を表示します。
  この表示方法には「Hexモード」と「Symbolモード」があり、下のボタンで選択切り替えができます。
  この一覧表の表示は、実際にPICマイコンから現在値を読み出して行いますので、ちょっと表示更新に
  時間がかかります。これはPICkit3のUSB接続がフルスピードのためで、12Mbpsの速度でしか転送
  できないことによります。MPLAB ICD3を使えばハイスピードになりますから表示も高速化されます。

  さらにこの表でデータ部をダブルクリックすれば入力モードになりますから、ここからデータを変更して
  プログラムを実行させることもできます。





 CSFRの表示
  周辺モジュール制御用のSFRの表示です。
  [Window] → [PIC Memory Views] → [SFR]で表示されます。
  さらに表示方法を下側のボタンで変更できるようになっていて、下図の例では周辺モジュールごとに
  まとめて表示させています。[Select Peripherals]ボタンで特定の周辺モジュールに関連するものだけに
  限定して表示させることもできます。




 DEEPROMの表示
 消えないデータメモリとして用意されているEEPROMの内容表示です。
 [Window] → [PIC Memory Views] → [EEPROM] で表示されます。
 通常EEPROMは特別な手順を踏まないと書き換えできませんが、この窓では書き換えたい場所を
 ダブルクリックして選択し、書き換えるだけで内容を変更できます。






H) アセンブラ展開リストによるデバッグ
 C言語をコンパイルした結果のアセンブラレベルのリストを表示することができます。
 [Window] → [Debugging] → [Disassembly] で下記窓が表示されるようになります。

 これはC言語の行ごとにコンパイラがアセンブラ命令に変換した結果を表していて、このリストで
 アセンブラ言語ベースで実機デバッグをすることができます。

 アセンブラ行でブレークポイントを設定することもできますし、ステップ実行ではアセンブラ命令の
 行ごとにプログラム実行を進めることができます。
 この場合のブレークポイントの行には三角マークが追加されて表示されます。

 PICkit3ではパソコンとの通信が遅いため、ブレークポイントでの停止した表示が、2命令程度
 先に進んでから停止するように表示されてしまいますが実際にはブレークポイントで指定した
 行で停止しています。