Am Freitag, 10. September 2004 19:53 schrieb Martin Eisfeld:
Am Freitag, 10. September 2004 19:40 schrieb Friedrich W. H. Kossebau:
ich versuche gerade, etwas Delphi nach C unter Linux zu transportieren.
Zur Zeitmessung^WZeitschätzung wird unter Delphi auf den Zyklusticker des Pentium zugegriffen:
<code> var: Start,Now,SystemFrequency: Int64;
queryPerformanceFrequency( SystemFrequency ); queryPerformanceCounter(Start);
queryPerformanceCounter(Now); Time := (Now-Start)/ SystemFrequency)*1000; // in ms
</code>
queryPerformanceCounter() hat sein Pendant (im Falle eines Pentium) sicher in <code src="asm/msr.h"> #define rdtscll(val) \ __asm__ __volatile__("rdtsc" : "=A" (val))
</code> Aber queryPerformanceFrequency()? <code>grep "cpu MHz" /proc/cpuinfo</code> kann es ja wohl nicht sein. Kann da jemand einen Tip geben?
Wenn ich das richtig verstehe, willst du die Taktfrewuenz in MHz berechnen.
Nein, ich will möglichst genau (deswegen der CPU-Zyklus) die Dauer zwischen zwei Codestellen berechnen (das Multitasking und alle ISR zwischendurch mal ignorierend).
Folgender Code sollte es können:
include <stdio.h> #include <unistd.h>
#define rdtsc(X) asm volatile("rdtsc":"=A" (X))
int main(void) { long long start, stop, takte, speed;
rdtsc(start); sleep(10);
sleep( 10 ) bedeutet leider nicht, daß er genau (auf die Millisekunde) 10 Sekunden schläft. Ich habe nicht nachgeschaut, aber sleep kommuniziert bestimmt mit dem Scheduler, und dessen Auflösung ist, uhm, war IIRC mal 10 ms, keine Ahnung, was der aktuell (Kernel 2.4/2.6) ist.
rdtsc(stop); takte=stop-start; speed=takte/10000000; printf("Tasktgeschwindigkeit: %d MHz.\n",speed);
Näherungswert :)
Aber danke Friedrich