RL78マイコン|プログラムが変なところでブレークした時にどこまでデバッグ出来るか? (1)
前のエントリでプログラムが変なところでブレークしてしまうトレースデータ(というかプログラム)を作って
みたのですが、シミュレータではなく実際のマイコンでデバッグしていてトレース機能が使えない場合には、
どこから飛んで来たのか(どのあたりまで正常に実行されていたのか)を知ることが出来ません。何か手は無い
ものかと考えて、まずは、PC(プログラムカウンタ)の値を取得するアセンブラコードとreturn文に細工する
ちょっと強引なマクロを書いてみました。(実地でも思惑通りに行くかどうかは後で考えることにして。それと
コードサイズや実行クロック数についても後で考えることにして。)
return文に細工するちょっと強引なマクロ
__far void (*tracking_pc_val)(void);
__far void * __far getPC(void);
#define return tracking_pc_val = getPC(); return
PC(プログラムカウンタ)の値を取得するアセンブラコード
; This code is in the public domain. You may use, modify or distribute it freely.
PUBLIC _getPC
_getPC: ;__far void * __far getPC(void), return value : address of "getPC();"
MOVW AX, [sp+0]
SUBW AX, #4 ; 4 = opcode size of "call !!_getPC"
MOVW BC, AX
MOVW AX, [sp+2]
SKNC ; CY = borrow of (LOWORD(adress of "call !!_getPC") - 4)
DECW AX
MOVW DE, AX
RET ; DE:BC = return value (address of "call !!_getPC")
END
なお、マクロがちょっと強引ですのでコンパイル時には以下のようなワーニングメッセージが表示されます。
CC78K0R warning W0825: Macro recursion 'return'

このプログラムを実行すると以下のようにreturn文の先頭アドレスが変数tracking_pc_valに格納されます。


また、プログラムが変なところでブレークした場合には最後に実行したreturn文(ただしRET命令は未実行)の
先頭アドレスが変数tracking_pc_valに格納されていることになります。(実地でも思惑通りに行くかどうかは
後で考えることにします。それとコードサイズや実行クロック数についても後で考えることにします。まずは、
試してみました、というところです。)

追記 : 補足
割り込み処理内でのreturn文にもマクロが作用することを考えると、このままではちょっとまずいような、、、
(つまりtracking_pc_valをvolatile変数扱い(volatile宣言とアクセスの衝突を防止)することを忘れている、、、)
みたのですが、シミュレータではなく実際のマイコンでデバッグしていてトレース機能が使えない場合には、
どこから飛んで来たのか(どのあたりまで正常に実行されていたのか)を知ることが出来ません。何か手は無い
ものかと考えて、まずは、PC(プログラムカウンタ)の値を取得するアセンブラコードとreturn文に細工する
ちょっと強引なマクロを書いてみました。(実地でも思惑通りに行くかどうかは後で考えることにして。それと
コードサイズや実行クロック数についても後で考えることにして。)
return文に細工するちょっと強引なマクロ
__far void (*tracking_pc_val)(void);
__far void * __far getPC(void);
#define return tracking_pc_val = getPC(); return
PC(プログラムカウンタ)の値を取得するアセンブラコード
; This code is in the public domain. You may use, modify or distribute it freely.
PUBLIC _getPC
_getPC: ;__far void * __far getPC(void), return value : address of "getPC();"
MOVW AX, [sp+0]
SUBW AX, #4 ; 4 = opcode size of "call !!_getPC"
MOVW BC, AX
MOVW AX, [sp+2]
SKNC ; CY = borrow of (LOWORD(adress of "call !!_getPC") - 4)
DECW AX
MOVW DE, AX
RET ; DE:BC = return value (address of "call !!_getPC")
END
なお、マクロがちょっと強引ですのでコンパイル時には以下のようなワーニングメッセージが表示されます。
CC78K0R warning W0825: Macro recursion 'return'

このプログラムを実行すると以下のようにreturn文の先頭アドレスが変数tracking_pc_valに格納されます。


また、プログラムが変なところでブレークした場合には最後に実行したreturn文(ただしRET命令は未実行)の
先頭アドレスが変数tracking_pc_valに格納されていることになります。(実地でも思惑通りに行くかどうかは
後で考えることにします。それとコードサイズや実行クロック数についても後で考えることにします。まずは、
試してみました、というところです。)

追記 : 補足
割り込み処理内でのreturn文にもマクロが作用することを考えると、このままではちょっとまずいような、、、
(つまりtracking_pc_valをvolatile変数扱い(volatile宣言とアクセスの衝突を防止)することを忘れている、、、)
- 関連記事
-
- RL78マイコン(RL78/G10)|スタートアップルーチンを拡張子が.cのソースに書いてみる (1)
- RL78マイコン|スタック使用量を測る古典的(?)やり方を試してみた
- RL78マイコン|プログラムが変なところでブレークした時にどこまでデバッグ出来るか? (5)
- RL78マイコン|フルスペックエミュレータ(IECUBE)の価格
- RL78マイコン|プログラムが変なところでブレークした時にどこまでデバッグ出来るか? (4)
- RL78マイコン|プログラムが変なところでブレークした時にどこまでデバッグ出来るか? (3)
- RL78マイコン|プログラムが変なところでブレークした時にどこまでデバッグ出来るか? (2)
- RL78マイコン|プログラムが変なところでブレークした時にどこまでデバッグ出来るか? (1)
- RL78マイコン|プログラムが変なところでブレークする様子をシミュレータで見てみた
- RL78マイコン|volatile変数アクセスの衝突防止(結局はDI/EIですが) (2)
- RL78マイコン|KURUMIスケッチ環境でのvolatile変数アクセスの衝突防止の実装 → 無かった
- RL78マイコン|本家Arduinoライブラリでのvolatile変数アクセスの衝突防止の実装
- RL78マイコン|volatile変数アクセスの衝突防止(結局はDI/EIですが) (1)
- RL78マイコン|32bit変数へのアクセスはアトミックじゃない
- RL78マイコン(G12,G13,G14)|CS+(CubeSuite+)でインターバルタイマシミュレーションを試す
2015/02/02 blog-entry-564 category: RL78 /* 16bit,8bit CISC */
| h o m e |