Hab vielleicht was für Dich, einzige Einschränkung: nur lauffähig auf Intel-Plattformen (ab Pentium) und nur verwendbar bei Compilern mit inline-Assembler-Unterstützung.
Grundlagen:
Seit dem Pentium gibts ein 64-Bit-Register (Time-Stamp-Counter), welches bei jedem Prozessortakt inkrementiert und bei jedem Prozessorreset zurückgesetzt wird.
Gelesen wird dieses Register über den rdtsc-Assembler-Befehl, der die oberen 32 Bit in das EDX-Register und die unteren 32 Bit in das EAX-Register schreibt. Bei 400 MHz Taktfrequenz reichen die unteren 32 Bit aus, wenn man keine Zeiten messen will, die länger als 10 s sind.
Kleines Problem:
rdtsc ist nicht serialisierend, das heißt, der Befehl kann zur besseren Ausführung in der zeitlichen Abarbeitung verschoben werden (durch die Speculative Execution Unit der CPU).
Lösung:
Man stellt einen serialisierenden CPU-Befehl voran (etwa cpuid).
Mit folgedem C/C+±Code lässt sich der Spass lösen:
void ReadTSCLow( unsigned int& runLow )
{
\_\_asm cpuid
\_\_asm rdtsc
\_\_asm mov runLow,eax
}
Aufruf:
#define CPU\_CLK 700 // CPU-Takt in MHz
unsigned int unTSCStart, unTSCEnd, unTSCDiff;
// Start-Wert holen
ReadTSCLow( unTSCStart );
// Vorgang durchführen
// End-Wert holen
ReadTSCLow( unTSCEnd );
// Verstrichene Zeit in us berechen:
unTSCDiff=( unTSCEnd-unTSCStart )/CPU\_CLK;
Damit solltest Du eine Code-Basis haben, die für alle Betriebssysteme mit halbwegs modernem Compiler verwendbar ist.
Ist Dir damit nicht geholfen, ist Dir nicht zu helfen.
Grüsse Safog
P.S.: Es gibt keine 100%ige Garantie für Echtzeitfähigkeit. Siehe dazu auch versch. Forschungsarbeiten am Lehrstuhl für Realzeit-Computersysteme an der TU München.