abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
dnes 10:20 | Zajímavý článek

Pavel Tišnovský se v dvoudílném článku na MojeFedora.cz věnuje bitmapovým (rastrovým) grafickým editorům ve Fedoře. V prvním dílu se věnuje editorům MyPaint, MtPaint, Pinta, XPaint, Krita a GIMP. V pokračování pak editorům GNU Paint (gpaint), GrafX2, KolourPaint, KIconEdit a Tux Paint.

Ladislav Hagara | Komentářů: 0
včera 17:11 | Komunita

Byl proveden bezpečnostní audit svobodného IMAP a POP3 serveru Dovecot (Wikipedie). Audit byl zaplacen z programu Mozilla Secure Open Source a provedla jej společnost Cure53. Společnost Cure53 byla velice spokojena s kvalitou zdrojových kódu. V závěrečné zprávě (pdf) jsou zmíněny pouze 3 drobné a v upstreamu již opravené bezpečnostní chyby.

Ladislav Hagara | Komentářů: 0
včera 15:30 | IT novinky

Nadace Raspberry Pi představila na svém blogu Raspberry Pi Compute Module 3 (CM3 a CM3L), tj. zmenšené Raspberry Pi vhodné nejenom pro průmyslové využití. Jedná se o nástupce Raspberry Pi Compute Module (CM1) představeného v dubnu 2014. Nový CM3 vychází z Raspberry Pi 3 a má tedy dvakrát více paměti a desetkrát větší výkon než CM1. Verze CM3L (Lite) je dodávána bez 4 GB eMMC flash paměti. Uživatel si může připojit svou vlastní. Představena byla

… více »
Ladislav Hagara | Komentářů: 0
včera 01:23 | Nová verze

Oficiálně bylo oznámeno vydání verze 3.0 multiplatformního balíku svobodných kancelářských a grafických aplikací Calligra (Wikipedie). Větev 3 je postavena na KDE Frameworks 5 a Qt 5. Krita se osamostatnila. Z balíku byly dále odstraněny aplikace Author, Brainstorm, Flow a Stage. U Flow a Stage se předpokládá jejich návrat v některé z budoucích verzí Calligry.

Ladislav Hagara | Komentářů: 6
15.1. 15:25 | Nová verze

Bylo oznámeno vydání první RC (release candidate) verze instalátoru pro Debian 9 s kódovým názvem Stretch. Odloženo bylo sloučení /usr jako výchozí nastavení v debootstrap. Vydán byl také Debian 8.7, tj. sedmá opravná verze Debianu 8 s kódovým názvem Jessie.

Ladislav Hagara | Komentářů: 6
15.1. 13:37 | Zajímavý projekt

1. ledna byl představen projekt Liri (GitHub). Jedná se o spojení projektů Hawaii, Papyros a původního projektu Liri s cílem vyvíjet operační systém (linuxovou distribuci) a aplikace s moderním designem a funkcemi. Včera byl představen Fluid 0.9.0 a také Vibe 0.9.0. Jedná se o toolkit a knihovnu pro vývoj multiplatformních a responzivních aplikací podporující Material Design (Wikipedie) a volitelně také Microsoft Design Language (designový jazyk Microsoft) [reddit].

Ladislav Hagara | Komentářů: 8
14.1. 00:33 | Zajímavý software

Google na svém blogu věnovaném open source představil knihovnu pro komprimaci a dekomprimaci 3D grafiky s názvem Draco. Knihovna bude využívána například v aplikacích pro virtuální a rozšířenou realitu. Porovnání Draco s gzip na YouTube. Zdrojové kódy Draco jsou k dispozici na GitHubu pod licencí Apache 2.0.

Ladislav Hagara | Komentářů: 5
13.1. 17:27 | IT novinky

V loňském roce proběhla úspěšná kampaň na Indiegogo na podporu GPD Win. Jedná se o malý 5,5 palcový notebook a přenosnou herní konzoli v jednom. Předinstalované Windows 10 lze nahradit Linuxem. V únoru by se na Indiegogo měla objevit kampaň na podporu 7 palcového notebooku GPD Pocket.

