お世話になります。
問い合わせの現象はとしては、外部のINT信号なし、IRQ0フラグは0という状態でもベクタテーブルからIRQ0割り込みが不定期にコールされることです。INT信号、IRQ0フラグの状態はオシロスコープで確認済です。
システムの仕様は、外部デバイス(バス接続)からのINT信号を/IRQ0 I/Oに入れ、それを契機にIRQ0割り込みを発生させています。また、他の割り込みについては、MTUのタイマ割り込みを使用しており、それ以外の割り込みは使用していません。MTUのタイマ割り込みでIRQ0割り込みが呼ばれていないことは確認しています。同じようは現象を経験された方、回避方法などご教示お願い致します。
TCB said:外部のINT信号なし、IRQ0フラグは0という状態でもベクタテーブルからIRQ0割り込みが不定期にコールされる
//割り込み禁止 set_fpscr(FPSCR_Init);
でも禁止できませんか?
IKUZO様
早速のご回答ありがとうございます。
set_imask(0xF)で割り込み禁止をすると、割り込みが入らなくなることは確認できています。
今回は、割り込みは常時受け付けたままで、現象を回避したいです。
何かご存知でしたら、ご教授いただけますと幸いです。
TCB said:set_imask(0xF)で割り込み禁止をすると、割り込みが入らなくなる
割り込みの設定はレベルですか?Hiエッジ?Lowエッジ?端子状態は常時Hi?これらの設定状況と割り込みステータスフラグがクリアされているかどうかと関係します、割り込みレジスタがどうなっているのか調べます、起動時に割り込み端子が不安定で割り込みが残留しているようなことはありませんか?プログラムの中で割り込み許可フラグを有効にしている箇所があるかもしれません、全てのIRQ0の設定をコメントアウトしてみてください、IRQ0と思っていたのが実際はIRQ1だったというようなことはありませんか?
上記回答いたします。
hanswurst said:割り込みの設定はレベルですか?Hiエッジ?Lowエッジ?端子状態は常時Hi?
割り込みの設定はLowエッジで、端子はHigh固定であることを確認しています。
hanswurst said:起動時に割り込み端子が不安定で割り込みが残留しているようなことはありませんか?
安定動作時に、不定期にIRQ0割り込みが呼ばれています。
hanswurst said:プログラムの中で割り込み許可フラグを有効にしている箇所があるかもしれません、全てのIRQ0の設定をコメントアウトしてみてください、IRQ0と思っていたのが実際はIRQ1だったというようなことはありませんか?
IRQ0に関して、割り込み許可フラグはなく、以下の設定を確認しています。
・PFCでIRQ0入力になっていること
・IRQ0の割り込み優先レベルが1であること
IRQ0割り込みが入ると、SRレジスタのIビットが1になること
・IRQ1-7の割り込み優先レベルが0(不使用)であること
よろしくお願いいたします。
TCB said:IRQ0割り込みが入ると、SRレジスタのIビットが1になること
ということはmain関数の最初のところではSRレジスタのIビットが0であるが
何かの理由で割り込みが入り1になるということですね
今開発されているSH7216ボードは手製ですか?購入品ですか?
もし手製であるならIRQ0入力端子の半田不良ではないですか?
可能であればSH7216も交換してやってみてはどうですか?
hanswurst said:ということはmain関数の最初のところではSRレジスタのIビットが0であるが 何かの理由で割り込みが入り1になるということですね
はい。仰る通りです。
hanswurst said:今開発されているSH7216ボードは手製ですか?購入品ですか?
手製ですが、半田不良は考えられない状況です。(実績のある基板のため)
H/W要因ではない場合、今回投稿させて頂いたような事例のご経験はないでしょうか?
※よく聞く”割り込みが入らない”というQA話はありますが、不定期に割り込みが入るは聞いたことがないため。。。
TCB said:不定期に割り込みが入るは聞いたことがないため
全くそのとうりです、ノンマスカブルでないのに禁止して割り込みが入るというのは史上初めてです、わたくしの経験ではハードウェアかCPUのバグ等と決めつけ、サポートに何回も苦情を言い1年ぐらい経ってソースをよく見るとプログラムの端の解りにくいところで不定期にポートをドライブしていたなんてことがありました、一度全部プロジェクトをクリアしてLEDチカぐらいにしてテストすることをお勧めします、それでもおかしいならサポートに試作ボードを送付してみてもらってください。
追記です:コンパイラーが不正な命令を生成することがあるので最適化OFFにしてアライメントは間違えないでください
hanswurst said:全くそのとうりです、ノンマスカブルでないのに禁止して割り込みが入るというのは史上初めてです、
こちらについては前段で申し上げた通り、set_imask(0xF)で割り込み禁止にすると、割り込みは入りません。
hanswurst said:一度全部プロジェクトをクリアしてLEDチカぐらいにしてテストすることをお勧めします
本調査用に、機能をシュリンク(main内ループとIRQ0用割り込み処理)したテストアプリにしていますが、そのテスト環境で本事象が発生しています。
TCB said:そのテスト環境で本事象が発生
ということですよね、その前に
まず確認したいと思っているのが
オシロスコープで確認済みとのことですが、
まさかアナログオシロではないですよね、
デジタルオシロで正確にトリガをかけて観測されてますよね?
可能であれば+3.3Vに固定しましょう、デバイスを切り離し+3.3Vにする
これができれば一つの疑問点は取り除かれます
これをやっていただいて、次はソフトの不都合個所の切り分けです
TCB said:IRQ0用割り込み処理)したテスト
その部分ですがモジュール単位(c++であればクラス分け)で作成されていれば
怪しいところのモジュールをコメントアウトして
症状が改善されるのか見たら良いです
そもそもソースコードが短時間で検証できないほど膨大なのでしょうか?
追記:
TCB said:外部のINT信号なし、IRQ0フラグは0という状態でもベクタテーブルからIRQ0割り込みが不定期にコール
IRQフラグは0という状態でも
1.この意味は割り込み禁止してもという意味か?
INTC.IPRレジスタで禁止
2.割り込みステータスが0になっているのにコールされるのか?
本人はベクタからコールされていると述べているが、他の個所からコールしているのでは?
hanswurst said:デジタルオシロで正確にトリガをかけて観測されてますよね?
デジタルオシロでトリガをかけて観測しています。
hanswurst said:その部分ですがモジュール単位(c++であればクラス分け)で作成されていれば 怪しいところのモジュールをコメントアウトして 症状が改善されるのか見たら良いです そもそもソースコードが短時間で検証できないほど膨大なのでしょうか?
外部デバイスの特定アドレスAをリード後、特定アドレスBをライトした際に、不定期で現象が発生するというところまでは絞れています。
外部デバイスからINT信号が入っていない、かつ、CPUのステータスとしては割り込みが発生していないのに、割り込みが発生する理由が不明です。
hanswurst said:IRQフラグは0という状態でも 1.この意味は割り込み禁止してもという意味か? INTC.IPRレジスタで禁止 2.割り込みステータスが0になっているのにコールされるのか? 本人はベクタからコールされていると述べているが、他の個所からコールしているのでは?
IRQ0フラグは、INTC.IRQRRレジスタのIRQ0Fビットのことを指しています。先のコメントに記載したset_imask(0xF)で割り込み禁止にして、割り込みが入らないことを確認しています。また、INTC.IPRレジスタの設定を0にしても確認しましたが、割り込みは入りませんでした。