Hallo, ich würde gern auf dem STM32F4 irgendwie die Anzahl der Takte ermitteln, die eine Reihe von Instruktionen braucht. Gibt es da eine verlässliche und halbwegs einfache Möglichkeit? Es geht u.A. um den Vergleich mit und ohne FPU-Nutzung. Ich würde ungern in den Assembler-Code schauen und dort die Takte zählen, da ich auch Codeblöcke mit ein paar mehr Instruktionen auswerten möchte. Danke schonmal im Voraus! Beste Grüße, Christoph
SysTick ?
Macht der Cortex-Core schon:
1 | |
2 | |
3 | |
4 | |
5 | |
Vielen Dank für den Code! Das Problem ist nur folgendes: Ich lasse mir die Variable über den USART ausgeben, doch sobald ich den Debug-Modus vom TrueStudio verlasse und den Controller selber werkeln lasse, kommt nur eine 0 an, statt der sonst 6 Takte. Ich habe folgenden Code ausgeführt, um zu testen, wie lange die SysTick-Abfrage an sich ohne Code dazwischen braucht:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
edit: An der USART-Kommunikation liegts nicht, das habe ich durch eine testweise Addition von diff mit 1 ausgeschlossen...
Der Code funktioniert bei einem STM32F103. Evt. ist das Register beim Cortex-M4 ein anderes, lese mal in der Doku von ARM über die Core internen Register. (Kann ich mir jetzt nicht vorstellen.) Ich ermittle damit auch den Zeitbedarf bei kritischen Interrupts, die sich oft wiederholen (z.B. schnelle AD Messung mit 1,6µS).
Auszug aus der core_cm4.h
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
Ich habe jetzt die Adressen entsprechend geändert und es funktioniert
auch.
Nur tritt folgendes Phänomen auf:
Wenn ich zum Test eine gewisse Anzahl NOPs messe ( asm("nop"); ), kommt
am Ende nicht die entsprechende Anzahl Takte heraus. Die Anzahl ist idR
höher und ist abhängig vom Code vor der Messung. (zB
Variablendefinitionen verändern den Wert)
Woran liegt das?
Viele Grüße,
Christoph
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.