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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.