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では上記のような関数はリエントラントにはならないのでしょうか?
チョコです。
アセンブラでの動作についてコメントさせてもらいます。
2F25 AEF8 8600 movw ax, sp
2F27 041500 8601 addw ax, #0x0015
でaxはスタック領域のスタックトップから21(0x15)バイト目を指しています。
axがディスティネーション側(転送先)なら,もろにスタック領域を破壊します。
(axが転送元で,スタックに積まれているデータを転送するならわからないではないですが。)
以上