自作関数のリエントラント性について

RL78/G14(R5F104LLAFB#V0)で、C言語の自作関数を使用しておりますが、この関数をメインルーチンと割り込みルーチンの両方で使用しております。

関数内ではグローバル変数を使用しておらず、リエントラントになっていると考えております。

 

void mmcopy( _UBYTE *d5, _UBYTE *s5, _UWORD n)
{ _UWORD i;
for(i=0;i<n;i++)
*(d5+i) = *(s5+i);
}

 

この関数がメインと割り込みで競合した場合、カウンタiはスタック退避されて戻れると認識しておりますが、E1エミュレータを接続し、連続運転していると

RESF=10hのリセットが発生します。OCDトレースを見るとこの関数で無限ループに陥っているように見えます。

RL78では上記のような関数はリエントラントにはならないのでしょうか?

Parents
  • ヒューリステックに話の流れを聞いていると、ノイズというよりもソフトのバグの可能性が高い感触ですね。
    特定の条件で暴走していそうです。
    いい機会なので根本原因を追えるといいですね。

  • Kirinさん

    コメントありがとうございます。
    特定の条件が発生するような外的なイベント要因はありません。
    ちなみにRESF=10h(WDTRF)は、E1エミュレータを接続した状態でのみ発生しております。
    現場で発生しているのはRESF=02H(IAWRF)で、最長で28日、最短で1時間30分で発生しております。
    定常状態の処理で何らかの割り込みのタイミングが重なることはあると思いますが、メインループが24μsで回っているものに対して、最長で28日間起きなかったため、1千億分の1の確率で発生する条件というのが考えられるでしょうか?割り込みはタイマー、A/D変換、UART受信を使用しております。
    ちなみに、静電気試験でリセットが発生することがありましたが、10kVとかなり高い電圧で、発生したときのRESFは80H、04H、02Hでした。
  • > メインループが24μsで回っているものに対して、最長で28日間起きなかったため、1千億分の1の確率で発生する条件というのが考えられるでしょうか?

    メインループだけで動作しているプログラムでもなければ「1千億分の1の確率」に意味はありません。
  • RESF=10h(WDTRF)
    ⇒ウォッチドッグ・タイマ
    RESF=80H(TRAP)
    ⇒不正命令
    RESF=04H(RPERF)
    ⇒RAMパリティ・エラー
    RESF=02H(IAWRF)
    ⇒不正メモリ・アクセス

    がこれまでにあり、

    RESF=01H(LVIRF)
    ⇒電圧検出
    はこれまでになかったということですが、やはりソフトの不具合でプログラムが暴走してる気がします。
Reply
  • RESF=10h(WDTRF)
    ⇒ウォッチドッグ・タイマ
    RESF=80H(TRAP)
    ⇒不正命令
    RESF=04H(RPERF)
    ⇒RAMパリティ・エラー
    RESF=02H(IAWRF)
    ⇒不正メモリ・アクセス

    がこれまでにあり、

    RESF=01H(LVIRF)
    ⇒電圧検出
    はこれまでになかったということですが、やはりソフトの不具合でプログラムが暴走してる気がします。
Children
No Data