Newsgroup: it.comp.lang.c
Titolo: temporizzazione precisa 1 sec

ciao a tutti
devo realizzare una temporizzazione precisa di 1 sec o circa (l'importante č
che si possa conoscere con precisione l'intervallo e che l'errore sia minore
dello 0.01%) usando il timer hardware della CPU.
E' possibile??? Come posso fare???
tenete presente che č il mio primo utilizzo di interrupt in c/c++ e che il
programma gira sotto DOS.
ciao


Si', con quell'errore e' probabilmente possibile riprogrammando il timer 
del clock alla max frequenza.
Qui sei pero' off-topic - e io non mi ricordo + nulla di quello che si 
faceva circa 20 anni fa :-)
In ogni caso cerca su google 
http://www.google.it/search?q=dos+reprogramming+timer+interrupt+c
 o 
qualcosa del genere.
PS: per quello che mi ricordo pero'... quando scrivi un interrupt 
handler per DOS fai molta attenzione, oltre a disabilitare e riabilitare 
gli interrupt (asm cli/sti), anche a non utilizzare all'interno chiamate 
al DOS che non sono rientranti (eg. usa chiamate al BIOS per scrivere su 
console).
Ciao
-- 
Cybertoldo
Per rispondermi via email, sostituisci moc.liamg con 
gmail.com


Non ho la piu' pallida idea di come si possa fare una cosa del genere 
sotto DOS, e tra l'altro come ti hanno fatto notare, qui saresti off 
topic (e che come minimo queste cose dipendono da che compilatore usi, 
ma vabbe'), pero' forse (e dico forse perche' mi aspetto di essere 
smentito) c'e' un metodo standard per fare una temporizzazione 
abbastanza precisa, di un secondo.
Se usi time(NULL) ti da' il tempo corente, e aumente di 1 ogni secondo. 
Supponendo che sia preciso, l'unica cosa che devi fare e' 
sincronizzarti... per esempio:
#include <stdio.h>
#include <time.h>
int main() {
	int i;
	time_t now;
	now = time(NULL)+1;
	for(i = 0; i < 20; ++i){
		while(time(NULL) != now);
		now += 1;
		printf(".");
		fflush(stdout);
	}
	return 0;
}
Ovviamente mangia CPU mentre aspetta..
Ciao,
Zeppe


Ho bisognio anch' io di fare una cosa del genere:
l' idea potrebbe essere:
1) con time() memorizzare minuti*60 + secondi in una variabile 
2) fare un loop con un contatore
3) come al punto 1 in un' altra variabile
4) fare la differenza tra i secondi alla fine e quelli all' inizio
5) dividere i secondi con la variabile impostata nel contatore
quello che si ottiene è il tempo per ogni ciclo di loop
*Il valore è macchina-dipendente e quindi dovrebbe essere fatto
una volta e memorizzato su file per gli usi successivi.
*(forse)Sono necessari dei controlli per la differenza tra
lettura iniziale dei secondi e quella finale
*la precisione dipende anche dalle risorse allocate al momento 
dalla macchina, ma per un tempo ragionevolmente lungo potrebbe
andare bene
auguri - S
--  
Postato da Virgilio Newsgroup: scopri i nuovi gruppi 
Eros, foto e video a 
http://newsgroup.eros.virgilio.it

 abbastanza precisa, di un secondo.
Considerazioni sul metodo a parte... senza riprogrammazione del timer, 
se ricordo bene, i PC DOS hanno un interrupt del clock ogni 18 volte al 
secondo circa. E l'OP vuole che l'errore sia minore di 0.01%: la 
risoluzione mi pare che non sia sufficiente.


 risoluzione mi pare che non sia sufficiente.
Nel caso di timer hardware, sotto sistemi come Windows, ad esempio, si può
sfruttare facendo riferimento a funzioni come QueryPerformanceFrequency()
e QueryPerformanceCounter().  Il valore restituio, in realtà, ha un'unità
di misura che varia a secondo del tipo di macchina e del processore (sui
sistemi Pentium-based queste API sfruttano il RTDSC).
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it