Получение пакетов UDP в реальном времени с помощью ОСРВ QNX

У меня есть источник, который отправляет пакеты UDP со скоростью 819,2 Гц (~1,2 мс )на мою машину QNX Neutrino. Я хочу получать и обрабатывать эти сообщения с минимально возможной задержкой и дрожанием.

Мой первый код был в основном:

SetupUDPSocket(); 
while (true) {
    recv(socket, buffer, BufferSize, MSG_WAITALL); // blocks until whole packet is received
    processPacket(buffer);
}

Проблема в том, что recv ()только проверяет при каждом такте системного таймера наличие нового доступного пакета. Такт таймера обычно составляет 1 мс. Итак, если я использую это, я получу огромный джиттер, потому что я обрабатываю пакет каждые 1 мс или каждые 2 мс. Я мог бы сбросить размер тиков таймера, но это повлияет на всю систему (и другие таймеры других процессов и т. д. ). И у меня все равно будет джиттер, потому что я точно никогда не совпаду с 819,2 Гц.

Итак, я попытался использовать линию прерывания сетевой карты (5 ).Но похоже, что есть и другие вещи, которые вызывают прерывание. Раньше я следовал коду:

ThreadCtl(_NTO_TCTL_IO, 0);
SIGEV_INTR_INIT(&event);
iID = InterruptAttachEvent(IRQ5, &event, _NTO_INTR_FLAGS_TRK_MSK);

while(true) {
    if (InterruptWait(0, NULL) == -1) {
        std::cerr << "errno: " << errno << std::endl;
    }

    length = recv(socket, buffer, bufferSize, 0); // non-blocking this time

    LogTimeAndLength(); 

    InterruptUnmask(IRQ5, iID;
} 

Это приводит к одному успешному чтению в начале, за которым следуют чтения с длиной 0 байт после прохождения 0 времени. Похоже, что после выполнения InterruptUnmask ()InterruptWait ()вообще не ждет, значит уже должно быть новое прерывание (или такое же?! ).

Можно ли сделать что-то подобное с линией прерывания сетевой карты? Есть ли другие возможности принимать пакеты на частоте 819,2 Гц?

Немного информации о сетевой карте :'pci -vvv' выходы:

Class          = Network (Ethernet)
Vendor ID      = 8086h, Intel Corporation 
Device ID      = 107ch,  82541PI Gigabit Ethernet Controller
PCI index      = 0h
Class Codes    = 020000h
Revision ID    = 5h
Bus number     = 4
Device number  = 15
Function num   = 0
Status Reg     = 230h
Command Reg    = 17h
I/O space access enabled
Memory space access enabled
Bus Master enabled
Special Cycle operations ignored
Memory Write and Invalidate enabled
Palette Snooping disabled
Parity Error Response disabled
Data/Address stepping disabled
SERR# driver disabled
Fast back-to-back transactions to different agents disabled
Header type    = 0h Single-function
BIST           = 0h Build-in-self-test not supported
Latency Timer  = 40h
Cache Line Size= 8h un-cacheable
PCI Mem Address = febc0000h 32bit length 131072 enabled
PCI Mem Address = feba0000h 32bit length 131072 enabled
PCI IO Address  = ec00h length 64 enabled
Subsystem Vendor ID = 8086h
Subsystem ID        = 1376h
PCI Expansion ROM = feb80000h length 131072 disabled
Max Lat        = 0ns
Min Gnt        = 255ns
PCI Int Pin    = INT A
Interrupt line = 5
CPU Interrupt  = 5h
Capabilities Pointer = dch
Capability ID        = 1h - Power Management
Capabilities         = c822h - 28002000h
Capability ID        = 7h - PCI-X
Capabilities         = 2h - 400000h
Device Dependent Registers:
0x040:  0000 0000 0000 0000   0000 0000 0000 0000 
...
0x0d0:  0000 0000 0000 0000   0000 0000 01e4 22c8 
0x0e0:  0020 0028 0700 0200   0000 4000 0000 0000 
0x0f0:  0500 8000 0000 0000   0000 0000 0000 0000 

и выходы nicinfo:

wm1: 
    INTEL 82544 Gigabit (Copper) Ethernet Controller

    Physical Node ID........................... 000E0C C5F6DD
    Current Physical Node ID................... 000E0C C5F6DD
    Current Operation Rate..................... 100.00 Mb/s full-duplex
    Active Interface Type...................... MII
    Active PHY address....................... 0
    Maximum Transmittable data Unit............ 1500
    Maximum Receivable data Unit............... 0
    Hardware Interrupt......................... 0x5
    Memory Aperture............................ 0xfebc0000 - 0xfebdffff
    Promiscuous Mode........................... Off
    Multicast Support.......................... Enabled

Спасибо за чтение!

8
задан jan 9 August 2012 в 10:51
поделиться