- ベストアンサー
割り込みハンドラの処理の簡素化
iTronのマルチタスク環境でのデバイスドライバの開発を行っています。 ハードウェアからの割り込み処理について、割り込みハンドラの処理はなるべく簡素化し、すぐに処理を終えた方がよいということを聞きました。 これは、いったいなぜなのでしょう?優先度が高いためシステム全体の性能が落ちるからでしょうか? 詳細をご存知の方がいらっしゃいましたら、よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
正確には「割り込みハンドラのうち、割り込みを許可しない部分の処理をなるべく早く終えたほうがよい」ということです。割り込みが許可されない状態では、他の割り込み要求が発生してもそれに対応する割り込み処理が実行されない(待たされる)ことになるので、割り込み要求から割り込み処理までの遅延時間の要求が厳しい場合に要求を満たせなくなる可能性が増すからです。 ですので逆に言えば、割り込みを許可しない部分の処理時間を積み上げていって、それが「割り込み要求から割り込み処理までの遅延時間の要求」の最も厳しいものもクリアできる程度なのであれば、割り込みハンドラで速やかに処理を終えなくても構わないということです。
その他の回答 (3)
- ency
- ベストアンサー率39% (93/238)
iTron はよくわからないのですが、ARM の場合の話を書いてみます。 # ARM を使った組込み屋さんなもので。。。 # OS は独自の簡易 OS を使用しています。 # 機能としてはタスクディスパッチくらいしか持っていませんが。。。 iTron の場合には見当違いの内容があったら、適当に読み飛ばしてください。 # 大筋ではずしてはいないと思いますが。。。 タスクが動いている場合と割込み処理の場合とでは、CPU のモードが異なります。 そして、割込み処理中は、タスクが動けなくなります。 ハードウエアから割込みが入ると、それまでタスクにあった CPU の実行権が、割込み処理にうばわれる形になります。 その結果、タスクの処理は割込み処理が終わるまで待たされることになります。 というわけで、割込み処理の時間が長くなると、タスクに処理が回らなくなる時間が長くなってしまいます。 ですので、割込み処理の時間は短いほうが良いのです。 理想を言えば jacta さんの回答にもあるように、割込みが入ったらタスクに処理を移して、本処理はタスクコンテキストで行うようにした方が良いのは確かですね。 ただ、組込み系のデバイスドライバの場合、設計の都合上タスクを持たない場合もあると思います。 そのような場合には、ある程度処理時間を短くするようにコーディングを工夫する必要はあります。 # 一部をアセンブラにしたりすることもありますね。
- jacta
- ベストアンサー率26% (845/3158)
割り込み禁止時間が長くなることで応答性能が悪くなることは既に回答がでていますので、それ以外の観点からお答えします。 割り込みハンドラで複雑な処理をやろうとすると、それだけスタックの消費が大きくなります。割り込みスタック領域が別に用意されているアーキテクチャならよいのですが、そうでなければスタックの総使用量が見積もりにくくなります。 そもそも、非タスクコンテキストでは何かと制約も大きいので、可能な限り適切なタスクを起こしてタスクコンテキストで処理を行うようにした方が、扱いも簡単ですし、間違いも発生しにくいと思います。
- rinkun
- ベストアンサー率44% (706/1571)
システム全体の性能というよりはリアルタイム性とかレスポンスが落ちると言った方が良いでしょうね。 OSが割り込みを多重処理できなければ割り込み処理中は他の割り込みを一切受け付けないし、多重処理できても優先度の低い割り込みは受け付けないので、割り込みハンドラで長い処理を実行するとそれだけ割り込み応答性能は落ちることになります。
お礼
多数のご回答ありがとうございました。 割り込み処理ではタスクを切替えるのみで、主だった処理はタスクで行う設計を考えておりましたが、タスクの処理が終了するまで割り込み禁止状態にしようと考えておりました。xcrOSgS2wYさんのご意見を参考に設計しなおしたいと思います。 本来ならお一人づつお礼を申し上げるべきですが、失礼ながらこの欄にて皆様へのお礼と代えさせていただきます。 ありがとうございました。