- ベストアンサー
マイコンSH-2の割り込みを用いたシリアル通信 割り込みがかからない症状に悩んでいます
- マイコンSH-2の割り込みを用いたシリアル通信において、割り込みがかからなくなる症状に悩んでいます。
- 質問者はSH7144Fの開発環境において、割り込みレベルや割り込みマスクの設定を適切に行っているにもかかわらず、受信割り込みがかかった後、一文字受信しただけで割り込みがかからなくなる症状に遭遇しています。
- 質問者は割り込みマスクを0にする手続きを追加すると、割り込みが連続してかかり、正常に受信できるようになることを確認しています。しかし、割り込みが終われば割り込みマスクは元に戻るはずであるため、なぜ明示的に割り込みマスクを0にする必要があるのかについて質問しています。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
ハードウエアマニュアルをよく読めば書いてあるのですが、SHのSSR.RDRFビットをクリアするのは、一度1を読み込んでから0を書く必要があります。 質問文からは、1を読む作業が抜けているように思われます。 set_imask()は、関数呼び出しではなく、インライン展開されるようですが、展開されたものを読んでみても、結果的にLDC命令を使ってSRのIMASK部を書き換えるだけの処理です。 ですから、set_imask(0)を実行した時点で、再びsci割り込みがかかると思いますが、それは新たな受信データを得た訳ではないので、読み出したデータは以前と同じになっているのではないでしょうか。 一方、割り込みからの復帰に使用するRTE命令は、セーブされたSRとPCの値をレジスタに戻すものです。 アセンブラで書いていると、間違ってRTSで戻してしまうことがありますが、この場合はSRの内容うんぬんという以前に、PCの値が変になって暴走するので、すぐにわかります。 Cで書いていればそのような間違いは起きないので、SRの復帰について心配する必要はありません。 ただ、LDCでSRのIMASK部を変えるのと、RTEで変えることに違いが生じているようですが、これは内部割込みのエッジ検出フラグのリセット回路の働きに、なにか違いがあるのかも知れません。
その他の回答 (1)
- KEN_2
- ベストアンサー率59% (930/1576)
SH-2はあまり使いこなしていませんが、SHシリーズと一般の組み込みSOCチップと考え方は同じですので一般論で回答します。 >1.SRレジスタは割り込みが終われば元の内容に戻ると解釈していますが, これで合っているでしょうか いいえ、割り込みが終われは明示的に戻してやらなければなりません。 割り込み処理はハード的にはレジスタの退避をし、次の割り込み連続して受付られませんので、割り込みをマスクします。 割り込み処理のソフト処理が完了したら、元の状態にレジスタ情報を戻して元の処理を継続するために、割り込みマスクを解除するのが定石です。 割り込み処理の完了はソフト側でしか判断出来ないからなのです。 『なぜいちいちset_imask(0)をしてやらないといけない』のが普通です。 SH-2の固有の問題ではなく、マイコン一般の割り込み処理の定石と考えてください。
お礼
ご回答頂きましてありがとうございました.
お礼
ご指摘の通り,1を読み込んでから0を書き込むことで解決致しました. ありがとうございました. 同じことをされている方がネット上に挙げている幾つかのソースを見て, 私のと比較していたのですが,例えば動くものを見ると, while(!SCI0.SSR.BIT.RDRF); c = SCI0.RDR; SCI0.SSR.BIT.RDRF = 0; となっていて,実はwhileの判定で一度リードしていたことに気付きました. これにより原因はご指摘の通りでありまして,そのようにしましたら無事, 問題無く動くようになりました. 大変大変助かりました.ありがとうございました.