非常に初歩的な質問になりますが、どなたかご教示ください。
SH7216のマイコンを使用しています。
・Illegal Codeという例外はどのような場合に発生するのでしょうか?
(ベクタテーブル4に元から定義されているようでした)
わわいです
そこらへんはCPUのマニュアルをみれば書いてあるかと。
簡単に言えば、未定義の命令を実行した場合に発動される例外ですね。
CPUが暴走した場合なんかによくお目にかかれます
わわいさん、ありがとうございます。
SH7216グループのマニュアルでIllegal Codeで検索しても出てこなかったのですが
マニュアルに「一般不当命令」というものなら載っていたのでそれでしょうか?
この例外が発生するようになったのは、マイコンでシリアル通信をさせようとしたときです。
調歩同期のシリアル通信で、受信データフル割り込み(RXI割り込み)を有効にして、その割り込み処理にて
1Byteずつ受信する(レシーブデータレジスタからデータ読出し)という処理を行っています。
他にも、コンペアマッチタイマを二種類有効にしていますが、
RXI割り込みを優先度最高にしています。
この状況で本例外が起きる要因として、
何か思いつくものがありましたらご教示頂けると幸いです。
そういうトラブルが有るなら、まずそれを聞きましょう。こんな二度手間をかけることはなくなります。
これが出るのは、ジャンプ先が間違ってる場合です
割り込みでそれが出るのであれば、割り込みのアドレスは合ってるのか、割り込み番号はあってるのか、ベクタテーブルのアドレス設定は正常に行われているのか、をチェックしましょう
コードを見て合ってる、ってのではダメです
実際に初期化が終わったときにブレークポイントを設定して実際にレジスタの値をチェック、メモリ内容を読み出して想定された値になってるのか、をチェックしましょう。
失礼しました。
ちなみに、シリアルの受信処理は、連続で複数バイト受信させたりすることも
(毎回ではないですが)できています。
受信割り込みの関数自体はコールされています。
ただ、何度か受信処理を実行させていると他のコンペアマッチタイマ割り込みも受信割り込みも
発生しなくなりIllegalCodeの例外処理にとんできているようでした。
ならあとは、どこかで配列の範囲外アクセスなどで、異常アクセスが発生している、ってことですね。
どこかで書き換えてはいけないところが書き換わってます
こればっかしは赤の他人がどーこー言っても始まりませんので、デバッグを頑張りましょう
山本です。わわいさんとのやりとりを参考に私ならチェックする点です。・配列のアクセス違反していませんか?確保した範囲を超えているとかです。
・自動変数で確保した配列に対してデータ取得の領域を用意するような実装をしていませんか?コンパイラの最適化オプションによっては変数のスコープが有効範囲だったとしてもポインタ渡しにしても、元の変数のスタックが開放されたりします。
・ちゃんと割り込みハンドラの終了部分は割り込みハンドラから復帰用のRTE命令になっていますか?
わわいさん、山本さん
ご回答ありがとうございます。
受信割り込みハンドラ内を確認しましたが、
・配列アクセスは大丈夫そうです。
・二番目については、たとえば自動変数で確保した配列のポインタを受け取って
データの格納をしたりする関数などはないか?ということですか?
そのような処理はしてないです。
・シリアル通信の受信割り込みハンドラは終了部分で、SCSSR(ステータスレジスタ)の
RDRF(受信データフル)ビットを0に落とすだけで良いと思っています。
三点目のRTE命令の件は、受信割り込みの終了時、RDRFビット以外に何か操作しなければ
いけないのに漏れている可能性も考え、マニュアルを探しましたが、今のところ
特に有効な情報は見つけられませんでした。
コンパイルされたバイナリに割り込みハンドラから戻るときにRTE命令が生成されているか?という話です。通常の関数からの戻りにはRTSを使いますが、割り込みから戻る場合はRTEが使用されます。
受信割り込みや、コンペアマッチタイマ割り込みハンドラの実行中にデバッガで止めて
逆アセンブリを見てみたのですが
RTE命令は実行されているようでした。