ボタンが押されたことに気付いたときに何らかのアクションを実行するマイクロプロセッサまたはマイクロコントローラがあるとします。
最初のアプローチは、ボタンがまだ変更されているかどうかを確認し、変更されたら必要なアクションを実行する以外は何もしないループにプログラムを入れることです。
場合によっては、ボタンが配線された入力に配線されていると仮定して、ボタンが押されたときに割り込みをトリガーするようにハードウェアをプログラムすることで、割り込みを引き起こすことができます。
3 番目の方法は、一定のレート (たとえば 1000x/秒) でプロセッサに割り込みを行うようにタイマーを構成し、その割り込みのハンドラーにボタンの状態をチェックさせ、それに基づいて動作させることです。
最初のアプローチはビジー待機を使用します。他のすべてを完全に調整することを犠牲にして、1つの特定の刺激に対して非常に優れた応答時間を提供できます. 2 番目のアプローチは、イベント トリガー割り込みを使用します。多くの場合、ビジー待機よりも応答時間がわずかに遅くなりますが、CPU は I/O を待っている間に他のことを行うことができます。また、ボタンが押されるまで、CPU が低電力スリープ モードに移行することもできます。3 番目のアプローチは、他の 2 つよりはるかに劣る応答時間を提供しますが、ハードウェアがボタンの押下による割り込みのトリガーを許可しない場合でも使用できます。
迅速な応答が必要な場合は、多くの場合、イベント トリガー割り込みまたはビジー待機のいずれかを使用する必要があります。ただし、多くの場合、ポーリング アプローチが最も実用的です。関心のあるすべてのイベントをサポートするハードウェアが存在しないか、関心のあるイベントの数が利用可能な割り込みの数を大幅に超えている可能性があります。さらに、特定の条件では遅延応答を生成することが望ましい場合があります。たとえば、次の基準に従って、スイッチがアクティブになった回数をカウントしたいとします。
- すべての正当なスイッチ イベントは、スイッチが任意に閉じて再度開くことができる 0 ~ 900us (マイクロ秒) の間隔、その後にスイッチが閉じたままになる少なくとも 1.1ms の間隔、およびその後に続く 0 ~ 900us (マイクロ秒) の間隔で構成されます。スイッチが任意に開閉できる 900us の間に、スイッチが開く少なくとも 1.1ms の間隔が続きます。
- ソフトウェアは、無視されないスイッチの開閉の後、950us の間スイッチの状態を無視する必要があります。
- ソフトウェアは、上記の必要なブランキング期間外に発生するスイッチ イベントを任意にカウントまたは無視できますが、持続時間は 1.1ms 未満です。
- ソフトウェアが報告するカウントは、スイッチが安定して「閉じて」から 1.99ms 以内に有効でなければなりません。
この要件を適用する最も簡単な方法は、スイッチの状態を毎秒 1,000 回観察することです。前の状態が「開いている」のに「閉じている」と表示された場合は、カウンターをインクリメントします。とてもシンプルで簡単です。スイッチがあらゆる種類の奇妙な方法で開閉したとしても、実際のイベントの前後の 900us の間、ソフトウェアは気にしません。
スイッチ入力によってトリガーされる割り込みをタイマーと共に使用して、必要なブランキング要件を満たしながら、スイッチ入力に対する応答を高速化することができます。最初は、次にスイッチが閉じたときにトリガーするように入力が準備されます。割り込みがトリガーされると、ソフトウェアはそれを無効にしますが、950us 後に割り込みをトリガーするようにタイマーを設定します。そのタイマーが期限切れになると、次にスイッチが「開いた」ときに割り込みを起動する割り込みがトリガーされます。その割り込みは、スイッチ割り込みを無効にし、再びタイマーを 950us に設定するため、タイマー割り込みはスイッチ割り込みを再び有効にします。このアプローチが役立つ場合もありますが、ソフトウェアは単純なポーリング アプローチよりもはるかに複雑です。タイマーベースのアプローチで十分な場合、
直接割り込みではなくマルチタスク OS を使用するシステムでは、同じ原則の多くが適用されます。定期的な I/O ポーリングは、特定のイベントが発生するまで OS が実行しないコードを使用する場合と比較して、いくらかの CPU 時間を浪費しますが、多くの場合、イベントの応答時間と、イベントが発生しないときに浪費される時間の両方は、使用時に許容されます。定期的なポーリング。実際、一部のバッファー I/O 状況では、定期的なポーリングが非常に効率的であることが判明する場合があります。たとえば、シリアル ポート経由でリモート マシンから大量のデータを受信しているとします。1 秒あたり最大 11,520 バイトが到着し、デバイスは最後の確認応答パケットの前に最大 2K のデータを送信し、シリアル ポートは4K 入力バッファ。「データ受信」イベントを使用してデータを処理できますが、単純にポートを 100x/秒チェックして、その時点までに受信したすべてのパケットを処理するのも同様に効率的です。このようなポーリングは、リモート デバイスがデータを送信していないときに時間の無駄になりますが、着信データが予期される場合は、着信データのすべての小さな断片をすぐに処理するよりも、約 1.15K のチャンクで処理する方が効率的です。入ってくる。