Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - [OSDEV] Delay...che casino!
Forum - C/C++ - [OSDEV] Delay...che casino!

Avatar
LittleHacker (Member)
Guru


Messaggi: 1033
Iscritto: 28/04/2009

Segnala al moderatore
Postato alle 0:14
Lunedì, 01/04/2013
Ciao a tutti, sto tentando ti capire come posso far funzionare il mio Delay ugualmente su tutte le macchine!
Il codice che uso è questo:

Codice sorgente - presumibilmente C++

  1. #define delayms(X) if(X) { unsigned long int i=0; for (i=0; i<X*100000; i++); }
  2.  
  3. #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: https://code.google.com/p/osdev/source/browse/trunk/gazos-0 ..., ma con questo resta in loop!

Potreste darmi una mano?
Grazie! :k:

PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2765
Iscritto: 21/09/2007

Segnala al moderatore
Postato alle 9:33
Lunedì, 01/04/2013
non puoi assolutamente farlo in questo modo.
devi usare la primitiva RDTSC http://en.wikipedia.org/wiki/Time_Stamp_Counter

PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 12:46
Lunedì, 01/04/2013
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.

PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2765
Iscritto: 21/09/2007

Segnala al moderatore
Postato alle 23:20
Lunedì, 01/04/2013
Testo quotato

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.


PM Quote
Avatar
LittleHacker (Member)
Guru


Messaggi: 1033
Iscritto: 28/04/2009

Segnala al moderatore
Postato alle 7:37
Martedì, 02/04/2013
Testo quotato

Postato originariamente da HeDo:

Testo quotato

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):

Codice sorgente - presumibilmente C/C++

  1. cycles_t currentcycles() {
  2.     cycles_t result;
  3.     __asm__ __volatile__ ("rdtsc" : "=A" (result));
  4.     return result;
  5. }
  6.  
  7. void DelayMs (int ms)
  8. {
  9.         cycles_t t1 = currentcycles();
  10.         for(int i=0;i<10;i++);
  11.         cycles_t t2 = currentcycles();
  12.  
  13.         cycles_t t = (t2 - t1) * ms;
  14.         cycles_t i;    
  15.  
  16.         for (i=0;i<t;i++);     
  17. }



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

PM Quote