Forum: Compiler & IDEs 16Bit TCNTx auslesen - ASM-Code vs. GCC-Compiler


von Fren Mallow (Gast)


Lesenswert?

Hi.

Es geht um Codeoptimierung wegen Laufzeit..

Im Datenblatt des ATMega168 stehen auf Seite 106 Codeschnipsel zum
Auslesen des 16Bit Timerstands:

Assembler:
..
in r16,TCNT1L
in r17,TCNT1H
..

Der "in"-Befehlt braucht 1 Cycle

Für C steht als Beispiel:
..
int i;
i = TCNT1;
..

Nun zum eigentlichen Problem..

Der C-Code, wird nach dem compilieren zu folgendem:
..
lds r24,0x0084
lds r25,0x0085
..

Der "lds"-Befehl benötigt im Gegensatz zum "in"-Befehl 2 Cycles,
bis er abgearbeitet ist. Das gefällt mir schon mal nicht.
Wenn ich in C einen 8Bit Timer abfrage, dann kommt allerdings der
"in"-Befehl im Assembler-Code.. dh. der Compiler macht diesen
"Mist" nur beim 16Bit Timer..

Hat jemand ne Idee?

Wie müsste ich das r24 und r25 Register im C-Code ansprechen, falls ich
mich für Inline-Assembler entscheide, wenn das der einzigste Weg ist,
die 1-Cycle Befehle anstatt der 2-Cycle Befehle zu erhalten?

Danke im Vorraus

von Stefan K. (_sk_)


Lesenswert?

Der ATmega168 kann TCNT1 nicht mit in /out ansprechen. Das geht nur bis
zur I/O-Adresse 3Fhex.
Das Beispiel im Manual ist ein Bug, wahrscheinlich aus dem ATmega16
Manual kopiert. Bei dem lässt sich TCNT1 nämlich per in/out ansprechen.
Am besten gleich an Atmel weiterleiten.

Zum weiteren Verständnis:
schau Dir dazu die Header-Files iom32.h und iomx8.h in Deinem gcc-Dir
an:

#define TCNT1   _SFR_IO16(0x2C)    // mega16
#define TCNT1   _SFR_MEM16 (0x84)  // mega168

Viele Grüße, Stefan

von Fren Mallow (Gast)


Lesenswert?

thx.. muss ich also mit 2cycles per 8bit leben

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.