carcon999のブログ

12年間Y!ブログの記載を移行しました。電子工作関連の記事が多いです。

Illegal general instructionエラーにはまる

Illegal general instructionエラーがSH2Aで発生しました。
まあ、よくあるのがRAM上に配置されたプログラムを書き換えてしまって、「暴走しちゃったのね~」
とおもい、調べるも・・・・・、ん?問題なんかない。・・・
いつもと違うな?

コメントアウトや、配置の入れ替えなどを行うが、いつも似たような箇所で発生する。
なんだこりゃ?

発生箇所は、
【 if(curvEx > 0.5) 】
や、
【 sqrtf(cpp1_x * cpp1_x + cpp1_y * cpp1_y);】

といった、浮動小数点を扱うところでした。
つまり浮動小数点演算系の何かが影響していることが考えられました。

最近、割り込み処理を追加したところがあったので、そこから呼び出される関数にifuncを追加したところ発生しなくなりました。(一部、付いてない関数を呼び出している箇所が存在した。)

結局悪さをしていたのは、割り込み中から呼び出される関数に、「#pragma ifunc Xxxxxx」を定義してなかったこと。

とりあえず解決したということで。

もし、 Illegal general instructionエラーが発生したら、疑ってみると幸せになれるかもしれませんね。

この浮動小数点の割り込みの件は、Interface8月号のSH-2A/SH2A-FPUプログラミング・テクニックとして詳しく載ってたりしますね。