日に新た

「素直な心で日々を新しく生きたい」・・・
と願ってますが、頭でわかっていてもなかなか行動できてないものですね・・・

割込み処理

2007年12月27日 17時04分33秒 | ハードウェア開発
2007年ももうすぐ終わろうとしていますが、
2001年(5年前?)に設計した基板の割込み処理がトラブルの原因となっていたようです。

割込み処理には、レベル割込みとエッジ割込みの2通りの検出方法があります。
どちらも一長一短あります。
今回は、エッジ割込みを採用して失敗しました。
システムが止まるので、取りこぼしが発生しています。

エッジ割込みは、複数の割込みを処理する場合に要因が発生した時点で、
プロセッサに割り込みをかけるので、出来るだけ早く処理をしたい場合や、
複数の割込み処理の優先順位を意識しなくて済むとか、
割込みのイベントが保持されていなくても良いと言う利点があります。
しかし発生した瞬間の一度しか割込みが掛からないので、
複数が全く同時だった場合取りこぼす可能性があります。
また、瞬間的なパルス信号の場合が多いので、割込みコントローラが検出できないほど
一瞬の割り込みパルスだった場合、これまた割り込みを取りこぼします。

レベル割込みは、割り込みの要因が解除されるまで割り込みをプロセッサに通知し続けます。
割込み要因が処理されるまで保持されるシステムに向いています。
要因が瞬間ではなく持続されるので、プロセッサが確実に割り込みを検出して、確実に処理をするので取りこぼしがありません。
しかし外部の割り込みの要因が解除されるまで、何度も割り込みが掛かる可能性があります。
複数の要因で割り込みが発生した場合、プロセッサが割込み処理を連続して行うことになります。
(一度処理をして、抜けたら、また割込み処理・・・・って具合。)
プログラムの処理手順をしっかりと考えて作りこむ必要があります。

IDT社のデュアルポートRAMを使って、2つのサブシステム間通信の回路を
作ったのですが、エッジ割込みだと取りこぼすタイミングが有ると言う事が判りました。
5年もの間見つからなかったバグ(というか問題?)が今になってやっと見つかるとは・・・。

設計するときはホントに色々な事を検証しておかなければいけませんね。
5年前・・・そういえば、結婚前で浮かれていたという話もあります。(ォィ

最新の画像もっと見る

4 コメント

コメント日が  古い順  |   新しい順
Unknown (わぼ)
2007-12-27 21:17:06
結婚が5年前。もうずいぶん経ちますねぇ。
組み込みシステムの割り込みをエッジにするのかレベルにするのかについて、昔、現行システムの設計を開始したときに悩みましたが、リアルタイム処理の場合、結局どうしてもこの取りこぼしが怖くてほとんどレベルにしたのを思い出しました。

元々、アセンブラ屋でして、昔はもっと簡単で「割り込みが発生したのはその行」というトレースができたんですが、今のシステムだと割り込み事象の発生とメモリのプリフェッチを考慮しないといけない、なんていうところに結構苦しんだですね。結局、割り込み禁止の関数はアセンブラで直接書いてレベルの多重検出を防いだ、なんてことを思い出します。

でもプロセッサ周辺のプリフェッチ回路が、割り込み発生時にプリフェッチ分を忘れてしまい、割り込み処理後に戻った時に本来実行されるべき命令が解釈不能になり暴走、という不具合がすごく面倒だったな、と(遠い目)
おひさしぶりです! (kame)
2007-12-30 13:04:27
ごぶさたしております。>たいちょ
アセンブラ屋さんのお言葉を頂くと、非常に心強いです。

私はレベル処理だと、多重割込みによるオーバーヘッドが怖くて、
どうしてもエッジ割込みに頼りがちです。(汗

年明け早々ソフトもハードも修正しにいくので、
また埼玉通いがつづきまする。(汗
Unknown (わぼ)
2007-12-31 10:07:36
私と逆かもしれないですね。
エッジ割り込みはレベルに比べるとノイズやチャタリングに弱い(レベルだったら大丈夫かというとそうでもないですが)ところがありますので、私はレベルの方が好きです。
ノイズによるエッジ割り込みの誤検出が不具合として発生すると、これまた追いにくいというか、「非再現」になりがちでして。

エッジ割り込みに対する対ノイズ処理部分と、多重割り込み対応によるオーバヘッド増加部分のどっちを選ぶかってところですかね。
ありがとうございます!>たいちょ (kame)
2008-01-08 12:08:14
隊長のお言葉で、レベル割り込みに変える自信が沸きました。
で、現在レベルに変えるための作業をやっております。

色々やってると、根本的原因にまた1つ近づきました。

どうやら、PowerON時に割込みが入るのですが、アプリ起動時にLinuxのドライバでボードのソフトリセットが正しく動作しない時があり、
割り込みが最初から2本同時に入りっぱなしで割込みマスクを解除した時にPriorityが低い方が無視される様です。
これがエッジ検出の弱いところですねぇ。
初期化のところで割込みクリアする処理があるのですが、1枚のボードを2つのデバイスに見せるという小技を使ってるのも間違いでした。

トラブル発生のプロセスが判ってしまえばなんて事ない話なんですが、原因究明するまでがとっても苦悩の日々です。
これも技術屋の宿命でしょうが・・・(笑