Article View: pl.comp.os.linux.programowanie
Article #72850Re: Jak skutecznie odczytać wolne miejsce w buforze nadawczym portu szeregowego?
From: Adam Wysocki
Date: Wed, 11 Jul 2018 19:45
Date: Wed, 11 Jul 2018 19:45
66 lines
3864 bytes
3864 bytes
spryciarzsprytny7@gmail.com wrote: >> 3. Jak select() zwróci writability to wyślij całą kolejkę do write() >> (ale nie więcej, niż SSIZE_MAX bajtów) > > Bufor portu szeregowego w Linux-e to 4KB. Przynajmniej bufor wejściowy > tyle ma... Natomiast SSIZE_MAX to 9223372036854775807 (w Kubuntu 18.10 > jaki mam pod ręką - podejrzewam, że na Raspbianie jest podobnie bo to > też 64 bitowy system - mogę to jutro sprawdzić). Tak więc ZCW te twoje > zastrzeżenie w nawiasie jest bez sensu, bo SSIZE_MAX jest dużo większa > od całej pamięci operacyjnej... Bo to 64-bitowy system. Na 32-bitowym masz 2GB. POSIX gwarantuje 32kB. Sam wysyłam rozsądnie niewielkimi porcjami (zwykle do 4kB lub PIPE_BUF), co by write() za długo nie blokowało kopiując dane z userspace. > W sumie to nie wiem co widzisz w tym złego (w zapisie bajt po bajcie), Zapis bajt po bajcie jest niewydajny. Każdy zapis powoduje przełączenie kontekstu i zwiększa overhead. Zrób prosty benchmark, nawet na dd. [gof@pi ~]$ dd if=/dev/zero of=/dev/null bs=1 count=10000000 10000000+0 records in 10000000+0 records out 10000000 bytes (10 MB) copied, 12.9187 s, 774 kB/s [gof@pi ~]$ dd if=/dev/zero of=/dev/null bs=100 count=100000 100000+0 records in 100000+0 records out 10000000 bytes (10 MB) copied, 0.209594 s, 47.7 MB/s [gof@pi ~]$ dd if=/dev/zero of=/dev/null bs=1000 count=10000 10000+0 records in 10000+0 records out 10000000 bytes (10 MB) copied, 0.0355727 s, 281 MB/s [gof@pi ~]$ dd if=/dev/zero of=/dev/null bs=10000 count=1000 1000+0 records in 1000+0 records out 10000000 bytes (10 MB) copied, 0.00900733 s, 1.1 GB/s Linus kiedyś podsumował to w swoim stylu: https://lkml.org/lkml/2012/7/6/495 > skro jest powiedziane (przez inne guru - link w mojej poprzedniej > wypowiedzi), że w Linux-ie port szeregowy to urządzenie znakowe, a nie > blokowe - przez to nie ma buforów i zapis i odczyt odbywa się po jednym > znaku (tak działa też klawiatura i mysz). Urządzenie znakowe oznacza, że podstawową jednostką transmisji jest w nim bajt a nie, że odczyt i zapis odbywają się po jednym bajcie. Większość (jeśli nie każdy) układów uartopodobnych ma jakąś kolejkę / bufor, żeby móc wysyłać następny bajt zaraz po tym, jak wyślą poprzedni. > W sumie trochę tego nie jarzę, bo można sprawdzić ile danych jest do > odczytu, a nie wiadomo ile można wysłać... Nie spotkałem się z sytuacją, w której potrzebowałbym wiedzieć, ile mogę wysłać danych. Do czego jest Ci taka informacja? Masz do wysłania tyle, ile masz, więc wysyłasz tyle, ile możesz (na ile write() pozwoli). -- [ Email: a@b a=grp b=chmurka.net ] [ Web: http://www.chmurka.net/ ]
Technical Details
Message-ID:
<pi5mpd$sa6$1$gof@news.chmurka.net>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!news.chmurka.net!.POSTED.pi.v.chmurka.net!not-for-mailReferences:
<62ce83e9-ba03-4a59-8f59-6e4acc6ad001@googlegroups.com> <pi4u7m$j0j$1$gof@news.chmurka.net> <b861f107-de90-4db7-8b82-2473d6bfb4e2@googlegroups.com>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!news.chmurka.net!.POSTED.pi.v.chmurka.net!not-for-mail
From: gof@somewhere.invalid (Adam Wysocki)
Newsgroups: pl.comp.os.linux.programowanie
Subject: Re: Jak skutecznie odczytać wolne miejsce w buforze
nadawczym portu szeregowego?
Date: Wed, 11 Jul 2018 19:45:49 +0000 (UTC)
Organization: news.chmurka.net
Message-ID: <pi5mpd$sa6$1$gof@news.chmurka.net>
References: <62ce83e9-ba03-4a59-8f59-6e4acc6ad001@googlegroups.com> <pi4u7m$j0j$1$gof@news.chmurka.net> <b861f107-de90-4db7-8b82-2473d6bfb4e2@googlegroups.com>
NNTP-Posting-Host: pi.v.chmurka.net
Mime-Version: 1.0
Injection-Date: Wed, 11 Jul 2018 19:45:49 +0000 (UTC)
Injection-Info: news.chmurka.net; posting-account="gof"; posting-host="pi.v.chmurka.net:172.24.44.20"; logging-data="28998"; mail-complaints-to="abuse-news.(at).chmurka.net"
User-Agent: tin/2.4.1-20161224 ("Daill") (UNIX) (Linux/4.4.50-v7+ (armv7l))
Cancel-Lock: sha1:b/bVhSM6ndKDJVDdpf4EY3ZUyYU=
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit