2

2.6.32OMAPベースのLinuxカーネルを使用しています。高速データレート(シリアルポートを460800ボーレートに設定)では、シリアルポートのHWFIFOオーバーフローが発生することを確認しました。

シリアルポートは、rxとtxの両方向で8バイトごとに割り込みを生成するように構成されています(つまり、シリアルポートHW fifoが8バイトの場合、シリアルポートからデータを一度に読み取る完全なシリアル割り込みが生成されます)。

114バイトのパケットを継続的に送信しています(シリアルドライバーはパケットモードについての手がかりがなく、rawモードでデータを受信します)。計算に基づいて、

460800ビット/秒=>460800/10= 46080バイト/秒(1つのストップビットと1つのスタートビット)なので、最悪の場合46080/114=>404.21パケットを問題なく送信できます。

ただし、シリアルポートは1秒あたり少なくとも1000パケットを処理することを期待しています。そのため、8バイトごとに割り込みを生成するようにシリアルドライバーを構成しました。

Windows XPを使用して同じことを試しましたが、最大600パケット/秒を読み取ることができます。

上記の状況下で、これはLinuxで実行可能だと思いますか?または私は何かが欠けていますか?コメントを教えてください。

誰かが.configファイルで構成する必要があるいくつかの重要な構成設定を送信することもできます。それ以外の場合は.configファイルを添付できません。共有できます。

4

1 に答える 1

1

シリアルポートで発生する可能性のあるオーバーフローには2種類あります。最初のものはあなたが話しているものであり、ドライバはFIFOを空にするのに十分な速さで割り込みに応答していません。それらは通常約16バイトの深さであるため、FIFOオーバーフローを取得するには、割り込みハンドラーが1 /(46080/16)=347マイクロ秒の間応答しない必要があります。それは本当に、本当に長い時間です。それをトリップするには、優先度の高い割り込みを使用して、かなり大幅に台無しにされたドライバーが必要です。

2番目の種類はあなたが考慮しなかったものであり、論理的な説明へのより多くの希望を提供します。ドライバは、FIFOから受信バッファにバイトをコピーします。ユーザーモードプログラムがread()を呼び出して読み取るまで、それらが置かれる場所。そのバッファでオーバーフローが発生するのは、デバイスでハンドシェイクを構成せず、ユーザーモードプログラムがread()を頻繁に呼び出さない場合です。これは、FIFOバッファオーバーフローとまったく同じように見え、バイトが消えるだけです。これらの問題について警告するステータスビットがありますが、それらをチェックしないことは頻繁な見落としです。あなたもそうすることについて言及しませんでした。

したがって、診断を改善することから始め、オーバーフローステータスビットをチェックして、何が起こっているかを確認してください。次に、実際にはバッファオーバーフローの問題であることがわかった場合は、ハンドシェイクを有効にすることを検討してくださいバッファサイズを増やすことは可能ですが、これが消防ホースの問題である場合の解決策ではありません。ユーザーモードプログラムでread()をより頻繁に呼び出すようにすることは修正ですが、簡単な修正ではありません。ボーレートを下げるだけで、ええ、それは常に機能します。

于 2013-01-08T22:22:42.513 に答える