Register beim AVR Im Unterforum Microcontroller - Beschreibung: Hardware - Software - Ideen - Projekte
| Autor |
|
|
|
BID = 411294
elektroluchs Gesprächig
  
Beiträge: 194 Wohnort: Austria
|
|
Hallo!
Ich hätte einmal eine Frage an diejenigen, die ihre AVRs in Assembler programmieren. Wozu benutzt ihr die "unteren" Register (r0-r15 beim ATmega8 z.B.) eurer μCs denn so. Mit diesen kann man ja nicht alle Assembler-Befehle nutzen und daher ist man ja ein wenig eingeschränkt damit.
Mich würde das Dasein dieser Register wirklich brennend interessieren, was ich so gesehen habe wird ja meist mit den Registern von r16 aufwärts gearbeitet.
mfg
elektroluchs |
|
BID = 411303
Benedikt Inventar
      Beiträge: 6241
|
|
Ich nutze die für häufig genutzte Konstanten falls es schnell gehen muss. Dann spare ich mir das ldi r16, wert und kann direkt mit out IO, r2 den Wert ausgeben.
Oder ich verwende diese als kurzzeitiger Speicher (z.B. das SREG im Interrupt wird meist in r6 gesichert.)
Eiegntlich sind die Register aber überflüssig. Der GCC Compiler nutzt diese auch nicht. |
|
BID = 411345
DonComi Inventar
     
Beiträge: 8604 Wohnort: Amerika
|
Moin,
Das niedrigste Register r0 wird bei Controllern, die den einfachen lpm-Befehl kennen, dazu benutzt, die Daten, die durch den Z-Zeiger adressiert wurden, zu laden.
Wenn man also die gewünschte Adresse im Flash-Speicher in den Z-Zeiger geladen hat und lpm aufruft, dann flutsch das adressierte Byte nach r0.
Mittlerweile können aber die etwas größeren AVRs (z.b. 8535, 32, 16 etc.) den erweiterten Befehl lpm Register, Z (Z+; Z-).
Außerdem werden die untersten beiden Register benutzt, wenn ein Word ins Flashrom geschrieben wird. (z.b. wenn ein Bootloader den Flashbereich aktualisiert.)
Sie sind also nicht nutzlos, sondern können gezielt als Puffer oder als Sicherungsregister für andere benutzt werden, wenn man den SRAM für andere Sachen benutzt.
So geht es z.B. schneller, wenn ich das Register r16 sichern will:
mov r2, r16
;mach was mit r16
mov r16, r2
als wenn ich es über das SRAM mache:
push r16
;mach was mit r16
pop r16
Außerdem kann man Register ganz normal adressieren, daher kann man recht schnelle Prozeduren schreiben, die r3-r15 als Puffer benutzen.
Man sollte aber immer sicher sein, dass diese Register dann keine ungültigen Werte durch andere Zugriffe erhalten.
_________________
|
BID = 411378
SIGINT Stammposter
   
Beiträge: 381 Wohnort: Mönchengladbach
|
Zitat :
DonComi hat am 4 Mär 2007 14:31 geschrieben :
|
So geht es z.B. schneller, wenn ich das Register r16 sichern will:
mov r2, r16
;mach was mit r16
mov r16, r2
|
So kann man sich aber auch schnell einen Fehler einhandeln,wenn man nicht aufpasst... da find ich nen Stack doch praktischer. Hätten die die unteren Register noch als weitere Stackpointer verwendet, wären die sinnvoller.
Gruß,
SIGINT
|
BID = 411387
DonComi Inventar
     
Beiträge: 8604 Wohnort: Amerika
|
Nuja, Assembler ist i.d.R. fehleranfällig, und wenn man Programe mit einigen tausend Zeilen hat (hatte ich schon), dann sollte man Register definieren und nicht direkt deren Bezeichnungen verwenden.
Man hat quasi Variablen, die man genauso, nur eben auf Assemblerart, wie in anderen Sprachen verwenden kann.
Daneben hat man dann noch die Variablen im RAM und man arbeitet natürlich viel mit Makros.
Sicher, kompliziert isses, aber es macht auch Spaß, wenn man nach dem Assemblieren den kompletten Programmkode anschaut, indem dann alle Sachen an den richtigen Stellen stehen, aus "variablen" Konstanten wie "ldi r16, (1<<bit0|0b11<<bit4|0xF<<bit5)" ordentliche Hex-Werte werden und Makros eingebunden wurden.
Aber stimmt schon, man sollte deswegen nicht so große Klimmzüge machen, denn wenn man das gleiche mit dem Stack lößt, dann braucht man nur zwei Taktzyklen mehr und es bleibt übersichtlicher.
_________________
|
BID = 411687
elektroluchs Gesprächig
  
Beiträge: 194 Wohnort: Austria
|
Ich kann es fast nicht glauben, dass so eine Menge Register so wenig zu gebrauchen sind.
Naja, irgendwas müssen sich die Entwickler ja dabei gedacht haben, vielleicht weiß es ja jemand.
mfg
|
BID = 411696
DonComi Inventar
     
Beiträge: 8604 Wohnort: Amerika
|
Da ein Befehl mit Ausnahmen* nur ein Wort groß ist, muss man sich Gedanken über die Kodierung
a) Der eventuellen Konstanten
b) Der Register und
c) Der Mnemonics selbst machen.
Ich glaube einfach, dass bei vielen Befehlen in einem Wort kein Platz mehr war und man nur die Register r16-r31 kodieren konnte.
Wobei der Befehl clr bei allen Registern funktioniert.
* AVRs mit größerem Speicherbereich unterstützen i.d.R. die Befehle jmp und call.
Diese werden als Doppelwort im ROM abgelegt, indem neben dem Befehl auch die Adresse des Labels kodiert ist. Diese kann 2 Bytes lang sein.
Edit:
Ein Wort: 2 Bytes
Rechtsschreibfehler entfernt...
_________________
[ Diese Nachricht wurde geändert von: DonComi am 5 Mär 2007 20:38 ]
|
|
Zum Ersatzteileshop
Bezeichnungen von Produkten, Abbildungen und Logos , die in diesem Forum oder im Shop verwendet werden, sind Eigentum des entsprechenden Herstellers oder Besitzers. Diese dienen lediglich zur Identifikation!
Impressum
Datenschutz
Copyright © Baldur Brock Fernsehtechnik und Versand Ersatzteile in Heilbronn Deutschland
gerechnet auf die letzten 30 Tage haben wir 7 Beiträge im Durchschnitt pro Tag heute wurden bisher 2 Beiträge verfasst © x sparkkelsputz Besucher : 192381011 Heute : 1430 Gestern : 4606 Online : 457 14.7.2026 9:46 3 Besucher in den letzten 60 Sekunden alle 20.00 Sekunden ein neuer Besucher ---- logout ----viewtopic ---- logout ----
|
xcvb
ycvb
0.034129858017
|