====== はじめに ======
===== シミュレータ・デバッガで何ができるのか =====
* 実機に転送することなくプログラムが動かせる
* 一行ずつ目で追いながらプログラムを実行できる
* 変数の値の確認・変更ができる
* シリアル通信なしでprintfが使える(シミュレーターIO)
といった利点があります。まあよくあるデバッガです。
詳しい使い方は [[https://www.google.co.jp/search?q=HEW+シミュレータ|HEW シミュレータ]] で検索してルネサス公式のpdfのマニュアルをダウンロードしてください。
===== 既存のワークスペースにシミュレータを導入したい =====
できないことはありませんが、ちゃんと動くかの保証ができない上、シミュレーターIOが使えないので解説しません。
シミュレーターが動く新しいワークスペースを作成し、そこにソースコードを移行してください(intprg.cも書き換えてるなら忘れずにコピーする)。
どうしてもやりたい人はwikiの編集履歴から参照してください(うまくいく保証はしません)。
====== シミュレータ導入 ======
===== シミュレータ使用可能な新規プロジェクトの作成 =====
{{:メニュー.png|}}\\
メニューのファイル=>新規ワークスペース
{{:新規プロジェクト1.png|}}\\
左側でAppliccationを選択、ワークスペース名(ここではH8simuとする)いれて"次へ"\\
既存のプロジェクトに導入する人はどのフォルダに作るかをしっかり覚えておいてください。
{{:新規プロジェクト2.png|}}\\
自分の使用しているCPUシリーズとタイプを選択して"次へ"(この例ではH8 3052F)
{{:新規プロジェクト3.png|}}\\
ここの設定項目はCPUの種類ごとに変わります。
ここの設定で次のターゲット選択画面で、どのターゲットを選ぶか決まります。
H8 3052FはAdvanceモードしかないので特に気にしなくていいです。\\
sh 7125だとエンディアンの選択があります。
"次へ"
{{:新規プロジェクト3-2.png|}}\\
"I/Oライブラリ使用"にチェック(シミュレーターIOを使うため)。
ターゲット選択画面が出るまで"次へ"
{{:新規プロジェクト4.png|}}\\
ターゲットを選びます\\
2つ前の画面で選んだ動作モードに対応します。
この例だとAdvanceモードなので、HAの方を選びます。
よくわかんない人は全部にチェックでもいいと思います。\\
"完了"か、"次へ"で最後まで進んで"完了"
====== シミュレータを使用してデバッグする ======
===== 最適化無効の話 =====
シミュレータ・デバッガを使えばプログラムを一行ずつ実行できますが、コンパイラはコンパイルするときにデフォルトで最適化を行い、省略できるコードは省略してしてしまうので、この状態だとうまくプログラムを一行ずつ実行できません。なので次のどちらかの方法で最適化を切ってからコンパイルします(最適化されたコードをデバッグしたい場合は切らないでください)。
- 変数をvolatile修飾子をつけて宣言し、その変数に関わるところのみ無効化
- コンパイルオプションで全体的に無効化(下の画像を参照)
{{:コンパイルオプ1.png|}}\\
{{:コンパイルオプ2.png|}}\\
===== 準備 =====
{{:セッション.png|}}\\
右上を"Debug"とシミュレータ用のセッションにする\\
F7を押してビルド\\
"ダウンロードしますか?"というダイアログがでてきたら"はい"\\
{{:ダウンロード2.png|}}\\
"なんとか.abs - なんとか"が白紙のアイコンになってる場合はダブルクリックして白紙じゃなくしてください。\\
{{:ダウンロード.png|}}
===== ブレークポイントとステップ実行 =====
==== デバッガの用語 ====
ブレークポイント : これがある場所で止まります\\
ステップオーバー :一行ずつ実行します\\
ステップイン : 一行ずつ実行しますが、関数の中に入ります\\
ステップアウト :関数の外に出ます\\
{{:デバッグ.png|}}
左から
CPUリセット、実行、カーソルまで実行、リセットして実行、?、ステップイン、ステップオーバー、ステップアウト、etc...\\
"実行"は次のブレークポイント(BP)まで実行します。
==== ブレークポイントの設定 ====
{{:bp.png|}}\\
S/Wブレークポイントの欄をダブルクリックします。
==== 実際にデバッグする ====
まずどこかにBPを設定し、"CPUリセット"{{:cpuリセット.png|}}を押してから{{:実行.png|}}"実行"を押すか、{{:リセットして実行.png|}}"リセットして実行"を押す\\
あとは好きにステップインとかしてください。
===== 変数のウォッチ =====
変数の中身を見たり、変更したりできます。
==== ウォッチ画面 ====
上のバーの\\
{{:ウォッチ1.png|}}\\
またはメニューから\\
{{:ウォッチ2.png|}}\\
で変数のウォッチ画面を開きます。
ウォッチウィンドウを移動させるとき、Ctrlキーを押しながら移動させるとメインウィンドウに結合しません。
==== 変数の登録 ====
変数を登録しないと変数をウォッチできません。ウォッチウィンドウの"シンボル登録"ボタンを押して、変数名を入力して登録してください。\\
{{:ウォッチ3.png|}}
**最適化で変数がなかったことにされている場合はウォッチできません。**
==== 基数の変更 ====
変数を選択し(ShiftキーやCtrlキーを使って複数選択もできます)右クリックして基数を変更出来ます。\\
{{:基数変更.png|}}
===== LEDパネル =====
LEDやボタン等のアドレスがわかっていればGUI I/Oでパネルを作ることができます。\\
{{:guiパネル.png|}}\\
詳しい方法はpdfのマニュアルをみてください。
{{:ledの設定.png|}}
==== アドレスを簡単に知る方法 ====
LEDやスイッチ等のアドレスを簡単に調べられる裏ワザがあります。ライントレーサのLEDを例にして解説してみます。
void *po;
po=&P8.DR.BIT;
まず、コンパイルオプションの最適化を切って、void *(ポインタ)型変数を宣言します(volatileだとうまくいかない)。次にP8とかのレジスタのポインタを代入します。
&を付け忘れ無いように注意しましょう。\\
コンパイルしてポインタ変数をウォッチします。\\
{{:ウォッチ4.png|}}\\
po=&P8.DR.BIT.B0
とかやるとエラーになります。
iodefne.hでP8.DR.BYTEがunsigned char型で宣言されているので、poはchar*型の方がいいかもしれません。\\
====== 注意 ======
===== レジスタ =====
* CPUリセットしてもレジスタの値はリセットされません(LEDとかは光ったまま)
*実機では書き込みできないレジスタに書き込めたり、読み出すと実機をシミュで違う値になってたりするので、コードによっては必ず実機と同じ動きをするとは限らないことに注意\\
*例 P8.DDR=0なのにP8.DR.BYTEに代入できる(LED光る)\\
*例 P8.DDRを読むと初期値が0になっている(実機だと常に255が返ってくる)
===== タイマーは使用できない =====
タイマーでグローバル変数を操作しているなら、グローバル変数にアクセスする関数を作って、シミュレータでないときはその関数内で割り込みを実行する等工夫する
====== Tips ======
===== コンフィギュレーション =====
Debug ... シミュレータデバッガのためのデバッグ情報が埋め込まれた大きい実行ファイルができる\\
Release ... シミュレータデバッガのためのデバッグ情報が埋め込まれない、小さい実行ファイルができる
===== ウォッチとかの浮いてる画面はctrlを押しながら移動するとメインのウィンドウに結合されない =====
===== ステップインすると鬱陶しい =====
ステップアウトしましょう。
もしくは、分割コンパイルしているのなら、
{{:デバッグ情報出力.png|}}\\
ビルドオプションで、ステップインしたくない関数のあるファイルを選択し、カテゴリ:オブジェクトで"デバッグ情報出力"のチェックを外し
メニュー=>基本設定=>オプションのデバックで、"デバッグ情報のないアドレスにステップインしない"にチェックしてください。