
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)をしてやらないといけない
状況になっているのか・・・考えられる原因をお教えください.
雑多な説明で申し訳ございませんが,どうぞ宜しくお願い致します.<(__)>
No.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を読み込んでから0を書き込むことで解決致しました.
ありがとうございました.
同じことをされている方がネット上に挙げている幾つかのソースを見て,
私のと比較していたのですが,例えば動くものを見ると,
while(!SCI0.SSR.BIT.RDRF);
c = SCI0.RDR;
SCI0.SSR.BIT.RDRF = 0;
となっていて,実はwhileの判定で一度リードしていたことに気付きました.
これにより原因はご指摘の通りでありまして,そのようにしましたら無事,
問題無く動くようになりました.
大変大変助かりました.ありがとうございました.
No.1
- 回答日時:
SH-2はあまり使いこなしていませんが、SHシリーズと一般の組み込みSOCチップと考え方は同じですので一般論で回答します。
>1.SRレジスタは割り込みが終われば元の内容に戻ると解釈していますが,
これで合っているでしょうか
いいえ、割り込みが終われは明示的に戻してやらなければなりません。
割り込み処理はハード的にはレジスタの退避をし、次の割り込み連続して受付られませんので、割り込みをマスクします。
割り込み処理のソフト処理が完了したら、元の状態にレジスタ情報を戻して元の処理を継続するために、割り込みマスクを解除するのが定石です。
割り込み処理の完了はソフト側でしか判断出来ないからなのです。
『なぜいちいちset_imask(0)をしてやらないといけない』のが普通です。
SH-2の固有の問題ではなく、マイコン一般の割り込み処理の定石と考えてください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 簿記検定・漢字検定・秘書検定 日商簿記2級の商業簿記の新株発行(増資)について質問です。 今、日商簿記2級の受けようと独学で宅建勉 1 2022/07/30 09:45
- その他(パソコン・スマホ・電化製品) ソフトバンクのオンラインショップの予約商品について 予約した日時はこれです 2023年01月16日 2 2023/01/20 08:27
- リフォーム・リノベーション 汚水枡改修工事の見積額は妥当でしょうか? 2 2022/06/30 09:01
- C言語・C++・C# pythonのファイルの並びでの読み込みとリストについて 4 2022/04/13 03:52
- 郵便・宅配 クロネコヤマトについて、持ち込み発送を簡単に済ませるには?(集荷と比べて面倒) 3 2023/02/08 23:58
- 銀行・ネットバンキング・信用金庫 「銀行 窓口」での「振り込み」のやり方を教えて下さい。現金17万円を「りそな銀行」から「みずほ銀行」 4 2022/10/29 12:47
- 電車・路線・地下鉄 大阪ですが、バス停で並んでいる人がいるのに横からスッと割り込みするマナーない女性や小汚い男性が多いで 7 2023/06/02 17:39
- 運転免許・教習所 左折の時に対向車が居ないならセンターライン割ってもいいですよね? 9 2022/12/28 14:58
- SoftBank(ソフトバンク) ソフトバンクエア 5 2022/08/26 13:32
- 格安スマホ・SIMフリースマホ uqモバイル使用の方、割引の仕組みに詳しい方、教えてください・・ 2 2023/04/24 15:04
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
AWTのList仕様の可能、不可能に...
-
コンピュータ/OS の原理を知る...
-
PIC(MOVFで何故、STATUS Zフラ...
-
割り込み?
-
SH2 (SH7144)のソフトウェアス...
-
PIC18F14K50でmain処理が動作し...
-
割り込みの入り方。考え方。
-
マイコン C言語 割り込み処理...
-
PICマイコンでエンコーダパルス...
-
Excelでタイマーの一時停止する...
-
電車で待機列の割り込みについ...
-
メルコの無線LANで割り込み...
-
PIC16F84AのRBポート変化割り込...
-
組込み系プログラマに必要なハ...
-
正確な1msecのタイマ割込
-
システムの割り込みについて シ...
-
Macターミナルで実行中のプログ...
-
メモリのセグメント違反の解決...
-
TCP/IP通信時のサーバーからの受信
-
バックグラウンドのプロセスの...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
電車で待機列の割り込みについ...
-
スーパーのレジで並んでいたら...
-
CPU負荷率の安全な上限と計...
-
マイコン C言語 割り込み処理...
-
このレジの並び方は間違ってま...
-
USB機器からのデータ受信による...
-
【組込み】割り込み中のstatic...
-
VB6でSendKeyを利用したTab移動...
-
一定時間操作がなかったら、と...
-
VB.NET スレッドからのイベント...
-
irqbalance って
-
ウォッチドッグタイマ(WDT)の...
-
Timerコントロールによる動作の...
-
pic 複数の割り込み関数 切り分...
-
マイコンSH-2の割り込みを用い...
-
Amazonfireタブレットにわから...
-
STATUSのZフラグについて
-
マイコンの割り込みについて教...
-
Timerコンポーネントのインター...
-
電車乗車時、並んでいるのに割...
おすすめ情報