16Bit TCNTx auslesen - ASM-Code vs. GCC-Compiler

Gast #363826
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
#363827
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

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