Oppure

Loading
31/03/13 22:14
LittleHacker
Ciao a tutti, sto tentando ti capire come posso far funzionare il mio Delay ugualmente su tutte le macchine!
Il codice che uso è questo:

#define delayms(X) if(X) { unsigned long int i=0; for (i=0; i<X*100000; i++); }

#define delays(X) if(X) { delayms(1000*X); }


Inserisco delays(10);
QEMU: 10 Secondi
VirtualBox: 13 Secondi
Computer: 2 Secondi

Vorrei capire come posso farlo funzionare ugualmente su tutte le macchine, cioè:

Inserisco dealys(10);
QEMU: 10 Secondi
VirtualBox: 10 Secondi
Computer: 10 Secondi

Ho già provato con questo codice: code.google.com/p/osdev/source/browse/trunk/gazos-0.1/…, ma con questo resta in loop!

Potreste darmi una mano?
Grazie! :k:
aaa
01/04/13 7:33
HeDo
non puoi assolutamente farlo in questo modo.
devi usare la primitiva RDTSC en.wikipedia.org/wiki/…
aaa
01/04/13 10:46
Oppure potresti ottenere la frequenza, e ripetere con un ciclo for determinate istruzioni, sapendo che ogni volta che si esegue il ciclo for usi X cicli di clock e devi fermarti dopo averne eseguiti Y.
01/04/13 21:20
HeDo
Postato originariamente da TheDarkJuster:

Oppure potresti ottenere la frequenza, e ripetere con un ciclo for determinate istruzioni, sapendo che ogni volta che si esegue il ciclo for usi X cicli di clock e devi fermarti dopo averne eseguiti Y.


si, a parità di architettura, di versione di compilatore e di ottimizzazioni presenti.
praticamente infattibile.

aaa
02/04/13 5:37
LittleHacker
Postato originariamente da HeDo:

Postato originariamente da TheDarkJuster:

Oppure potresti ottenere la frequenza, e ripetere con un ciclo for determinate istruzioni, sapendo che ogni volta che si esegue il ciclo for usi X cicli di clock e devi fermarti dopo averne eseguiti Y.


si, a parità di architettura, di versione di compilatore e di ottimizzazioni presenti.
praticamente infattibile.



Ok, grazie a tutti e due per le risposte, comunque ho optato per quella di HeDo!

Sapendo che dovevo fare solo un piccolo Delay e non l'orologio atomico :D
Ho fatto così(ancora spartano):

cycles_t currentcycles() {
    cycles_t result;
    __asm__ __volatile__ ("rdtsc" : "=A" (result));
    return result;
}

void DelayMs (int ms)
{
	cycles_t t1 = currentcycles();
	for(int i=0;i<10;i++);
	cycles_t t2 = currentcycles();

	cycles_t t = (t2 - t1) * ms;
	cycles_t i;	

	for (i=0;i<t;i++);	
}


Se c'è qualcosa potete dirmelo!
Grazie :k:
aaa