RAMパリティエラー発生箇所の特定

Kirinさん

現在、RL78での開発をしています。

単体動作でRAMパリティエラーが発生しています。
オンチップデバッグではRAMパリティエラーが発生しないみたいなのでオンチップデバッグによるチェックができません。

何処でRAMパリティエラーが発生しているか確認できる方法はあるのでしょうか?

RAMの初期化は出来ているはずなのですが・・・
Parents
  • スタッフのチョコです。

    Kirin様の「Re9:RAMパリティエラー発生箇所の特定」にコメントさせていただきます。

    >CALL命令は、呼び出し元のアドレスをスタックに退避しますが、
    アドレスは3バイト長なので、消費したスタックの4バイトのうち1バイトが使われていません(SP-1のアドレスが初期化されていない)。
    そのため、RETした時に初期化されていないスタックの1バイトをリードすることでRAMパリティが発生してるのではなかと想像しています。

    _stkinit部分を逆アセンブルして確認したところ,その最初で「MOV [SP+3]\,#0」とやっているので,Kirin様が懸念した問題はございません。(もっとも,それ以前に,このCALLの前にhdwinitから戻ってきているので,この点は問題にはなりません。)以下に逆アセンブルしたものに分岐先がわかるようにしたものを示します。最初に32バイト単位でクリアし,残りは2バイト単位でクリアしています。特に初期化されてないRAMを読み出しているとこはございません。気になる点は,2バイト単位でのクリアを行っている部分の完了チェックです。AXとHLを比較して,「RZ」で抜けるようになっています。つまり,HLの値が奇数に設定されていたら抜けられなくなります。その点から,「LOWW _@STEND 」がきちんと偶数になっているかをご確認ください。(私が確認したRL78/G14(64k品)ではきちんと抜けてきました。

    _stkinit:
    c80300 MOV [SP+3H]\,#0H
    aef8 MOVW AX\,SP
    27 SUBW AX\,HL
    dd3b BZ $_stkinit+0x43
    dc39 BC $_stkinit+0x43
    315e SHRW AX\,5H
    12 MOVW BC\,AX
    f6 CLRW AX
    ;_stkinit+0xe
    43 CMPW AX\,BC
    dd27 BZ $_stkinit+0x38
    bb MOVW [HL]\,AX
    bc02 MOVW [HL+2H]\,AX
    bc04 MOVW [HL+4H]\,AX
    bc06 MOVW [HL+6H]\,AX
    bc08 MOVW [HL+8H]\,AX
    bc0a MOVW [HL+0AH]\,AX
    bc0c MOVW [HL+0CH]\,AX
    bc0e MOVW [HL+0EH]\,AX
    bc10 MOVW [HL+10H]\,AX
    bc12 MOVW [HL+12H]\,AX
    bc14 MOVW [HL+14H]\,AX
    bc16 MOVW [HL+16H]\,AX
    bc18 MOVW [HL+18H]\,AX
    bc1a MOVW [HL+1AH]\,AX
    bc1c MOVW [HL+1CH]\,AX
    bc1e MOVW [HL+1EH]\,AX
    37 XCHW AX\,HL
    042000 ADDW AX\,#20H
    37 XCHW AX\,HL
    b3 DECW BC
    efd6 BR $_stkinit+0xe
    ;_stkinit+0x38
    aef8 MOVW AX\,SP
    47 CMPW AX\,HL
    dd06 BZ $_stkinit+0x43
    f6 CLRW AX
    bb MOVW [HL]\,AX
    a7 INCW HL
    a7 INCW HL
    eff5 BR $_stkinit+0x38
    ;_stkinit+0x43
    d7 RET



Reply
  • スタッフのチョコです。

    Kirin様の「Re9:RAMパリティエラー発生箇所の特定」にコメントさせていただきます。

    >CALL命令は、呼び出し元のアドレスをスタックに退避しますが、
    アドレスは3バイト長なので、消費したスタックの4バイトのうち1バイトが使われていません(SP-1のアドレスが初期化されていない)。
    そのため、RETした時に初期化されていないスタックの1バイトをリードすることでRAMパリティが発生してるのではなかと想像しています。

    _stkinit部分を逆アセンブルして確認したところ,その最初で「MOV [SP+3]\,#0」とやっているので,Kirin様が懸念した問題はございません。(もっとも,それ以前に,このCALLの前にhdwinitから戻ってきているので,この点は問題にはなりません。)以下に逆アセンブルしたものに分岐先がわかるようにしたものを示します。最初に32バイト単位でクリアし,残りは2バイト単位でクリアしています。特に初期化されてないRAMを読み出しているとこはございません。気になる点は,2バイト単位でのクリアを行っている部分の完了チェックです。AXとHLを比較して,「RZ」で抜けるようになっています。つまり,HLの値が奇数に設定されていたら抜けられなくなります。その点から,「LOWW _@STEND 」がきちんと偶数になっているかをご確認ください。(私が確認したRL78/G14(64k品)ではきちんと抜けてきました。

    _stkinit:
    c80300 MOV [SP+3H]\,#0H
    aef8 MOVW AX\,SP
    27 SUBW AX\,HL
    dd3b BZ $_stkinit+0x43
    dc39 BC $_stkinit+0x43
    315e SHRW AX\,5H
    12 MOVW BC\,AX
    f6 CLRW AX
    ;_stkinit+0xe
    43 CMPW AX\,BC
    dd27 BZ $_stkinit+0x38
    bb MOVW [HL]\,AX
    bc02 MOVW [HL+2H]\,AX
    bc04 MOVW [HL+4H]\,AX
    bc06 MOVW [HL+6H]\,AX
    bc08 MOVW [HL+8H]\,AX
    bc0a MOVW [HL+0AH]\,AX
    bc0c MOVW [HL+0CH]\,AX
    bc0e MOVW [HL+0EH]\,AX
    bc10 MOVW [HL+10H]\,AX
    bc12 MOVW [HL+12H]\,AX
    bc14 MOVW [HL+14H]\,AX
    bc16 MOVW [HL+16H]\,AX
    bc18 MOVW [HL+18H]\,AX
    bc1a MOVW [HL+1AH]\,AX
    bc1c MOVW [HL+1CH]\,AX
    bc1e MOVW [HL+1EH]\,AX
    37 XCHW AX\,HL
    042000 ADDW AX\,#20H
    37 XCHW AX\,HL
    b3 DECW BC
    efd6 BR $_stkinit+0xe
    ;_stkinit+0x38
    aef8 MOVW AX\,SP
    47 CMPW AX\,HL
    dd06 BZ $_stkinit+0x43
    f6 CLRW AX
    bb MOVW [HL]\,AX
    a7 INCW HL
    a7 INCW HL
    eff5 BR $_stkinit+0x38
    ;_stkinit+0x43
    d7 RET



Children
No Data