Высокая задержка связи RS232 на PXA270

У меня большая задержка (1,5–9,5 мс) при обмене данными через RS232 на PXA270 RISC PC / 104. Я хочу свести к минимуму долгую задержку, но я новичок во встроенных устройствах и C ++, поэтому я думаю, что мне что-то не хватает. Я измерил задержку на плате PXA с помощью осциллографа, один канал на Rx, а другой на Tx.

Плата PXA работает под управлением Arcom Embedded Linux (AEL). Я знаю, что это не ОС реального времени, но я все же считаю, что средняя задержка в 4,5 мс слишком высока для извлечения полученного пакета, проверьте его CRC16, создайте пакет ACK (с CRC ) и отправьте его обратно по последовательной линии. Я также намеренно нагружал ЦП (некоторые параллельные операции gzip), но время задержки не увеличивалось вообще. Максимальный размер принимаемого пакета составляет 30 байт.

Приложение C ++ (его написал другой бывший сотрудник) обрабатывает прием пакетов и их подтверждение. Один поток отправляет, а другой принимает пакеты.

Я думал, что RTC на плате PXA имеет очень плохое разрешение, и AEL не может согласовать синхронизацию с внутренним разрешением RTC. Но у RTC частота 32,768 кГц. Разрешение достаточное, все равно большую задержку не объяснить. Кстати, я думаю, что ОС использует внутренние часы PXA (которые также имеют достаточное разрешение) вместо RTC для синхронизации.

Следовательно, проблема должна быть в приложении C ++ или в настройках драйвера / ОС для RS232.

Следующие флаги управления используются для связи RS232 в приложении C ++ в соответствии с Руководством по последовательному программированию для операционных систем POSIX :

// 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 обрабатывать запросы с более высоким приоритетом, чтобы минимизировать задержку.

Есть ли у кого-нибудь идеи? Заранее большое спасибо за вашу помощь.

8
задан saxos 12 January 2011 в 09:34
поделиться