Posted By: Quasimodo (Quasimodo) on 'CZprogram'
Title:     Re: Jak se dostat pod 55ms? (RT-linux)
Date:      Thu Feb 21 15:03:14 2002

>  >   Nojo, jsem mamlas, pod Linuxem to hazi krasne po milisecundach! Tak to
> uz
> > me 
> > to netrapi, cert vem Okna. Dik za podnety :-)
> Pod linuxem na intelu jede casovac na 100Hz (10ms), na alfach je nastaven na
> 
> 1kHz. Obecne ma linux celkem problemy cekat kratsi dobu, nez je frekvence 
> casovace. Jedna z moznosti je prekompilovat jadro se zmenenou konstantou HZ,
> 
> na nejake pokusy jsem pouzival linux s 1kHz a fungovalo to bez problemu(nebo
> 
> jsem si spis zadnych nevsiml, nektere casti jadra pouzivaji jine konstanty 
> nebo predpokladaji tvrde 100Hz). 
> 
> Dalsi moznosti by mohlo byt pouzit RTLinux 
> 
> >                 David Navara (kdysi Sky) - www.nuabi.com 
> Xyster
No, pod rtlinuxem se da cas zjistit s presnosti na nanosekundy - gethrtime() 
vraci cas od startu systemu v nanosekundach, hrtime_t je 64bitovy int, takze 
to hned tak nepretece. Je mozne spoustet s presnosti na nanosekundy pomoci 
pthread_make_periodic nebo trosku nebezpecneji rt_task_make_periodic. 
ALE jenom v modulu. V userspace aplikaci rtlinux nenabizi pro casovani nic 
navic. Lze pouzit std linuxovou fci usleep nebo nanosleep, ale to je znamena 
prepnuti kontextu na nejmene uvedenou dobu a ne na prave uvedenou dobu, navic 
je mozne preruseni signalem. Jednoduchy programek

#include <unistd.h>
#include <time.h>
#include <sys/time.h>
#include <iostream>

int main()
{
        struct timespec treq, trem;
        struct timeval tbefore, tafter;
        treq.tv_sec = 0;
        treq.tv_nsec = 1;
        trem = treq;
        // Samotne mereni
                gettimeofday(&tbefore,0);
                nanosleep(&treq, &trem);
                gettimeofday(&tafter,0);
        long long before, after;
        before = tbefore.tv_usec + tbefore.tv_sec * 1000000;
        after = tafter.tv_usec + tafter.tv_sec * 1000000;
        cout << after - before << endl;
        return 0;
} 

bude vracet v zavislosti na HW ruzne velka cisla v mikrosekundach. Radove se 
ale bude jednat o desitky tisic. (Na mem P3/933 od 13000 do 22000, kdyz 
bezel jen tento jediny proces a par cekajicich xtermu).
 Obavam se, ze pokud clovek nepouzije sleep a bude zajistovat cekani cyklem, 
dokud se nedocka jiste hodnoty, osklive narazi na neocekavana prepnuti 
kontextu. Proste pokud je zapotrebi pracovat s nejakymi garantovanymi casy, 
bude nutne sahnout bud po modulu nebo pracovat v single-task OS. Urcite reseni 
by mohlo byt spise QNX - pro nekomercni vyuziti je, myslim, zdarma. 
-
Clovek je nejpomalejsi zname zarizeni typu I/O.
                                                                 Quasimodo

Search the boards