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が転送元で,スタックに積まれているデータを転送するならわからないではないですが。)
以上
> MTxは配列のため、[]を付けない場合はMTx[0]のアドレスとなるはずと理解しておりますが、アセンブルリストを見るとイミディエイトになっております。 > > 0000659A 300000 18175 movw ax, #LOWW(_MTx) > > これが問題でしょうか? 大域変数は静的に配置されアドレスは直値で参照できるのでそこは問題ないと思います。
fujita nozomuさん
コメントありがとうございます。
だんだんアセンブラも読めるようになってきたのでわかりました。
昨日類似の事象が発生しておりました。
スタック初期化ルーチンを有効にした後、ブレークポイントの設定を変えなかったせいか、おかしなところでブレークが掛かっており、RESFも0でしたが、スタック終了アドレス付近を確認したところ、モニターポート出力(Montx)のメッセージで浸食されておりました。
この関数に問題があるようですが、ある特定の条件がそろわないと発生しないようです。