Hallo Ich will mich etwas mit dem C51er auseinandersetzen, aber ich komme noch nicht ganz klar mit dem Speichermanagement. Konkret hänge ich bei den Registerbänken, wann genau schalte ich zwischen denen um? Zurzeit verwende ich sie beim Interrupt Aufruf, um mir das push’en und pop’en zu ersparen und so auch gleich den RAM (stack) zu entlasten. Irgendwo in diesem Forum habe ich gelesen das dies nicht so empfehlenswert ist, warum? Wo ist der Nachteil wenn man andere Registerbänke benutzt? Vielleicht kann es mir kurz wer erklären. Danke Rudi
RAM sparen kann man damit überhaupt nicht, da die Bänke ja im RAM liegen. Sobald Du eine weitere Bank benutzt, gehen also 8Byte weg vom RAM. Man kann damit in Interrupts etwas Zeit sparen (weniger Push/Pop). Probleme beim Benutzen mehrerer Bänke kann es geben, wenn Routinen so geschrieben sind, daß in einer bestimmten Bank laufen müssen. Nicht alle Befehle sind mit Registern möglich, manche gehen nur mit deren RAM-Adresse. Peter
Oh, Danke für die Info, das der Speicher von nicht verwendeten Registern im Ram "frei" ist, wusste ich gar nicht. In den Dokumentationen welche ich bis jetzt durch habe wird überall erwähnt das die Registerbänke auf der Adresse 00h – 1Fh liegen, daraus schloss ich das diese sowieso Reserviert sind und nicht zB. für Variablen verwendbar sind. Da es aber immer möglich ist (wenn ich mich nicht irre) entweder auf das Register direkt oder über die Speicheradresse zuzugreifen, dürfte es bezüglich der Registerbänke keine Probleme geben, wenn ich dies im Code berücksichtige. Das wiederum würde dann bedeuten dass man, abgesehen von der etwas schwereren Lesbarkeit des ASM Codes, den Vorteil der Geschwindigkeit habe (Wenn ich alle 8 Register speichern müsste). Sehe ich das richtig? In C (Keil, Parameter using) würde dies ja der Compiler bezüglich der Adressierung selbst erledigen? Und gleich noch eine Frage: Wenn ich in ASM programmiere weis ich im Normalfall welche Register benötigt werden und kann gegebenenfalls nur das eine auf den Stack legen. Wie ist das in C oder konkret beim Keil hier weis ich nicht welche Register er verwendet, ist er so intelligent und Speichert die Register auf dem Stack, welche er braucht, oder speichert er immer alle oder habe ich sowieso nur die Möglichkeit mit einem Bankwechsel mein Register zu schützen? Fragen über Fragen :-) Rudi
Hallo Rudi, mit dem Speicheraufbau tut man sich immer mal wieder schwer. Ich habe mal vor einigen Jahren einen ICE entwickelt und im Anhang findest du ein simples Assembler Programm welches einfach den Speicher beschreibt. Anschließend konnte man mit dem ICE dann einen Breakpoint setzen und einen Blick in den MC werfen. Schau mal ob du das Abbild mit dem Code zusammenbringst. Wenn ja, dann hast du es verstanden. Bei Verwendung von C schlägst du dich dann nicht mehr damit rum, dafür ist der Compiler zuständig. Fürs Verständnis und weitergehende C Konstrukte ist es dann wieder hilfreich.
Vielleicht noch mal zu C, du kannst ja mal ein Beispiel schreiben und dir anschließend das ASM Listing (Der C Compiler erzeugt ja ASM code) ansehen. Das empfiehlt sich sowieso für den Lernerfolg. Ebenso kann man auf diese Art und Weise unteruchen ob man C vernünftig, will sagen mit entsprechender Codedichte, schreibt.
Rudi_8 wrote: > In C (Keil, Parameter using) würde dies ja der Compiler bezüglich der > Adressierung selbst erledigen? Jein. Wenn Du kein "using" verwendest, kümmert sich der Compiler um alles. Wenn Du aber "using" verwendest, denkt der Compiler, Du hältst Dich für klüger als er und überläßt es Dir, ob auch alles richtig ist. Du kannst z.B. 2 Interrupts eine unterschiedliche Priorität aber das gleiche "using" zuweisen und er wird nicht meckern. Bloß dann kracht es eben, wenn beide Interrupts gleichzeitig auftreten. Using sollte man als C-Anfänger daher besser nicht verwenden. Peter
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.