アプリ版:「スタンプのみでお礼する」機能のリリースについて

SH7144Fで割り込みを用いたシリアル通信を行っていますが,
途中で割り込みがかからなくなる症状に悩んでいます.

開発環境はHEW上でツールチェインにRenesas SuparH StandardとKPIT GNUSH [ELF]を
組み込んでおり,適宜選んで使っています.
以下,Renesas SuparH Standardで,受信割り込みの場合に限って書かせて頂きます.

少々長くなりますが状況をご説明致します.

最初にSCI1回りの設定を適切に行い,割り込みレベルを15とした後,
set_imask(0)で割り込みレベルを0として割り込みがかかるようにしています.
受信割り込みがかかるとINT_SCI1_RXI1に飛び,
_UBYTE c = SCI1.RDR;
SCI1.SSR.BIT.RDRF = 0;
と直ちにした後,cの内容をバッファに入れ,戻っていますが,一文字受信しただけで
割り込みがかからなくなります.(_UBYTEはtypedefine.hでunsigned charとしています.)

相当悩んだ挙句,INT_SCI1_RXI1の末尾に,
set_imask(0);
を入れてやると連続して割り込みがかかり,うまく受信できるようになっています.

ハードウェアマニュアルを読めば,割り込みがかかるとSRレジスタは退避され,
SCI1の割り込みレベル15の内容がSRレジスタのI0~I3に書き込まれる,とあります.
当然,割り込みが終われば,退避された内容がSRレジスタに戻るので割り込みマスクは
0に戻るもの・・・と解釈していますが,余りにも当たり前なのかハードウェアマニュアルには
明記はされていません.もしかしたら元に戻っていないのでは・・・と,上記のようにいちいちに
割り込みマスクを0にする手続きを追記すると動いている,と言う状況です.

因みに上記の状況はKPIT GNUSH [ELF]を選んだときにも同じです.
更には,送信割り込みのときも上記と同じくset_imask(0)を入れてやると動きます.

そこで質問ですが,
1.SRレジスタは割り込みが終われば元の内容に戻ると解釈していますが,
  これで合っているでしょうか.
2.上記1で元に戻るのだとしたら,なぜいちいちset_imask(0)をしてやらないといけない
  状況になっているのか・・・考えられる原因をお教えください.

雑多な説明で申し訳ございませんが,どうぞ宜しくお願い致します.<(__)>

A 回答 (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で変えることに違いが生じているようですが、これは内部割込みのエッジ検出フラグのリセット回路の働きに、なにか違いがあるのかも知れません。
    • good
    • 0
この回答へのお礼

ご指摘の通り,1を読み込んでから0を書き込むことで解決致しました.
ありがとうございました.

同じことをされている方がネット上に挙げている幾つかのソースを見て,
私のと比較していたのですが,例えば動くものを見ると,

while(!SCI0.SSR.BIT.RDRF);
c = SCI0.RDR;
SCI0.SSR.BIT.RDRF = 0;

となっていて,実はwhileの判定で一度リードしていたことに気付きました.
これにより原因はご指摘の通りでありまして,そのようにしましたら無事,
問題無く動くようになりました.

大変大変助かりました.ありがとうございました.

お礼日時:2011/11/25 19:59

SH-2はあまり使いこなしていませんが、SHシリーズと一般の組み込みSOCチップと考え方は同じですので一般論で回答します。



>1.SRレジスタは割り込みが終われば元の内容に戻ると解釈していますが,
  これで合っているでしょうか
 いいえ、割り込みが終われは明示的に戻してやらなければなりません。
割り込み処理はハード的にはレジスタの退避をし、次の割り込み連続して受付られませんので、割り込みをマスクします。
割り込み処理のソフト処理が完了したら、元の状態にレジスタ情報を戻して元の処理を継続するために、割り込みマスクを解除するのが定石です。
割り込み処理の完了はソフト側でしか判断出来ないからなのです。

『なぜいちいちset_imask(0)をしてやらないといけない』のが普通です。
SH-2の固有の問題ではなく、マイコン一般の割り込み処理の定石と考えてください。
 
    • good
    • 0
この回答へのお礼

ご回答頂きましてありがとうございました.

お礼日時:2011/11/25 19:56

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!