Programmgeschwindigkeit bim XMEGA viel kleiner als Taktfrequenz?

Gast #1658264
Lesenswert?

So, nun mal eine Frage an alle XMEGA-Experten:

Wenn ich folgendes Miniprogramm:
1
  cli();            // disable global Interrupts
2

3
  PORTCFG.CLKEVOUT = 0x02;
4
  while(1)
5
  {
6
    PORTE.OUT |= 0x02;
7
    PORTE.OUT &= 0xFD;
8
  }

auf meinen XMEGA32A4 lade, bekomme ich bei einem Systemtakt von 32MHz 
(intern oder extern egal) nur gerade ein Ausgangssignal mit ca. 2.6MHz 
auf PORTE.
- Der Code wurde in AVR Studio mit -Os optimiert, sollte demnach sehr 
schnell sein.
- Clock Prescaler sind alle ausgeschaltet.
- Die "Ein-" Phase vom Portpin dauert 6 Taktzyklen, die "Aus-" Phase 8 
Taktzyklen (durch den Rücksprung im while(1) bedingt).
- An PORTD7 lasse ich das Taktsignal des CPUs ausgeben, dieses beträgt 
32MHz, wie es sein sollte.

Was zum Geier mache ich bloss falsch? Thanks für jede Hilfe!
Simon
#1658278
Lesenswert?

Eine C Zeile entspricht immer mehreren Maschinenbefehlen.
Du kannst :
- Den Assembler-Code anschauen und für die einzelnen Befehle die 
benötigten Taktzyklen laut Datenblatt zusammenzählen.
- Du lädst das Programm in AVR Studio und simulierst das Programm Step 
by Step. Der Simulator zeigt Dir die abgelaufenen Taktzkylen an.
Gast #1658347
Lesenswert?

oder statt direkt auf das Ausgangsregister zu schreiben:
>PORTE.OUT |= 0x02;
Das Register zum setzen des Ausgangs beschreiben. Dann muss das 
Ausgangsregister nicht geladen und verodert werden.

PORTE.OUTSET = 0x02;

Beim löschen des Bits entsprechend

PORTE.OUTCLR = 0x02

oder gleich Toggeln

PORTE.OUTTGL = 0x02
Gast #1658360
Lesenswert?

ach ja:
Die Register .OUTSET , .OUTCLR usw. schreiben sich selbstständig nach 
dem Ausführen des Befehls auf 0x00 zurück. Liest man diese Register, 
entspricht das glaube ich dem Wert des .IN Registers.

Wenn du das so machst, wird dein Programm etwa doppelt so schnell sein.
Gast #1658553
Lesenswert?

Wow, thanks für die vielen Hinweise!

Daniel V. schrieb:
> Jetzt hast du dir selbstein Bein gestellt:
>
> 32MHz /14Zyklen = 2,3MHz
>
> Voila. Stimmt doch..??!!

Ja, ist mir bewusst, mir gehts mehr darum, weshalb wo viele Taktzyklen 
verbraucht werden für eine Veroderung und Signalausgabe. Bei den 
AVR-Typen entsprechen ja die meisten (Assembler-)Befehle einem Takt. Und 
ich war erstaunt, dass der Unterschied zwiscehn C und Assembler trotz 
Optimierung und so einfachem Programm solch riesige Unterschiede bringen 
soll...



Maik Werner schrieb:
> hihihi

Dies war besonders geist- und hilfreich, danke! ;-)



Danke für die Hinweise mit dem "-assembler" und dem "PORTE.OUTSET" etc.!



Udo R. S. schrieb:
> Oder die neuen Prozessoren mit dem 'C'-Stepping nehmen. Die können
> direkt C-Befehle in einem Taktzyklus ausführen.

Dies klingt ebenfalls sehr interessant, wird aber von den XMEGAs nicht 
unterstützt, oder liege ich falsch?
Gast #1658578
Lesenswert?

>ich war erstaunt, dass der Unterschied zwiscehn C und Assembler trotz
>Optimierung und so einfachem Programm solch riesige Unterschiede bringen
>soll...