Ladislav Hagara | Komentářů: 36
13.1. 02:00 | Nová verze

Po pěti měsících od vydání verze 1.0.0 (zprávička) byla vydána verze 2.0.0 frameworku Kirigami (HIG) pro vytváření uživatelských rozhraní mobilních a konvergentních aplikací nad toolkitem Qt. Pro vyzkoušení je určena aplikace pro Android Kirigami gallery.

Ladislav Hagara | Komentářů: 0
12.1. 23:28 | Zajímavý software

Akční hra Lugaru HD od Wolfire Games (recenze) byla uvolněna jako svobodný software, a to včetně dat (pod licencí Creative Commons Attribution – Share Alike). Linuxový port byl v roce 2010 součástí první akce Humble Indie Bundle a engine byl krátce poté uvolněn pod licencí GNU GPL, což vedlo mj. k portu na AmigaOS. Autor mezitím pracuje na pokračování nazvaném Overgrowth.

Fluttershy, yay! | Komentářů: 0
Jak se stavíte k trendu ztenčování přenosných zařízení (smartphony, notebooky)?
 (10%)
 (2%)
 (74%)
 (3%)
 (10%)
Celkem 301 hlasů
 Komentářů: 24, poslední dnes 10:14
    Rozcestník
    Reklama

    Dotaz: C/C++ presnost usleep

    9.7.2010 08:44 toxLinuch
    C/C++ presnost usleep
    Přečteno: 1723×
    Pekny den panove, programuju api pro cteni teploty z cidla DS18B20 a cidlo se mi neoziva. Postupuje dle datasheetu. Jediny problem, ktery me napada je casovani. Jelikoz jsou pro komunikaci po 1Wire potrebne presne casove useky v radech mikrosekund. Je tedy usleep dostatecne presne? Jedu na CentOS. Pro pripojeni uzivam COM port. Prisup k portu prez ioperm a pak outb inb.
    
    #define PORT 0x3f8
    #define OFFSET_RIZENI_M 4
    
    outb (0x00, PORT+OFFSET_RIZENI_M);    //nuluj registr rizeni modemu
    
    log1 (PORT+OFFSET_RIZENI_M);          // inicializace sbernice a poskytnuti napajeni po dobu 1ms
    usleep (1000);
    
    log0 (PORT+OFFSET_RIZENI_M);          //-|master reset
    usleep (500);                         //_|
                                                                                   
    log1 (PORT+OFFSET_RIZENI_M);          //-uvolnit sbernici
    usleep (70); 
    
    statusCTS=inb (PORT+OFFSET_STAV_M);
    if ((statusCTS & CTS_BIT)==0x00)      //-je nula na sbernici
       printf ("Ozval se\n");
    
    
    

    Řešení dotazu:


    Odpovědi

    9.7.2010 08:54 toxLinuch
    Rozbalit Rozbalit vše Re: C/C++ presnost usleep
    Příloha:
    jeste prikladam schema zapojeni
    Josef Kufner avatar 16.7.2010 10:07 Josef Kufner | skóre: 66
    Rozbalit Rozbalit vše Re: C/C++ presnost usleep
    A co tam mezi sériový port a samotnou sběrnici vložit ještě nějaký levný málonožičkový jednočip, který by se postaral o řízení sběrnice a převod dat z/na standardní sériový přenos?
    Hello world ! Segmentation fault (core dumped)
    23.7.2010 11:57 Sfinx
    Rozbalit Rozbalit vše Re: C/C++ presnost usleep
    Taky si myslim, ze treba obyc atmega8 by tyhle problemy vyresila. Jednou jsem to resil a mam nekde i fungujici kod pro cteni z cidel a zapis na USART nebo na SD kartu. V pripade zajmu muzu poskytnout.
    9.7.2010 09:11 fraxinus | skóre: 20 | blog: fraxinus
    Rozbalit Rozbalit vše Re: C/C++ presnost usleep
    Pokial nepouzivas realtime kernel, myslim ze spravneho casovania nebude garantovane nikdy
    9.7.2010 10:02 toxLinuch
    Rozbalit Rozbalit vše Re: C/C++ presnost usleep
    Takze mam si stahnout vanila kernel a pak do nej naprat patch na RT prelozit a mam garantovanou presnost?
    9.7.2010 10:22 fraxinus | skóre: 20 | blog: fraxinus
    Rozbalit Rozbalit vše Re: C/C++ presnost usleep
    No, napr. Ubuntu Studio (8.04, 9.10) ma realtime kernel ale neviem ci ti to pomoze, pisu tam 5-10ms ale neviem coho sa to tyka ci prepinania procesov alebo coho. Najlepsie by bolo zmerat to osciloskopom.
    9.7.2010 13:39 hajoucha | skóre: 21
    Rozbalit Rozbalit vše Re: C/C++ presnost usleep
    radši si to přečti ještě jednou. Těch 5-10ms je to, co je schopen člověk zaznamenat (asi při poslechu). Na takové doby totiž nepotřebuješ real-time. 5-10ms dostaneš na běžném (tj. _ne_ RT) kernelu.
    9.7.2010 13:41 hajoucha | skóre: 21
    Rozbalit Rozbalit vše Re: C/C++ presnost usleep
    no, RT-kernel pomůže, pak je ještě potřeba dát svému procesu tu správnou RT prioritu. Jestli to "pomůže dostatečně" tj. jestli Ti pak bude fungovat to monitorování - to netuším. Otázkou však není, jestli to bude nebo nebude fungovat. Otázkou je, jestli máš na výběr.
    21.7.2010 20:32 Peter Fodrek | skóre: 9
    Rozbalit Rozbalit vše Re: C/C++ presnost usleep
    treba pouzit RTAI https://www.rtai.org/ a hlavne casovace nie sleep

    casovace RTAI maju rozlisenie bud podla HW obvodov (i8255 alebo APIC) alebo podla tikov CPU maximalna nepresnost casovaca RTAI je 15 mikrosekund

    Pripadne sa da priplatit(1999 USD/rok na vyvoj na jednej architekure alebo 4999 USD/rok za 5 architektur) si za RTLinuxPRO, ktory sa teraz vola WindRiver Linux, ktory ma maximlanu nepresnost 48 nanosekund, co je na hranici HW moznosti, ked si uvedomime, ze mozu nastat 3x citanie a jeden zapis do RAM..

    9.7.2010 10:42 M_P
    Rozbalit Rozbalit vše Re: C/C++ presnost usleep
    Mozna bude lepsi neproslapavat uz hotovou cestu a podivat se jak to delaji ti co jim to funguje... viz www.owfs.org

    M.
    10.7.2010 13:34 Radovan
    Rozbalit Rozbalit vše Re: C/C++ presnost usleep
    10.7.2010 14:06 Tom K | skóre: 20
    Rozbalit Rozbalit vše Re: C/C++ presnost usleep
    Ahoj
    Planovac bezi vetsinou na frekvenci do 1000Hz a tezko se da pocitat s tim, ze se probudi presne za 70us. Na useky do 10000us bych (v pripade, ze se nepouzivaji nejak casto). Radeji pouzival aktivni cekani pres gettimeofday().
    echo -n "u48" | sha1sum | head -c3; echo
    15.7.2010 09:07 toxLinuch
    Rozbalit Rozbalit vše Re: C/C++ presnost usleep
    chlape kurna moc ti dekuju ani nevys jak moc si mi pomohl.
    Shrnuti: usleep - nepresne (opravdu se to neblizi usekundam
    nanosleep - stejny bazmek jako usleep
    Reseni: gettimeofday v cyklu
    
    void __usleep_test02 (int usecond) {                                                                                                                 
      struct timeval ts,te;                    //ts-time start; te-time end
    
      gettimeofday(&ts, NULL);                 //read start time in usec
      do { 
          gettimeofday(&te, NULL);             //read end time in usec
      } while (te.tv_usec<ts.tv_usec+usecond); //when te(time end) < ts(time start) + usecond
    } 
    casovani je naprosto presne a cip se ozval jak ma.
    16.7.2010 13:18 pht | skóre: 48 | blog: pht
    Rozbalit Rozbalit vše Re: C/C++ presnost usleep
    Ten cyklus je ale špatně protože nepočítá s přetečením tv_usec.

    Jinak přesnost usleep (a i gettimeofday) záleží na tom, jak je nastavený časovač a jakou má prioritu váš proces. Mikrosekunda je z pohledu systému už docela dlouho, takže při správném nastavení by to mělo být v pohodě.
    In Ada the typical infinite loop would normally be terminated by detonation.
    16.7.2010 13:45 Tom K | skóre: 20
    Rozbalit Rozbalit vše Re: C/C++ presnost usleep
    Ten cyklus ma spravny v pripade, ze nebude mit cekani delsi nez 1s (v pripade, ze mu to nekdo preplanuje a ono to pretece, tak uz na tom vlastne nezalezi a casem se mu to vzbudi stejne).

    Ta pasaz s casovacem mne velmi zaujala a poprosil bych o rozvedeni. Mikrosekunda je z puhledu systemu cca 1000-2000 instrukci CPU a to neni az tak mnoho.
    echo -n "u48" | sha1sum | head -c3; echo
    16.7.2010 16:53 pht | skóre: 48 | blog: pht
    Rozbalit Rozbalit vše Re: C/C++ presnost usleep
    Příloha:
    Ten cyklus ma spravny v pripade, ze nebude mit cekani delsi nez 1s (v pripade, ze mu to nekdo preplanuje a ono to pretece, tak uz na tom vlastne nezalezi a casem se mu to vzbudi stejne).

    Ne, zatuhne to. Dejme tomu: ts.tv_usec == 999999 a usecond == 3: bude se čekat až te.tv_usec >= 1000002, což nemůže nikdy nastat. Doporučuji alespoň následující, s tím, že nemůžete zadat usecond > 999999.
    void __usleep_test02(int usecond) {
            struct timeval tv;
            time_t target_sec;
            suseconds_t target_usec;
    
            gettimeofday(&tv, NULL);
            target_sec = tv.tv_sec;
            target_usec = tv.tv_usec + usecond;
            if (target_usec >= 1000000) {
                    target_sec++;
                    target_usec -= 1000000;
            }
    
            while ((tv.tv_usec < target_usec) || (tv.tv_sec < target_sec)) {
                    gettimeofday(&tv, NULL);
            }
    }
    
    Ta pasaz s casovacem mne velmi zaujala a poprosil bych o rozvedeni. Mikrosekunda je z puhledu systemu cca 1000-2000 instrukci CPU a to neni az tak mnoho.
    No, základem všeho je si zajistit RT prioritu procesoru (SCHED_FIFO), jinak se můžete jít koulet - jádro do Vaší čekačky přepne jiný proces a místo 2 us čekáte třeba 20 ms. Pokud máte RT prioritu, tak se to nestane, na druhou stranu jelikož standardní jádro není hard-RT, tak stejně nemáte 100% jistotu, ale už máte aspoň něco, s čím se dá rámcově počítat.

    Samotné čekání pak můžete udělat metodou busy wait - tj. tak jak to je naznačeno výše, čekáním v úzké smyčce na ten správný okamžik. Zablokujete tím kompletně jedno jádro procesoru, proto je potřeba vážit kdy a jak se tento postup nasadí. V defaultním nastavení linuxu je proti kompletnímu zablokování pojistka:
    $ cat /proc/sys/kernel/sched_rt_period_us
    1000000
    $ cat /proc/sys/kernel/sched_rt_runtime_us
    950000
    
    ... což znamená, že i přes RT prioritu bude váš proces donucen ke spánku pokud sežere více než 950000 us z 1000000 us okna (hodnoty v proc lze samozřejmě upravovat). To znamená že na jednoprocesorovém stroji budete mít šanci odladit tu chybně napsanou funkci na čekání :)

    Otázkou může být jak je jádro schopné říct kolik je přesně gettimeofday(). V linuxu jsou 2 časovače - clock source a event source. První lze jen číst a druhý lze i programovat na odeslání interruptu za nějakou dobu. Event source je obvykle podstatně méně přesný. Klasický časovač má 1000 Hz, HPETy mají v řádu MHz. Clock source má v optimálním případě přesnost 1 cyklu procesoru. Funkce gettimeofday() funguje tak, že se podívá na globální proměnnou kde je informace o čase posledního eventu a přičte k ní aktuální offset z clock source. Samozřejmě než se poté vyšaší přepnutí z kernel režimu do userspace atd. tak ještě nějaký čas uteče ale obvykle je to o dost méně než ta 1 us která nás zajímá. (Pro ultra přesné časování nesmíte volat funkce kernelu, ale vystačit si třeba s čtením TSC přímo v programu, což je zdroj dalšího opruzu...)

    Na druhou stranu pokud zavoláte nanosleep() tak si jádro dá určitou práci s tím, aby nastavilo event source jak nejlépe to jde (tam je toho dost, je potřeba váš časovač zařadit do RB stromu a kdovíco ještě) a pak si dá CPU voraz, takže skutečně tu mikrosekundu spíte. Bohužel kvůli různým overheadům a granularitě event sourcu budete mít trochu horší výsledky než u busy wait, na druhou stranu šetříte lesy :)

    Udělal jsem nějaké rychlé testy (viz přiložený program) a zdá se, že se výše popsané potvrzuje. Busy wait sežere 100% cpu a do 2ms okna se netrefí třeba 200x ze 100 000 pokusů. Na druhou stranu nanosleep nežere skoro nic, ale má overhead, se kterým musíte dopředu počítat a díky tomu trochu větší rozptyl.

    In Ada the typical infinite loop would normally be terminated by detonation.
    18.7.2010 14:56 Tom K | skóre: 20
    Rozbalit Rozbalit vše Re: C/C++ presnost usleep
    Prilozeny program mi rika, ze v pripade nanosleep se netrefi do timeoutu 2us priblizne v 20% pripadu: PASS/FAIL: 80454/19546, kdezto aktivni cekani se netrefi v cca 6% pripadu. Ono bude dost zalezet na tom, kde to vlastne pobezi, na jake verzi jadra, jestli bude k dispozici HPET a podobne veci, takze na takove kratke useky je aktivni cekani vhodnejsi.

    Cist TSC bych radeji nedoporucoval, protoze se chova na ruznych architekturach jinak (napriklad na amd64 se jeho frekvence snizuje se zmenou frekvence CPU, kdezto na Intel x86_64 je jeho frekvence konstantni nezavisle na frekvenci CPU).
    echo -n "u48" | sha1sum | head -c3; echo
    18.7.2010 20:25 pht | skóre: 48 | blog: pht
    Rozbalit Rozbalit vše Re: C/C++ presnost usleep
    kdezto aktivni cekani se netrefi v cca 6% pripadu
    ... aspoň je vidět, že ani tahle metoda neni samospásná.
    na jake verzi jadra
    Pokud se pamatuju dobře, tak precizní časování se předělávalo někde kolem verze 2.6.17.
    na takove kratke useky je aktivni cekani vhodnejsi
    Staré glibc uměly při volání nanosleep automaticky aktivně čekat do 2 mikrosekund pokud měl program RT prioritu, z novějších verzí to vyhodili.
    Cist TSC bych radeji nedoporucoval, protoze se chova na ruznych architekturach jinak
    Není to věc architektury ale konkrétního modelu CPU. Já mám jeden celkem nový amd64 procesor a používá se dynamická změna rychlosti a TSC funguje dobře.
    In Ada the typical infinite loop would normally be terminated by detonation.

    Založit nové vláknoNahoru

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.