• ベストアンサー

割り込みハンドラの処理の簡素化

iTronのマルチタスク環境でのデバイスドライバの開発を行っています。 ハードウェアからの割り込み処理について、割り込みハンドラの処理はなるべく簡素化し、すぐに処理を終えた方がよいということを聞きました。 これは、いったいなぜなのでしょう?優先度が高いためシステム全体の性能が落ちるからでしょうか? 詳細をご存知の方がいらっしゃいましたら、よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.2

正確には「割り込みハンドラのうち、割り込みを許可しない部分の処理をなるべく早く終えたほうがよい」ということです。割り込みが許可されない状態では、他の割り込み要求が発生してもそれに対応する割り込み処理が実行されない(待たされる)ことになるので、割り込み要求から割り込み処理までの遅延時間の要求が厳しい場合に要求を満たせなくなる可能性が増すからです。 ですので逆に言えば、割り込みを許可しない部分の処理時間を積み上げていって、それが「割り込み要求から割り込み処理までの遅延時間の要求」の最も厳しいものもクリアできる程度なのであれば、割り込みハンドラで速やかに処理を終えなくても構わないということです。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • ency
  • ベストアンサー率39% (93/238)
回答No.4

iTron はよくわからないのですが、ARM の場合の話を書いてみます。 # ARM を使った組込み屋さんなもので。。。 # OS は独自の簡易 OS を使用しています。 # 機能としてはタスクディスパッチくらいしか持っていませんが。。。 iTron の場合には見当違いの内容があったら、適当に読み飛ばしてください。 # 大筋ではずしてはいないと思いますが。。。 タスクが動いている場合と割込み処理の場合とでは、CPU のモードが異なります。 そして、割込み処理中は、タスクが動けなくなります。 ハードウエアから割込みが入ると、それまでタスクにあった CPU の実行権が、割込み処理にうばわれる形になります。 その結果、タスクの処理は割込み処理が終わるまで待たされることになります。 というわけで、割込み処理の時間が長くなると、タスクに処理が回らなくなる時間が長くなってしまいます。 ですので、割込み処理の時間は短いほうが良いのです。 理想を言えば jacta さんの回答にもあるように、割込みが入ったらタスクに処理を移して、本処理はタスクコンテキストで行うようにした方が良いのは確かですね。 ただ、組込み系のデバイスドライバの場合、設計の都合上タスクを持たない場合もあると思います。 そのような場合には、ある程度処理時間を短くするようにコーディングを工夫する必要はあります。 # 一部をアセンブラにしたりすることもありますね。

sisibaba
質問者

お礼

多数のご回答ありがとうございました。 割り込み処理ではタスクを切替えるのみで、主だった処理はタスクで行う設計を考えておりましたが、タスクの処理が終了するまで割り込み禁止状態にしようと考えておりました。xcrOSgS2wYさんのご意見を参考に設計しなおしたいと思います。 本来ならお一人づつお礼を申し上げるべきですが、失礼ながらこの欄にて皆様へのお礼と代えさせていただきます。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

割り込み禁止時間が長くなることで応答性能が悪くなることは既に回答がでていますので、それ以外の観点からお答えします。 割り込みハンドラで複雑な処理をやろうとすると、それだけスタックの消費が大きくなります。割り込みスタック領域が別に用意されているアーキテクチャならよいのですが、そうでなければスタックの総使用量が見積もりにくくなります。 そもそも、非タスクコンテキストでは何かと制約も大きいので、可能な限り適切なタスクを起こしてタスクコンテキストで処理を行うようにした方が、扱いも簡単ですし、間違いも発生しにくいと思います。

全文を見る
すると、全ての回答が全文表示されます。
  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.1

システム全体の性能というよりはリアルタイム性とかレスポンスが落ちると言った方が良いでしょうね。 OSが割り込みを多重処理できなければ割り込み処理中は他の割り込みを一切受け付けないし、多重処理できても優先度の低い割り込みは受け付けないので、割り込みハンドラで長い処理を実行するとそれだけ割り込み応答性能は落ちることになります。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 割り込みハンドラの間隔に関して

    組み込み機器の開発をしております。割り込みをCPUに通知してからそれをOSが認識するまでの間隔はどのぐらいと見積もればよいかを教えて頂きたく思っております。 その間隔が長ければ多くのバッファリングメモリを実装しなくてはならないので見積もりが必要です。 なお、組み込み機器なのでプログラミングが可能です。また、本人はハードウェアエンジニアに付き、ソフト開発の経験が有りません。従い勘違いをしている点があるかも知れないので、その際は訂正の程、宜しくお願いいたします。 1) windowsのプログラミングにおいて、割り込み間隔の設定はどのレベルでチューニングされるのでしょうか?OSレベルで定義されているのか、もしくはデバイスドライバが認識するのか? 2) OSが割り込みを認識する間隔の最小時間はどのぐらいなのでしょうか? 3) 割り込み認識の間隔は常にほぼ一定であり、状況によって遅れることは無いと考えてよいのでしょうか? 4) 割り込み通知を受けてから割り込み処理ルーチンが実行されるまでのタイムラグはどのぐらいでしょうか?(immediate に実行されると考えてよいのでしょうか?) 5) 割り込み通知を受けてから割り込み処理ルーチンが実行されるまでのタイムラグは、割り込み処理ルーチンが既に起動されている場合は、優先度に応じて、処理されるまでの時間は保証されないのでしょうか? 6) 通常のデバイスドライバなどでは割り込みハンドラの間隔に関してどのような仮定に基づいているのでしょうか? 7) この辺の議論をより正確に理解するためにweb上、もしくは書籍の情報源として最適なものを教えて頂けませんでしょうか? 以上宜しくお願いいたします。

  • マルチプロセスの利点、欠点

    OSの課題で、 複数のプロセスで処理を実行する利点、欠点を述べる問題なのですが、 利点は 1.並列して処理を進めると、適切な処理の切り替えによってシステム全体の処理効率が上がることがある 2.信頼性向上に繋がる  ・fail-softなシステムを容易に構築できる  ・fail-tolerantなシステムを容易に構築できる 3.複数のCPUによる多重プログラミング環境においても、ソフトウェアを再設計することなく直ちにハードウェアに見合った性能向上が期待できる だと思うのですが、 欠点が調べてもなかなかわかりません。 どなたかご存知の方教えてください。

  • CD-ROMをまったく読み込まなくなってしまった・・・・

    たとえば音楽を取り込もうとしても、ソフトを認識しないし非常に困っています。システムのハードウエアという欄を見てみたら、 『このハードウェアのデバイス ドライバを正常に読み込みましたが、ハードウェア デバイスが見つかりません。 (コード 41)』 とでてきました。突然のことですし、あまりパソコン用語にも詳しくないので、どうか助けてください・・・

  • HTTPハンドラでPOSTした値を受け取りたい。

    C♯でASP.NET環境にて開発をしています。 htmlにボタン(submit)を置いて、postが来たら、ashx(HTTPハンドラ) のほうでリクエスト値を見てDBから値を取り、結果を返したいと思っています。 結果については、JavaScriptのほうでinnerHTMLを使って反映させる予定です。 オンロードでJavaScriptのメソッドを呼んでるんですが (body onload = "test();") (input type hiddenでいくつかの値がpostされるように なっています) function test() { var ret = new Ajax.Request('GetValue.ashx'),{ method:'post' … } こんな感じでashxを呼んでるものの、htmlでpostした値が 受け取れません。 context.Request.Querystringで取ろうとしてるんですが… htmlでリクエストした際に、JavaScriptを呼んで、そこでajaxリクエストをしている という作りがまずいのでしょうか? HTTPハンドラを使うのが始めてなので、頓珍漢なことをしているかも しれませんが、ご教授いただけると助かります。 宜しくお願いします。

  • VAIO type Z のGPUを読み込まない

    vaio typeZはGPUを切り替えられるのですがWin7にUPデートしてから切り替えができなくなりました。調べたら切り替えはできなくなるとWeb上にもあったのでが、せめて性能だけでも引き出したいと思い明らかGPU性能が悪いのでデバイスマネージャーを見たらドライバーが入ってなかったので入れました。チップセットのGPUは入れれたのですがもうひとつのGPU のドライバーが入れれません。それも調べてドライバーはあるのですが入れようとすると”対応するハードウェアがありません”と出ます。どうしたら読み込みますか?(デバイスマネージャーには表示されます)

  • odbc接続処理が遅い

    vb.netにてプログラムを作成して使用しており、DBはpostgresqlをodbc接続にて使用しております。 ある端末で処理が極端に遅く、デバッグにて検証したところ、DB処理で時間がかかっていることがわかりました。 それに伴い同端末で別システムのoracleへのodbc接続も同じ現象となっている状況です。 この端末ではpostgresqlのodbcドライバの入れ替えを行ったことがあり、その頃から遅くなったようです。 また、別の全く同じ環境の端末では特に問題ない処理速度で稼働しております。 odbcドライバの入れ替えは何度か行っておりますが改善されません。 改善方法をご存じの方はおられますでしょうか?

  • 外付けのHDD(USB2.0にて接続)が起動時だけ認識してくれません

    外付けのHDDが(USB2.0で接続)が起動時に認識してくれません。一度抜き差しすれば認識してくれます。 しかし起動時にはデバイスマネージャーが 「既にシステム内で実行中の重複したデバイスがあるので、このハードウェアのデバイスドライバを読み込むことができません。コード 42」と表示されます。 ドライバのアンインストール、再起動を何度も繰り返しましたがだめです。 どうすればいいのでしょうか? ちなみに何度かやってみているうちに気がついたのですが、起動時に接続せずにOSが起動してからハードウェアを追加するときちんとドライバがインストールされます。ところが接続したまま再起動すると、もう一度ドライバがインストールされているようなのです。  しかし、このドライバのインストールを阻止することができない上に、それがインストールされたあとに「既にシステム内で実行中の重複したデバイスがあるので、このハードウェアのデバイスドライバを読み込むことができません。」と表示されてしまいます。 どうか解決の方法を教えてください。 よろしくお願いします。

  • エディットコントロールのイベントハンドラ

    開発環境 ・Windows XP (32bit) ・Visual C++ 2005 以下内容でCEditの派生クラスを作成したところ、 その派生クラスを使用するダイアログで EN_CHANGEイベントがキャッチ出来ませんでした。 どうすればキャッチ出来るようになるでしょうか? アドバイス頂けると大変ありがたいです。 ※エディットコントロールに文字を入力すると  以下(1)の処理には来るのですが、  以下(2)の処理には来ませんでした。 //------------------------------------------------ // EditEx.h //------------------------------------------------ // CEditの派生クラス class CEditEx : public CEdit { public:     CEditEx(void);     virtual ~CEditEx(void); //------------------------------------------------ // EditEx.cpp //------------------------------------------------ // CEditExクラス内でEN_CHANGEイベントを処理 BEGIN_MESSAGE_MAP(CEditEx, CEdit)     ON_CONTROL_REFLECT(EN_CHANGE, &CEditEx::OnEnChange) END_MESSAGE_MAP() // EN_CHANGEイベントハンドラ void CEditEx::OnEnChange(void) {     // (1) } //------------------------------------------------ // DialogEx.h //------------------------------------------------ // CEditExクラスをメンバに持つダイアログ class CDialogEx : public CDialog { private:     CEditEx m_Edit1; //------------------------------------------------ // DialogEx.cpp //------------------------------------------------ // CDialogExクラス内でもEN_CHANGEイベントを処理したい BEGIN_MESSAGE_MAP(CDialogEx, CDialog)     ON_EN_CHANGE(IDC_EDIT1, &CDialogEx::OnEnChangeEdit1) END_MESSAGE_MAP() // EN_CHANGEイベントハンドラ void CDialogEx::OnEnChangeEdit1(void) {     // (2) }

  • PCG-QR3S/BPを使用していますが、内蔵のLAN端子ドライバを探

    PCG-QR3S/BPを使用していますが、内蔵のLAN端子ドライバを探しております。 同機種をお使いの方にお願いなのですが ・システム→ハードウェア→デバイスマネージャー の中で LANのドライバ情報(LANのハードウェア名)について教えていただけませんでしょうか。 また、類似のドライバのありかをご存知でしたら、教えてください。 リカバリCDを購入すれば解決するなどの安易な回答は無しでお願いします^^;

  • どの環境・言語を選択すべきでしょうか?【画像処理・ハフ変換】

    工学系(化学)の大学生です。 開発環境・言語の選択に関してアドバイスを頂きたいと思い質問を投稿させて頂きます。 この度卒業研究を進めるに当たって多量の画像処理を行う事になりました。一枚一枚の処理は単純なのですが全体ではとても手でこなせる量ではなくコンピューター上で自動的に行いたいと考えています。 以下に参考になりそうな事柄を挙げました。こちらを基に、今後どのような開発環境・言語を選択して開発を行っていけばいいかアドバイスをいただければと思います。必要事項等ありましたら随時補足させて頂きます。 それでは、どうぞよろしくお願いいたします。 【処理内容】 ・画像から複数の円の半径を抽出*数百枚 ・得られたデータを統計的に処理、グラフ出力まで (現時点ではハフ変換の考え方をベースにしたプログラムを組もうと考えています。) 【開発に当たっての条件・希望】 ・実際に処理を行うに当たってプログラムを回すのはは自分のPCでなく大学の情報処理インフラを使おうと考えているので処理速度等の優先順位は低い ・自分以外の人間が今後アップデートを行う可能性がありできるだけ広く認知されている開発環境と言語を使いたい ・できれば無料で… 【スキルなど】 ・企業の研修のようなもので4つほど簡単なアプリケーションを作成しました(一ヶ月、Borland Delphi) ・授業の一部分でいくつかの極めて簡単なプログラムを組みました(c言語) 上二つで得た知識はほとんど残っていません。プログラミングの雰囲気はなんとなくわかる初心者、位に思っていただければと思います。