In Assembler bist du, so wie du das Programm geschrieben hast, nicht 
schneller.
Gast #1658637
Lesenswert?

Justus Skorps schrieb:
> du weisst, welcher Tag heute ist?

Upps... ;-) Schade eigentlich...



"ich" schrieb:
> In Assembler bist du, so wie du das Programm geschrieben hast, nicht
> schneller.
>
>
>
>

Hmm, liesse sich dies doch so einfache Progrämmchen tatsächlich noch 
vereinfachen? Wie denn?
Gast #1658652
Lesenswert?

...aha ja, eben, .OUTSET / .OUTCLR usw.

Die Takte haben sich auf 3 und 5 (inkl. Programmrücksprung) reduziert, 
thanks!

Werde mich dann mal in Assembler in WinAVR einlesen müssen, habe dies 
bisher immer nur eigenstänig benutzt, ohne Einbindung in C.
Gast #1658656
Lesenswert?

>Hmm, liesse sich dies doch so einfache Progrämmchen tatsächlich noch
>vereinfachen? Wie denn?

Das hab ich nicht behauptet. Mit DIESEN (Ausgang laden, verodern, 
rückschreiben) Befehlen gehts wohl nicht schneller. Ich meinte nur dass 
der Compiler hier schon das maximale (für diese Befehle) rausgeholt hat.

Wenn man natürlich Befehle wie PORTE.OUTSET bzw. PORTE.OUTCLR verwendet, 
geht das ganze etwa doppelt so schnell. Aber es ist dann eben ein 
anderes Programm. Trotz gleicher Funktion.
Gast #1658712
Lesenswert?

Gibts irgendwo eine schöne Übersicht über genau solche Befehle wie 
OUTSET, OUTCLR etc? Habe bisher immer das Include-File des XMEGA 
durchsucht, meist ist aber nicht ganz klar, was die entsprechenden 
Befehle auch wirklich tun...

Assembler hat noch nicht funktioniert, na, da muss ich dann selber 
nochmals durch.

So und dann wünsche ich schonmal schöne Ostern, und vielen Dank für die 
vielen tollen Hints und Ideen, echt Klasse!


Beste Grüsse und Gut-Ostereier-find
Simon
Gast #1659300
Lesenswert?

Simon K. schrieb:
> Probier mal:
>
1
DDRB  = 0x01;
2
> 
3
> while (1)
4
> {
5
>   PINB = (1 << PB0);
6
> }
>
> Zumindest bei "neueren" AVRs geht das.
Muss man das verstehen?
Ich zumindest stehe gerade auffem Schlauch!
Gast #1659311
Lesenswert?

Hi

>Muss man das verstehen?
>Ich zumindest stehe gerade auffem Schlauch!

The Port Input Pins I/O location is read only, while the Data Register 
and
the Data Direction Register are read/write. However, writing a logic one 
to a bit in the PINx Register, will result in a toggle in the 
corresponding
bit in the Data Register.

MfG Spess
Gast #1659498
Lesenswert?

spess53 schrieb:
>>Muss man das verstehen?
>>Ich zumindest stehe gerade auffem Schlauch!
> The Port Input Pins I/O location is read only, while the Data Register
> and
> the Data Direction Register are read/write. However, writing a logic one
> to a bit in the PINx Register, will result in a toggle in the
> corresponding
> bit in the Data Register.
Danke, wieder was gelernt.
Gast #1663246
Lesenswert?

Simon K. schrieb:
> Aber viel wichtiger: Deren Namen unter AVR-GCC findest du im
> entsprechenden Header File im WinAVR inc Verzeichnis. ioxYZ.h

Danke für den Tipp. Dachte bloss, es gäbe vielleicht noch etwas 
"Geordneteres", wo die Zusammengehörigkeiten bzw. der Aufbau der structs 
etwas übersichtlicher zusammengestellt ist. Geht aber auch so.


Vielen Dank euch allen erneut und beste Grüsse aus der Schweiz,
Simon

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren