解決策
UARTとは何ですか?UART FIFOは何ですか?
UART(Universal Asynchronous Receiver/Transmitter)は、特定のシリアルポートによってシリアルポートで受信と送信(読み取りと書き込み)操作を制御するデバイスです。具体的に言うと、UARTは受信と送信の各操作に対してFIFO構造(先入れ先出し、キュー構造)の形式である専用メモリです。
FIFO構造の目的は、シリアルポートから受信したデータまたはシリアルポートに書き込まれたデータを保持することです。ほとんどのUARTは、ソフトウェアで使用されているFIFOのサイズを割り当てることができます。設定する方法については、
VISAを使用してシリアルポートのフロー制御をするとバッファオーバーフローが発生するを参照してください。UARTの全メモリ量によって制限される最大サイズがありますが、使用するサイズを明確に指定することができます。
場合によっては、最大サイズ以下のすべてのサイズを選択することはできません。たとえば、多くのRS-232ポートには最大FIFO受信バッファサイズが14であるUARTがありますが、使用可能なサイズは1、4、8、および14に制限されています。ただし、多くのUARTの送信バッファサイズは、1~16の整数値を受け付けます。ナショナルインスツルメンツ(NI)のPCIシリアルデバイスには、128バイトの送信FIFOと受信FIFOを持つUARTが搭載されています。
ほとんどの場合、最大数以下を選択可能です。たとえば、多くのRS-232ポートは使用可能なサイズとして1、4、8、および14バイトの最大FIFO受信バッファを持つUARTがあります。しかし、多くのUART送信バッファサイズは、1から16までの整数値を受け付けます。ナショナルインスツルメンツのPCIシリアルデバイスは、128バイトの送信および受信FIFOを持つUARTが搭載されています。
FIFOはパフォーマンスにどのような影響がありますか?
FIFOバッファのサイズは、FIFOとCPUメモリ(CPU上で実行されているアプリケーションがデータにアクセスできるRAM)間でデータを転送するために、UARTがCPUをいつ割り込みするかを決定します。そのため、FIFOのサイズは、特定のアプリケーションの全体的なパフォーマンスだけでなく、シリアルポートへの書き込みおよび読み取りでのレイテンシ(通常はミリ秒台)に影響する可能性があります。
たとえば、受信バッファを1バイトと設定した場合、UARTはバイトが受信されるたびにCPUのメモリに1バイトを転送するため、プロセッサが中断されます。ポートに届いた後、できるだけ速くRAMに利用可能なバイトが使用できるようになりますが、ポートで連続的に受信している場合は多くの割り込みが発生します。その結果、より多くのCPU処理は、他のプログラムが実行している場合に全体のパフォーマンスを下げるこれらの割り込みのために費やされます。したがって、数ミリ秒台のレイテンシが連続操作に対して許容できる場合、全体のパフォーマンスにとって有益であり、大きな受信FIFOサイズを使用することができます。
受信FIFOサイズを4バイトから14バイトに変更しても、確実に受信するために割り込みは定期的に発生することに注意してください。同様に、送信FIFOサイズは一度にRAMから送信FIOへ転送できるバイト数を指定します。そのため、送信FIFOサイズが大きい場合は、各割り込みでより多くのデータを送信することによって、大きなデータ量を転送する際のレイテンシを減らすことができます。