なんとかなるさね

マイコンをネタにブログを始めてみました


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宣言とアクセスの衝突を防止)することを忘れている、、、)

関連記事

2015/02/02   blog-entry-564   category: RL78 /* 16bit,8bit CISC */

go page top