 مرحبا يا هابر! في هذه المقالة ، أريد أن أتحدث عن حل إحدى المشاكل الشائعة التي يعالجها Embox بشكل أفضل من GNU / Linux. هذا هو وقت الاستجابة لحزمة مرسلة عبر بروتوكول Ethernet. كما تعلم ، فإن السمة الرئيسية لنقل البيانات عبر الشبكة هي عرض النطاق الترددي ، و GNU / Linux يعمل بشكل جيد معها. ولكن عندما يتعلق الأمر بتقليل الوقت الذي يستغرقه تلقي / إرسال حزمة شبكة واحدة ، فقد تنشأ مشاكل. على وجه الخصوص ، كان لدى العميل لوحة DE0-Nano-SoC مع Linux ، وبمساعدة هذا المنتدى ، أردت التحكم في كائن معين عبر الشبكة. طوبولوجيا الشبكة من نقطة إلى نقطة ، لا توجد أجهزة توجيه ومحاور. وفقًا لنموذج التحكم ، يجب أن يكون وقت التفاعل أقل من 100 ،s ، وعلى أساس Linux كان من الممكن تحقيق 500 μs فقط.
مرحبا يا هابر! في هذه المقالة ، أريد أن أتحدث عن حل إحدى المشاكل الشائعة التي يعالجها Embox بشكل أفضل من GNU / Linux. هذا هو وقت الاستجابة لحزمة مرسلة عبر بروتوكول Ethernet. كما تعلم ، فإن السمة الرئيسية لنقل البيانات عبر الشبكة هي عرض النطاق الترددي ، و GNU / Linux يعمل بشكل جيد معها. ولكن عندما يتعلق الأمر بتقليل الوقت الذي يستغرقه تلقي / إرسال حزمة شبكة واحدة ، فقد تنشأ مشاكل. على وجه الخصوص ، كان لدى العميل لوحة DE0-Nano-SoC مع Linux ، وبمساعدة هذا المنتدى ، أردت التحكم في كائن معين عبر الشبكة. طوبولوجيا الشبكة من نقطة إلى نقطة ، لا توجد أجهزة توجيه ومحاور. وفقًا لنموذج التحكم ، يجب أن يكون وقت التفاعل أقل من 100 ،s ، وعلى أساس Linux كان من الممكن تحقيق 500 μs فقط.

لتقدير وقت الإرسال ، نقوم بإنشاء حامل يتكون من مضيفين.
GNU/Linux, — DE0-Nano-SoC Kit Embox. FPGA HPS (Hard Processing System, .. ARM), . , UDP- :
while (1) {
    char buf[BUFLEN];
    recvfrom(s, buf, BUFLEN);    
    sendto(s, buf, BUFLEN);
}
, DE0-Nano-SoC.
, :
for (int i = 0; i < N; i++) {
    char buf_tx[BUFLEN], buf_rx[BUFLEN];
    sprintf(buf_tx, "This is packet %d\n", i);
    time_t time_begin = time_now();
    sendto(s, buf_tx, BUFLEN);
    recvfrom(s, buf_rx, BUFLEN);
    time_t time_end = time_now();
    if (memcmp(buf_tx, buf_rx, sizeof(buf))) {
            printf("%d: Buffer mismatch\n", i);
    }
    if (time_end - time_begin > TIME_LIMIT) {
            printf("Slow answer #%d: %d\n", i, time_end - time_begin);
    }
}
, .
Github.
, , :
500 000 ( ) :
Avg: 4.52ms
Min: 3.12ms
Max: 12.24ms
, , — . , Linux . , .
, ? , .
, - , , ? — .
, ethernet- — USB-, 100/, .
1 :
Avg: 0.08ms
Min: 0.07ms
Max: 4.31ms
Linux
Linux. -: arm-linux-gnueabihf-gcc server.c -O2. ELF :
Avg: 0.77ms
Min: 0.74ms
Max: 5.31ms
, Embox "" 9 , !
, "", , .
, , , UDP- .
, UDP-.
, UDP . , . . :
int net_tx(...) {
    if (is_udp_packet()) {
        timestamp2 = timer_get();
        memcpy(packet[UDP_OFFT],
            ×tamp1,
            sizeof(timestamp1));
        memcpy(packet[UDP_OFFT + sizeof(timestamp2)],
            ×tamp2,
            sizeof(timestamp2));
        ...
    }
}
, , , Embox.
Avg: 8673
Min: 6191 
Max: 11950
, ( ) 25%, (Avg: 0.08ms Max: 4.31ms). ( , , , ), . , , 25%.
, ?
— Linux, .
?
, — :
nice -n -20 ./client
— , , .
— round robin , chrt:
chrt --rr 99 ./client
— . ( , .. ).

Embox , 10 . , , . , Linux, - bpfilter.
- — embox-devel@googlegroups.com, -, .