PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Geschwindigkeit?



mr.burns
26.12.2011, 20:47
Hallo,

ich habe einen Atmega32 mit 1 MHz auf einem STK-600 laufen.
Der Takt kommt vom STK-600, am XTAL1 kann ich per Ossi ca. 1 MHz messen.
Habe nun folgenden simplen Code übersetzt (mit AVR Studio 5 Optimierung -O1) dann zum Atmega32 übertragen:

int main(void)
{
DDRD |= 0x04; // Bit 2 auf Ausgang setzen;
while(1)
{
PORTD ^= ( 1 << PD2 ); // PD2 toggeln
}
}

Wenn ich nun an Pin 2 von PortD messe, bekomme ich 'nur noch' 66 kHz angezeigt.
Wenn ich mit -O3 kompiliere ändert sich nichts.
Warum kommt von dem 1Mhz bei so simplen Code keine höhere Frequenz am PD2 an? Ist der Compiler nicht effizient oder mache ich einen Denkfehler?

Danke für Infos!

Besserwessi
26.12.2011, 21:20
Bei dem Code hat der µC schon einiges zu tun. Es ist ja nicht so das aus einem C Befehl genau ein ASM Befehl wird. Den erzeugten Code kann man sich auch gleich ansehen. GCC erzeugt auch einen so einigermaßen lesbaren ASM Code.

Im Idealfall müsste der Code für die Schleife etwa so aussehen:
Start:
In R16, PORTD
EOR R16, 8
OUT PORT16, R16
RJMP start

Der handoptimierte ASM code braucht 5 Zyklen für einen Druchlauf und würde damit eine Frequenz von 100 kHz erzeugen. Das ist der Compiler mit 66 kHz (also 7 oder 8 zyklen für die Schleife) schon nicht so schlecht, könnte aber natürlich besser werden.

Bei -O3 könnte man theoretisch ein loop unrolling erwarten - wird hier aber offensichtlich nicht gemacht.