時間と効率性、および ISR が他のプロセスから時間を奪う方法に関係していることはわかっていますが、なぜそうなのかはわかりません。私はいつも、ISR を非常に短くするように言われています。これがなぜなのか、私は少し混乱しています。
3 に答える
通常、ISR は、ハードウェア デバイスが CPU と対話する必要があるときに登場します。それらは、割り込みを処理するためにCPUが行っていたことをすべて終了させる割り込み信号を送信します。それがISRが気にかけなければならないことです。
現在、これはハードウェア環境や割り込みの性質など、多くの要因に依存しますが、通常、割り込みを適切に処理するために、割り込みを無効にして ISR を実行し、割り込みを防ぐことができます。これは、ISR コードを実行している間、CPU を他のプロセス間で共有できないことを意味します。これは、スケジューラーを実行するために使用されるシステム タイマー割り込み (これは、CPU が複数の処理を実行できるという幻想を作り出すカーネルの一部です)タスクを同時に) は機能しません。
そのため、ISR がデバイスで特定の操作を実行するのに時間がかかりすぎると、残りのプロセスで CPU を使用できる時間の割合が通常よりも少なくなるため、システム全体が影響を受けます。これは、CPU に転送するディスク セクタごとに CPU に割り込み、ISR が実際の転送を行う必要がある PIO ハードディスクを備えた古いシステムでよく知られています。ディスク トラフィックが多い場合、マウスの動きがぎくしゃくするなどの現象が発生することがあります (マウス デバイスが CPU に送信する割り込みが処理されないため)。
Linux のような OS では、ISR がハードウェア デバイスでの時間のかかる操作をタスクレットに任せることができます。これは、CPU 時間を他のプロセスと共有できるカーネル スレッドのようなものでありながら、ハードウェア デバイス操作のアトミックな性質を維持します (OS は、それ以上の処理が行われないことを保証します)。 1 つのタスクレット関数 (ISR に関連付けられた特定のタスクレット用) は、システムで同時に実行されます)。ディスクからカーネル バッファへの PIO 転送は、このような操作の一例です。
通常、メイン スレッドの優先度は ISR よりも低くなります。スケジューラによっては、多くの場合、保留中のすべての ISR が実行された後にメイン コードが実行されます。
1 つまたは複数の ISR に大量の計算集約型コードを配置することは、通常はお勧めできません。これは、優先度の低い ISR やスレッドの遅延や CPU 枯渇の原因となる可能性があり、タイム クリティカルなコードを実行する必要がある場合に悪影響を与える可能性があるためです。
ただし、割り込みイベントですぐにアクションを実行する必要がある場合、最も速い方法は、関連する ISR からコードを実行することです (場合によっては、それに高い優先度を割り当てます)。
時間のかかるコードを実行する複数の割り込みソースを使用する場合は、RTOS を使用して、複数のスレッドを安全かつ効率的にインターリーブして各割り込みを処理できるようにすることをお勧めします。