Hallo, ich frage mich schon lange, warum beim 8-bit RISC ARR die Register 0 - 15 nicht direkt mit z.B. LDI verwendet werden können, sondern nur die Register 16-31. Das Einzige, was mir mal gesagt wurde war, es seien architektonische Gründe, aber weiß jemande welche? Vielen Dank schon mal! Gruß Beni
Du hast in einem Befehlswort nur eine bestimmte Anzahl Bits. Und jeder Mikroprozessordesigner muss sich entscheiden, welche Befehle er damit umsetzt. Wenn Du LDI mit allen Registern haben willst, brauchst Du ein Bit mehr. Das fehlt dann woanders. Also müssen dann andere Befehle beschnitten oder ganz weggelassen werden. Oder Du nimmst ein Bit bei der Konstante bei LDI weg. Anstatt 0-255 könntest Du dann nur 0-127 als Wert bei LDI benutzen.
LDI ist 16 bit breit. Für den Wert werden 8 Bits benötigt. Wenn du nun alle 32 Register ansprechen können willst, brauchst du für die Registernummer nochmals 5 Bits. Es bleiben also nur noch 3 Bits für den Opcode übrig. Das ist zu mager. Es gibt ja noch andere Befehle dieser Art (z.B. ANDI, ORI, SUBI, SBCI). So wäre fast kein Platz mehr für die ganzen anderen Befehle übrig.
Die eine zusätzliche Zeile Code für die unteren Register ist doch zu verschmerzen.
kommt immer drauf an: ldi tmp, 123 mov r0, tmp kann z.B. durch nen Interupt unterbrochen werden! also müßte man eigentlich schreiben: cli ldi tmp, 123 mov r0, tmp sei und ganz eiogentlich: cli push tmp ldi tmp, 123 mov r0, tmp pop tmp sei Läßt sich natürlich alles durch saubere programmierung verhindern und "hinbiegen" ;)
Läubi Mail@laeubi.de wrote: > kommt immer drauf an: > > ldi tmp, 123 > mov r0, tmp > > kann z.B. durch nen Interupt unterbrochen werden! Na und? Wenn die ISR sauber programmiert ist stört das nicht weiter. > > also müßte man eigentlich schreiben: > > cli > ldi tmp, 123 > mov r0, tmp > sei Nööö, man muss nur in der ISR alle verwendeten Register sichern (push/pop) und das SREG sichern, damit das Auftreten des Int zwischen einem flagbeeinflussendem Befehl (Operation, Vergleich) und der darauf folgenden bedingten Verzweigung (brXX) keine Flags verändert. > > und ganz eiogentlich: > > cli > push tmp > ldi tmp, 123 > mov r0, tmp > pop tmp > sei Nöö, auch nicht, das muss in der ISR geschehen. Allerdings gibt es Fälle, wo das Sperren des Interrupts nötig ist, nämlich dann, wenn Main und ISR auf dieselben (I/O-)Register zugreifen. Suche mal nach "atomar", da bekommst Du gute Erklärungen von PeDa. Auch beim Setzen des Brennimpulses beim (internen) EEPROM muss der Interrupt gesperrt werden, damit er nicht zwischen Aufhebung des Schreibschutzes (eemwe) und Schreiben (eewe) auftreten kann, was den Schreibschutz (der gilt nur 4 Takte) deaktivieren könnte. > > > Läßt sich natürlich alles durch saubere programmierung verhindern und > "hinbiegen" ;) Richtig, saubere Programmierung ist oberstes Gebot. Es gelingt mir aber auch nicht immer... ;-) ...
Zum Glück kann keiner in die Controller ´reingucken, um die "dreckigen" Programmecken zu sehen ;-) (bei gesetzten LockBits). Mit einiger Erfahrung sind die AVRs aber recht einfach zu den an sie gestellten Aufgaben zu bewegen.
Hallo > cli > push tmp > ldi tmp, 123 > mov r0, tmp > pop tmp > sei Wofür soll das gut sein ? tmp hat hinterher den gleichen Wert wie vorher. MfG Willi
Oh Sorry, habs schon gesehen. Ich nehme alles zurück. Hatte wohl gerade einen Aussetzter zwischen den Ohren. Mfg Willi
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.