PXA270 RISC PC/104のRS232通信で長時間の遅延(1.5ms〜9.5ms)が発生しています。私は長い遅延を最小限に抑えたいのですが、私は組込みデバイスとC++の初心者ですので、何か不足していると思います。PXA270でのRS232通信の遅延が大きい
上記の遅延は、PXAボードがRS232(115200ボー)を介して外部デバイスからパケットを受信し、ACKカスタムパケットを外部デバイスに送り返すまでの遅延です。 オシロスコープでPXAボードの遅延を測定しました.1つはRxに、もう1つはTxにあります。
PXAボードでは、Arcom Embedded Linux(AEL)が実行されています。私はそれがリアルタイムOSではないことを知っていますが、私はまだ考えています。平均遅延が4.5msであると考えています高すぎます受信パケットを抽出し、CRC16であることを確認し、ACKパケット(CRC付き)シリアル回線を元に戻します。 私は故意にCPUを重い負荷(いくつかの並列gzip操作)に置いていましたが、遅延時間はまったく増えませんでした。 受信パケットの最大サイズは30バイトです。
C++アプリケーション(別の以前の同僚が書いています)は、パケットの受信とその肯定応答を処理しています。 1つのスレッドが送信中で、もう1つがパケットを受信しています。
私は、PXAボード上のRTCが非常に悪い解像度を持ち、AELがタイミングを内部RTC解像度に合わせることができないと考えました。しかし、RTCの周波数は32.768kHzです。解像度は十分ですが、依然として高い遅延を説明していません。 Btw、私はOSは、タイミングのためのRTCではなく、内部PXAクロック(十分な解像度を持っている)を使用していると思う。
したがって、問題はC++アプリケーションまたはRS232インターフェイスのドライバ/ OS設定にある必要があります。
次の制御フラグは、Serial Programming Guide for POSIX Operating SystemsによるC++アプリケーションでのRS232通信に使用されています
// Open RS232 on COM1
mPhysicalComPort = open(aPort, O_RDWR | O_NOCTTY | O_NDELAY);
// Force read call to block if no data available
int f = fcntl(mPhysicalComPort, F_GETFL, 0);
f &= ~O_NONBLOCK;
fcntl(mPhysicalComPort, F_SETFL, f);
// Get the current options for the port...
tcgetattr(mPhysicalComPort, &options);
// ... and set them to the desired values
cfsetispeed(&options, baudRate);
cfsetospeed(&options, baudRate);
// no parity (8N1)
options.c_cflag &= ~PARENB;
options.c_cflag &= ~CSTOPB;
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8;
// disable hardware flow control
options.c_cflag &= ~CRTSCTS;
// raw input
options.c_lflag = 0;
// disable software flow control
options.c_iflag = 0;
// raw output
options.c_oflag = 0;
// Set byte times
options.c_cc[VMIN] = 1;
options.c_cc[VTIME] = 0;
// Set the new options for the port
tcsetattr(mPhysicalComPort, TCSAFLUSH, &options);
// Flush to put settings to work
tcflush(mPhysicalComPort, TCIOFLUSH);
私は、私は非常に単純な何かが欠けていると思います。私は、アプリケーションのプロセスがより優先度の高い状態で実行されている場合、問題は解決しないと考えています。 RS232ドライバにレイテンシを最小限に抑えるために優先順位の高い要求を処理するよう指示するものがなければなりません。
誰にもアイデアはありますか?ご協力いただきありがとうございます。
を\ nが入力されているか、バッファがいっぱいですか?あなたのタイミングを推測することができる、シリアルドライバの上にいくつかの端末関連のものがあります。 – Rudi
すべての文字に対して遅延が発生しません。パケット全体(〜30バイト)が受信されると、ACKパケットが返されるまで発生します。 – saxos
1.あなたが待っていて、ポートから読むコードを教えてください。 2.Uptimeの出力を表示する(多分あなたのシステムは過負荷ですか?)3. LinuxにFast Context Switch Extension(lwn.net/images/conf/rtlws11/papers/proc/p01.pdf)がありますか? PXA270はコンテキストスイッチの遅延を0.5ms以下に抑えることができます。 – atzz