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では上記のような関数はリエントラントにはならないのでしょうか?
Hosさん、こんにちは。
コメントありがとうございます。
スタック見積ツールCall Walkerでの使用量は(272)となっております。一方、mapファイルからは40,428Byteのスタック領域が確保されております。Call Walkerでは静的な最大量しか考慮されていないので、多重割り込みなどによる動的な最大量は考慮されておりませんが、約150倍の領域が確保されているので十分と考えました。
しかし、RESF=10Hの発生時に採取したスタック領域の内容を見ると、UART経由で出力しているデバッグ用モニターポートの出力情報が判読できる形で残っております。
プログラム上の何らかのバグでスタック領域がポップされないまま浸食され続けているのではないかと考えられます。
何とか少しヒントが得られたような気がします。
コメント頂いた皆様ありがとうございました。
チョコです。
アセンブラでの動作についてコメントさせてもらいます。
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) > > これが問題でしょうか? 大域変数は静的に配置されアドレスは直値で参照できるのでそこは問題ないと思います。