www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Suche Erklärung bei C51 Registerbänke


Autor: Rudi_8 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Rudi_8 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Joe (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Joe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.