1

これはより一般的な質問です。外部デバイスを考えてみましょう。このデバイスは、デバイス ドライバを介して特定のメモリ アドレスにデータを書き込むことがあります。このデータを読み取る小さな C プログラムを書きたいと思います。このアドレスをポーリングして値が変更されたかどうかを確認するよりも良い方法はありますか? CPU負荷を低く抑えたい。

私はいくつかのさらなる研究を行いました

「メモリマップIO」はオプションですか?私の素朴な考えは、外部デバイスがカーネルデバイスドライバーをトリガーする「メモリマップされたIO」アドレスにフラグを書き込むようにすることです。次に、ドライバーは値を処理するプログラムに「通知」します。これは機能しますか?ドライバーはどのようにプログラムに通知できますか?

4

1 に答える 1

1

答えは、使用するプロセッサ、デバイス、およびオペレーティング システムと RTOS のどちらを使用しているかによって異なります。

メモリ マップド I/O自体は解決策ではなく、通常のメモリ アクセス命令で直接アドレス指定できる I/O デバイス レジスタを参照するだけです。ほとんどのデバイスは、特定のレジスタが更新されたとき、または新しい有効なデータが含まれているときに割り込みを生成します。

一般に、RTOS を使用する場合、データを処理する必要があるクライアント スレッドに、適切な IPC メカニズムを介してデバイス ドライバが通知するように設定できます。RTOS を使用していない場合は、データが更新されるたびに呼び出されるコールバックをデバイス ドライバーに登録するだけで済みます。コールバックでクライアントが行うことは、新しいデータの読み取りを含むビジネスです。

問題のデバイスが割り込みを生成する場合、処理は割り込みで実行できます。デバイスが DMA に対応している場合は、DMA コントローラーがハンドラーへの DMA 割り込みを生成する前に、データのブロックを自律的に処理できます。

于 2013-09-18T16:54:51.597 に答える