RL78マイコン|プログラムが変なところでブレークする様子をシミュレータで見てみた
以前のエントリで上位16bitリードと下位16bitリードの隙間で割り込みが発生して割り込み処理でリード途中の
32bit全体のインクリメントが行われてしまうトレースデータを作ってみたのですが、今度はプログラムが変な
ところでブレークしてしまうトレースデータを作ってみました。試したプログラムは以下の通りです。
void main(void)
{
R_MAIN_UserInit();
/* Start user code. Do not edit comment generated here */
NOP();
/* End user code. Do not edit comment generated here */
}
void R_MAIN_UserInit(void)
{
/* Start user code. Do not edit comment generated here */
int var[2];
int i;
for ( i = 0; i < 5; i++ )
{
var[i] = 0x5555;
}
return;
/* End user code. Do not edit comment generated here */
}

このプログラムを実行すると以下のように変なところでシミュレーションが停止します。

トレースデータは以下の通りです。プログラムでスタック上のリターンアドレスのデータ(0xffed8~0xffedb)を
破壊してしまっていますので、RET命令を実行したとたんにプログラムが変なところへ飛んで行きます。

なお、スタック上のリターンアドレスのデータ(0xffed8~0xffedb)を破壊している様子は以下の通りです。


もう1つプログラムを試してみました。試したプログラムは以下の通りです。
void main(void)
{
R_MAIN_UserInit();
/* Start user code. Do not edit comment generated here */
for (;;)
{
void (*fnp)(void);
int var[2];
int i;
*fnp = R_MAIN_UserInit;
for ( i = 0; i < 4; i++ )
{
var[i] = 0x5555;
}
(*fnp)();
NOP();
}
/* End user code. Do not edit comment generated here */
}
void R_MAIN_UserInit(void)
{
/* Start user code. Do not edit comment generated here */
return;
/* End user code. Do not edit comment generated here */
}

このプログラムも実行すると以下のように変なところでシミュレーションが停止します。

トレースデータは以下の通りです。プログラムでスタック上の関数ポインタのデータ(0xffed6~0xffed8)を破壊
してしまっていますので、関数呼び出しを実行したとたんにプログラムが変なところへ飛んで行きます。

なお、スタック上の関数ポインタのデータ(0xffed6~0xffed8)を破壊している様子は以下の通りです。


ちなみに、内蔵ROMサイズが64Kバイト以上の場合の関数ポインタはfarポインタですが、farポインタ変数の
アクセスはアトミックじゃないです。ですので、割り込み処理でfarポインタを書き換えて通常処理で読み出し
たり逆に通常処理でfarポインタを書き換えて割り込み処理で読み出したりするプログラムでは、アクセスの
衝突を防止するようにしないと危ないです。
32bit全体のインクリメントが行われてしまうトレースデータを作ってみたのですが、今度はプログラムが変な
ところでブレークしてしまうトレースデータを作ってみました。試したプログラムは以下の通りです。
void main(void)
{
R_MAIN_UserInit();
/* Start user code. Do not edit comment generated here */
NOP();
/* End user code. Do not edit comment generated here */
}
void R_MAIN_UserInit(void)
{
/* Start user code. Do not edit comment generated here */
int var[2];
int i;
for ( i = 0; i < 5; i++ )
{
var[i] = 0x5555;
}
return;
/* End user code. Do not edit comment generated here */
}

このプログラムを実行すると以下のように変なところでシミュレーションが停止します。

トレースデータは以下の通りです。プログラムでスタック上のリターンアドレスのデータ(0xffed8~0xffedb)を
破壊してしまっていますので、RET命令を実行したとたんにプログラムが変なところへ飛んで行きます。

なお、スタック上のリターンアドレスのデータ(0xffed8~0xffedb)を破壊している様子は以下の通りです。


もう1つプログラムを試してみました。試したプログラムは以下の通りです。
void main(void)
{
R_MAIN_UserInit();
/* Start user code. Do not edit comment generated here */
for (;;)
{
void (*fnp)(void);
int var[2];
int i;
*fnp = R_MAIN_UserInit;
for ( i = 0; i < 4; i++ )
{
var[i] = 0x5555;
}
(*fnp)();
NOP();
}
/* End user code. Do not edit comment generated here */
}
void R_MAIN_UserInit(void)
{
/* Start user code. Do not edit comment generated here */
return;
/* End user code. Do not edit comment generated here */
}

このプログラムも実行すると以下のように変なところでシミュレーションが停止します。

トレースデータは以下の通りです。プログラムでスタック上の関数ポインタのデータ(0xffed6~0xffed8)を破壊
してしまっていますので、関数呼び出しを実行したとたんにプログラムが変なところへ飛んで行きます。

なお、スタック上の関数ポインタのデータ(0xffed6~0xffed8)を破壊している様子は以下の通りです。


ちなみに、内蔵ROMサイズが64Kバイト以上の場合の関数ポインタはfarポインタですが、farポインタ変数の
アクセスはアトミックじゃないです。ですので、割り込み処理でfarポインタを書き換えて通常処理で読み出し
たり逆に通常処理でfarポインタを書き換えて割り込み処理で読み出したりするプログラムでは、アクセスの
衝突を防止するようにしないと危ないです。
- 関連記事
-
- RL78マイコン|スタック使用量を測る古典的(?)やり方を試してみた
- RL78マイコン|プログラムが変なところでブレークした時にどこまでデバッグ出来るか? (5)
- RL78マイコン|フルスペックエミュレータ(IECUBE)の価格
- RL78マイコン|プログラムが変なところでブレークした時にどこまでデバッグ出来るか? (4)
- RL78マイコン|プログラムが変なところでブレークした時にどこまでデバッグ出来るか? (3)
- RL78マイコン|プログラムが変なところでブレークした時にどこまでデバッグ出来るか? (2)
- RL78マイコン|プログラムが変なところでブレークした時にどこまでデバッグ出来るか? (1)
- RL78マイコン|プログラムが変なところでブレークする様子をシミュレータで見てみた
- RL78マイコン|volatile変数アクセスの衝突防止(結局はDI/EIですが) (2)
- RL78マイコン|KURUMIスケッチ環境でのvolatile変数アクセスの衝突防止の実装 → 無かった
- RL78マイコン|本家Arduinoライブラリでのvolatile変数アクセスの衝突防止の実装
- RL78マイコン|volatile変数アクセスの衝突防止(結局はDI/EIですが) (1)
- RL78マイコン|32bit変数へのアクセスはアトミックじゃない
- RL78マイコン(G12,G13,G14)|CS+(CubeSuite+)でインターバルタイマシミュレーションを試す
- RL78マイコン基板(RL78/G10)|CS+(CubeSuite+)で内蔵周辺機能シミュレーションを試す (3)
2015/02/01 blog-entry-563 category: RL78 /* 16bit,8bit CISC */
| h o m e |