Halo, Habr! Pada artikel ini, saya ingin berbicara tentang menyelesaikan salah satu masalah umum yang ditangani Embox lebih baik daripada GNU / Linux. Ini adalah waktu respons terhadap paket yang dikirim melalui protokol Ethernet. Seperti yang Anda ketahui, karakteristik utama pengiriman data melalui jaringan adalah bandwidth, dan GNU / Linux baik-baik saja dengan itu. Tetapi ketika datang untuk mengurangi waktu yang diperlukan untuk menerima / mengirim paket jaringan tunggal, masalah dapat muncul. Secara khusus, pelanggan memiliki board DE0-Nano-SoC dengan Linux, dan dengan bantuan board ini saya ingin mengontrol objek tertentu melalui jaringan. Topologi jaringan adalah point-to-point, tidak ada router dan hub. Menurut model kontrol, waktu reaksi harus kurang dari 100 ΞΌs, dan berbasis Linux dimungkinkan hanya mencapai 500 ΞΌs.
![DE0 Nano SoC kit](https://habrastorage.org/getpro/habr/post_images/fe6/db7/a7c/fe6db7a7cb57bfe84646617024363824.jpg)
Untuk memperkirakan waktu transmisi, kami membuat dudukan yang terdiri dari dua host.
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
β . ( , .. ).
![](https://habrastorage.org/webt/rt/_f/cu/rt_fcuaj1cqxz6rzxy_gtvlxdwa.png)
Embox , 10 . , , . , Linux, - bpfilter.
- β embox-devel@googlegroups.com, -, .