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