2009-07-03 7 views
7

Ich versuche die Taktzyklen zu messen, die benötigt werden, um ein Stück Code auf dem TMS32064x + DSP auszuführen, der mit dem OMAP ZOOM 3430 MDK geliefert wird. Ich schaue mir das "Programmer's Guide" des DSP-Chips an und es steht, dass der DSP die clock() -Funktion unterstützt.Ist time.h Uhr() auf meiner Hardware kaputt?

Was ich tue, ist wirklich einfach, ich

nur
start = clock(); 
for (i=0;i<100;i++){ 
    /* do something here */ 
} 
stop = clock(); 
total = stop - start; 

und dann die Werte setzt von „Start“, „Stop“ und „total“ auf einen zuvor zugewiesene gemeinsam genutzten Speicher mit dem ARM-Prozessor. Dann drucke ich es einfach auf den Bildschirm auf der ARM-Seite.

Das Problem ist, in meinen ersten Ausführen, bekomme ich immer den gleichen "Gesamt" -Wert, und dann in meinen nächsten Läufen bekomme ich immer 0! Die Werte "Start" und "Stop" gehen mit dem Wert "total" einher.

Das Seltsamste ist, dass sie einem kleinen Muster zu folgen scheinen! Ich habe die Ausgabe unter:

# ./sampleapp 
Total = 63744 
Start clock() value = 0x000000f9 
Stop clock() value = 0x0000f9f9 
# ./sampleapp 
Total = 4177526784 
Start clock() value = 0x00f9f9f9 
Stop clock() value = 0xf9f9f9f9 
# ./sampleapp 
Total clock cyles = 0 
Start clock() value = 0xf9f9f9f9 
Stop clock() value = 0xf9f9f9f9 

Apparantly, Uhr() nicht gut funktioniert, aber ich bin nicht sicher, ob dies wegen etwas, was ich falsch gemacht oder weil diese Art der Sache ist nicht mit der Hardware unterstützt Ich habe. Irgendwelche Ideen, warum das passieren könnte?

+0

Sind Sie absolut sicher, dass die Uhr diese Werte zurückgibt? Vielleicht sehen Sie sich gerade ein Problem beim Zugriff auf den gemeinsamen Speicher an? – Vicky

+0

Um dies zu überprüfen, ändere ich einfach einen der Rückgabewerte, sagen wir "Start", auf einen vordefinierten Wert oder auf den Shared-Memory-Adresse Wert und ich bekomme das richtige auf dem Bildschirm. –

+0

Hat TI irgendwelche Beispiele? Ich denke, mit einigen ihrer anderen CODEC-Beispiele haben sie auch eine verstrichene Ausführungszeit berechnet. Ich kann mich nicht erinnern, ob sie die Uhr() api benutzt haben. Aber es scheint in dem Codierungscodierungscodierer oder Codierer zu funktionieren. – simon

Antwort

2

Aus dem Lesen der Fragen bisher, würde ich sagen, das Original Poster hat wesentlich mehr Kenntnis von diesem Thema als die Autoren bisher, und dass der Verdacht, dass die Uhr() gebrochen ist (oder nicht unterstützt, und gibt eine undefiniertes Ergebnis) auf dem DSP scheint sehr wahrscheinlich.

+0

Ich begann zu glauben, dass dies auch der Fall ist, so dass diese Frage nicht mehr unbeantwortet bleiben muss. Danke an alle. –

+0

Wie demütig von dir Kann Bal, dass Sie begonnen haben zu glauben, dass Sie wesentlich mehr Wissen als die Mitwirkenden haben, und als Antwort diejenige ausgewählt, die diese besagt. nice :) Ich stimme zu, dass clock() auch auf OMAP kaputt ist. – ustun

+0

Es scheint, dass Sie nicht die einzige Person sind, die Probleme mit der Uhr() haben. Vielleicht helfen die hier angebotenen Lösungen. http://StackOverflow.com/Questions/588307/c-diest-milliseconds-time-on-linux-clock-doesnt-seem-to-work-properly – Matt

0

Merkwürdiger: Warum benötigen Sie einen zuvor zugewiesenen Shared Memory. Warum versuchst du es nicht mit einer normalen Stack-Variable? Gibt es etwas, das ich vermisse?

+2

Ja, Sie vermissen die Tatsache, dass der gezeigte Code auf einem Prozessor, dem DSP, läuft, während der Code, der die Ergebnisse anzeigt, auf einer anderen, der Haupt-ARM-CPU, läuft. – unwind

0

Vielleicht müssen Sie zuerst die Uhr initialisieren.

+0

Soweit ich weiß, nimmt clock() den Referenzpunkt als ersten Aufruf der ausführbaren Datei. Ich kann den Wert nicht manuell initialisieren/zurücksetzen. Wie machst du das? –

+0

Ich habe gerade die man-Seiten gelesen, der Standard gibt keine Möglichkeit, so etwas zu tun. – swegi

0

Wie drucken Sie es aus? Vielleicht besteht das Problem tatsächlich darin, das Ergebnis anzuzeigen?

auf den meisten Plattformen ist clock_t eine lange lange. Wenn Sie printf mit% d verwenden, können Sie variable Ergebnisse erhalten, was Sie sehen.

+0

Ich habe sizeof (clock_t) ausgedruckt und es ist 4. Es ist als unsigned int definiert. –

+0

Um auf dieser Ader zu bleiben, ist Ihr Druckcode gut? Haben Sie einige Werte durch die gleiche Art von Speicherübertragung/-ausdruck eingegeben, um zu überprüfen, ob sie richtig liegen? – DevSolar

0

Unter der Annahme, dass die Start- und Endvariable vom Typ 'clock_t' sind, und Ihr gemeinsamer Speicher nimmt das gleiche auf der anderen Seite der Interpretation der übergebenen Zahlen, dann ist Ihr Problem nicht mit dem Anruf zu Uhr, und Ihre Handhabung der Unterschied zwischen den Endzeiten am Anfang und Ende.

Ich glaube, Ihr Problem ist in dem gemeinsamen Speicher zwischen den beiden. Können Sie bitte Code schreiben, um zu zeigen, wie Sie Speicher zwischen zwei separaten Prozessoren teilen?

+0

Ich benutze einfach die gleiche Methode, die TI über sein dmmcopy-Beispiel verwendet hat. MPU Seite Beispiel: http://gitorious.org/ti-dspbridge/userspace/blobs/master/source/samples/mpu/src/dmmcopy/dmmcopy.c DSP Beispiel: http: // Gitorious. org/ti-dspbridge/userspace/trees/master/source/samples/dsp Aber ich denke nicht, dass das Problem mit dem gemeinsamen Speicher ist, da ich hard-codierte Werte von DSP zu CPU richtig statt des Start-Stopps übergeben kann und Gesamtvariablen. –

0

Vielleicht könnten Sie eine Inline-Baugruppe verwenden, um direkt auf die Zählerregister der CPU zuzugreifen.

Der TMS320C64x + hat ein 64-Bit-Zeitstempelregister in TSCL, TSCH. Der Zähler ist nicht beim Zurücksetzen aktiviert, Sie müssen zuerst in das Register schreiben, um den Zähler zu starten (vielleicht ist das das Problem mit clock?). Das Auslesen aus dem Register ist nicht ganz trivial, da jede Hälfte mit einer separaten Anweisung gelesen werden muss (und Sie Interrupts erhalten können ...).

+0

Ich wusste nicht, dass dies eine alte Frage war. Das ist es, was ich bekomme, wenn ich nicht auf Zeitstempel achte! –