Перейти к содержанию
    

Slovan

Участник
  • Постов

    10
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный
  1. Ну пакеты у меня идут броадкастом, так что в сеть они точно уходят. С двумя машинами я тоже, конечно, проверял. Вот статистика для вашего варианта, с подсчетом тиков. Запускал на двух ХР, 100 000 пакетов. Получается точнее, но больших скачков, видимо, никак не избежать. 0.0 ms 2 0.0% 2.8 ms 1 0.0% 3.0 ms 1 0.0% 3.2 ms 1 0.0% 3.6 ms 1 0.0% 4.6 ms 1 0.0% 5.2 ms 3 0.0% 5.4 ms 1 0.0% 5.6 ms 1 0.0% 5.8 ms 1 0.0% 6.2 ms 1 0.0% 6.4 ms 1 0.0% 6.8 ms 2 0.0% 7.0 ms 1 0.0% 7.2 ms 1 0.0% 7.4 ms 2 0.0% 8.0 ms 1 0.0% 8.2 ms 2 0.0% 8.4 ms 1 0.0% 8.6 ms 6 0.0% 8.8 ms 19 0.0% 9.0 ms 47 0.0% 9.2 ms 54 0.0% 9.4 ms 38 0.0% 9.6 ms 48 0.0% 9.8 ms 720 0.0% 10.0 ms 97959 97.0% 10.2 ms 854 0.0% 10.4 ms 45 0.0% 10.6 ms 33 0.0% 10.8 ms 55 0.0% 11.0 ms 46 0.0% 11.2 ms 19 0.0% 11.4 ms 4 0.0% 11.6 ms 3 0.0% 11.8 ms 1 0.0% 12.0 ms 1 0.0% 12.2 ms 1 0.0% 12.4 ms 2 0.0% 12.8 ms 1 0.0% 13.2 ms 1 0.0% 13.4 ms 1 0.0% 13.6 ms 1 0.0% 14.0 ms 1 0.0% 14.2 ms 1 0.0% 14.4 ms 2 0.0% 14.6 ms 1 0.0% 14.8 ms 3 0.0% 15.4 ms 1 0.0% 16.4 ms 1 0.0% 16.8 ms 2 0.0% 17.0 ms 1 0.0%
  2. Вот так выглядят тестовые программы: Для передачи: #include <windows.h> #include <tchar.h> #include <stdio.h> SOCKET sock; struct sockaddr_in to; char tx[] = "testtestestesttestestesttestestesttestestesttestes"; void CALLBACK SendPacket(UINT wTimerID, UINT msg, DWORD dwUser, DWORD dw1, DWORD dw2) { sendto(sock, tx, 48, 0, (struct sockaddr*)&to, sizeof(struct sockaddr_in)); } int _tmain(int argc, _TCHAR* argv[]) { SetProcessAffinityMask(GetCurrentProcess(), 0x02); SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS); WSADATA wd; WSAStartup(MAKEWORD(2, 2), &wd); sock = socket(AF_INET, SOCK_DGRAM, 0); to.sin_family = PF_INET; to.sin_addr.s_addr = INADDR_BROADCAST; to.sin_port = htons(49501); memset(&(to.sin_zero), 0, 8); char on = 1; setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on)); UINT m_uResolution; TIMECAPS tc; timeGetDevCaps(&tc, sizeof(TIMECAPS)); m_uResolution = min(max(tc.wPeriodMin, 0), tc.wPeriodMax); timeBeginPeriod(m_uResolution); MMRESULT m_idEvent = timeSetEvent( 10, m_uResolution, SendPacket, NULL, TIME_PERIODIC); getchar(); return 0; } Для приема: #include <windows.h> #include <tchar.h> #include <stdio.h> #define TOTAL_PACKETS 10000 double PCFreq = 0.0; double GetCounter() { LARGE_INTEGER li; QueryPerformanceCounter(&li); return double (li.QuadPart)/PCFreq; } int _tmain(int argc, _TCHAR* argv[]) { SetProcessAffinityMask(GetCurrentProcess(), 0x01); SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS); LARGE_INTEGER li; QueryPerformanceFrequency(&li); PCFreq = double(li.QuadPart)/1000.0; WSADATA wd; WSAStartup(MAKEWORD(2, 2), &wd); SOCKET sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); struct sockaddr_in sa; sa.sin_family = PF_INET; sa.sin_addr.s_addr = INADDR_ANY; sa.sin_port = htons(49501); memset(&(sa.sin_zero), 0, 8); bind(sock, (struct sockaddr*)&sa, sizeof(struct sockaddr)); int nbrcvd; char buf[255]; double t0 = 0, t1 = 0, dt = 0; int counter = 0; unsigned __int32 tbl[100]; memset(tbl, 0, 400); while (1) { nbrcvd = recv(sock, buf, sizeof(buf), 0); if (nbrcvd > 0) { t1 = GetCounter(); if (t0 == 0) t0 = t1; else { dt = t1-t0; t0 = t1; //сбор статистики nbrcvd = static_cast<int>((dt+0.1)/0.2); tbl[nbrcvd]++; } counter++; if (counter == TOTAL_PACKETS) { for (int i = 0; i<100; i++) { if (tbl[i] > 0) fprintf(stdout, " %5.1f ms %5d %5.1f%% \n", (0.2*i), tbl[i], (double) (tbl[i]*100/TOTAL_PACKETS)); } getchar(); return 0; } } } } Такой результат на семерке, когда обе программы выполняются на одном компе: 8.8 ms 3 0.0% 9.0 ms 6 0.0% 9.2 ms 4 0.0% 9.4 ms 7 0.0% 9.6 ms 9 0.0% 9.8 ms 88 0.0% 10.0 ms 9746 97.0% 10.2 ms 110 1.0% 10.4 ms 11 0.0% 10.6 ms 7 0.0% 10.8 ms 4 0.0% 11.0 ms 1 0.0% 11.2 ms 3 0.0% Самое смешное, что в системе вообще не будет машин с жестким реальным временем. В частности компьютер, которому предназначаются эти пакеты, работает под линуксом, без каких либо реал тайм расширений.
  3. Именно так и измеряю. Да все с риалтам приорити естественно.
  4. ~99.5% пакетов укладываются по времени. Колебание 7-13мс. При чем на семерке пакеты идут вокруг 10.0 мс, а на ХР где-то ~75% приходит в 9.8мс и ~25% в 10.8 мс. Не знаю с чем это связано. Сегодня буду разговаривать с алгоритмистами, как я понял, для них главное получать новые показания не реже, чем раз 10мс, то есть если уменьшить период до 5мс (или еще меньше) - это их полностью устроит.
  5. Хм... Ну роутеров у нас нет, только свичи. Большого потока данных не идет. Небольшое колебание 9-11мс допускается. Вроде не должно быть проблем.
  6. Ну если бы можно было поставить другую систему, то смотрели бы в первую очередь сторону QNX... Venturcom RTX это и есть http://www.intervalzero.com/ Ну да, вариант. Еще Win CE можно попробовать.
  7. Добрый день! Понимаю всю обсурдность вопроса... но стоит задача - обеспечить передачу UDP пакетов в сеть с жестким интервалом 10мс. Система только виндоуз и ничего кроме виндоуз. (Причины: драйвера, ПО, просто лень разработчиков изучать другие системы) В общем, уговорить перейти на что-то более адекватное у меня не получается. Какие есть варианты? Мультимедия таймер не обеспечивает необходимой точности. http://www.intervalzero.com/ - вроде бы то, что нужно. Но непонятно, сколько времени уйдет на освоение и сколько вообще это будет стоить. Если подключить к COM порту контроллер, который будет каждые 10мс посылать сигнал, и роботать по прерыванию - может это как-то улучшить ситуацию?
  8. ну да, имел ввиду процесс. Через микроконтролер проблем нет, в боевых условиях так скорее всего и будет, просто хотелось для удобства и наглядности работать с ПК.
  9. Ну дрова родные, других нет. Карта: http://www.moxa.com/product/cp-132.htm
  10. Доброго времени суток. Есть прибор, который должен общаться с компьютером по RS-422 на скорости 921600 б/с. В компьютере стоит МОХА, которая такую скорость обеспечивает. Собственно сами по себе запись и чтение в СОМ порт работают. Но дальше требуется обеспечить обмен с частотой 1000 Гц. То есть каждую милисекунду прибор отправляет 5 байт компьютеру, он их должен обработать и отправить ответ до прихода следующего сообщения. Возможно ли в принципе решить эту задачу под виндос? Даже если я делаю отделный поток с реал тайм приоритетом который занят только чтением из порта, все равно даже близко нет требуемой точности.
×
×
  • Создать...