PDA

View Full Version : [C] temporizzazione al microsecondo


gurutech
07-12-2003, 13:50
Ciao,
ho collegato un convertitore A/D alla porta parallela, e adesso, sotto linux, devo acquisire i dati.
Ho bisogno però di misurare *esattamente* i tempi tra una conversione e l'altra con una precisione minima delle decine di microsecondi.

una cosa del genere si chiama applicazione real-time giusto? ho installato la patch del kernel RTAI (http://www.aero.polimi.it/~rtai/), qualcuno mi può dare due dritte su come si programma una cosa del genere (se si può fare) ?

finora ho programmato quello che vedete in allegato

ilsensine
09-12-2003, 15:20
Originariamente inviato da gurutech
Ho bisogno però di misurare *esattamente* i tempi tra una conversione e l'altra con una precisione minima delle decine di microsecondi.

Dal tuo programma dedurrei che hai bisogno di impostare esattamente un tempo di latenza, non di misurare un intervallo di tempo...

gurutech
09-12-2003, 16:25
in questo ciclo

for(i=0;i>-1;i++) {
/* impostare a 0 il bit da accendere */
frob.mask = PARPORT_CONTROL_STROBE;
frob.val = 0;
ioctl (fd, PPFCONTROL, &frob);
usleep(1);

frob.mask = PARPORT_CONTROL_STROBE;
frob.val = 1;
ioctl (fd, PPFCONTROL, &frob);
usleep(1);
ioctl (fd, PPRDATA, &data);
voltage=data*19.6;
sprintf(buf,"%d * %d mV\n",i,voltage);
write(STDOUT_FILENO, buf, strlen(buf));
}


ho bisogno di sapere quanto passa con precisione tra un i e l'altro. inoltre ho scoperto che usleep non va bene perchè mi mette il processo a nanna per molto di più di un microsecondo.

in ogni caso adesso vedo di cavarmela a livello hardware creando qualcosa che possa essere digerito da comedi_parport, attualmente il mio circuito non va bene perchè uso la porta in maniera bidir (TRISTATE) per leggere 8 bit alla volta, mentre in comedi (http://www.comedi.org) si usa la parallela in maniera semplice e si prendono i bit 4 alla volta NON dalle data lines ma dalle status line.

ilsensine
09-12-2003, 16:30
Originariamente inviato da gurutech
ho bisogno di sapere quanto passa con precisione tra un i e l'altro.
gettimeofday
inoltre ho scoperto che usleep non va bene perchè mi mette il processo a nanna per molto di più di un microsecondo.
usleep è implementato fisicamente con nanosleep (v. man), che ti consiglio di usare al suo posto. Per ottenere una granularità fine, devi usare una priorità realtime (v. sched_setscheduler) in modo da non causare l'interruzione del processo per nanosleep inferiori ai 2 ms.

L'intervallo che misuri utilizzando lo scheduler normale è in effetti l'intervallo di scheduling tra i processi.