www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Register und RAM


Autor: René (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

wie am besten vorgehen bei der asm Programmierung. Bei der Aufteilung
der Register und Benutzung des RAM Speichers.

Komme jetzt doch bei der etwas unbedarften Programmierung an meine 
Grenzen
da die Register teilweise doppelt belegt sind und ich kaum den RAM zur 
Speicherung benutzt habe. Jetzt wirds eng.
Habe auch noch Interrups die zwischendurch zu laufen.
Wie bringe ich Ordnung in mein "Caos"?

vorschläge meinerseits sind die:

Register die in den Interrups benutzt werden vor der Ausführung 
zwischenzuspeichern mit Push und am ende per Pop.

oder das Grundsätzlich im gesamten Programm zu machen.

Wie geht Ihr vor?
Gibt es sozusagen die Goldene Regel?

und
Frohes neues noch.

Gruß René

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sag doch erst mal: welcher Controller? Dann poste Dein Programm und 
dann sehen wir weiter.

Autor: René (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Travel Rec.

Controller Atmel mega 8515

Programm ist uninteressant hier geht es um die grundsätzliche 
Vorgehensweise beim Programmieren.
Sozusagen um das Grundrezept bei der Verwendung des Ram.

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Programm ist uninteressant hier geht es um die grundsätzliche
>Vorgehensweise beim Programmieren.

Genau deswegen wäre es interessant, einen Blick in Dein Programm zu 
werfen und Dir die Grundsätze anhand praktischer (von Dir verzapfter) 
Beispiele zu erläutern.

Autor: 1234 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wich in diesem Zusammenhang ist auch die Haeufigkeit der Interrupts. 
Wenn man alle 20us einen Timer hat, so sollte man nur noch wenige 
register umladen muessen. Generell ist Daten in Registern zu halten 
erstrebenswert, macht das Programm aber schwerer wartbar.

Autor: Μαtthias W. (matthias) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

du kannst dich ja daran orientieren wie es ein C-Compiler macht. Die 
Entwickler von so einem Ding haben das gleiche Problem nur eine Stufe 
extremer weil sie bei der Generierung des ASM/OBJ-Codes garnichts über 
andere Module wissen. Das lößt erst der Linker auf. Es werden also feste 
Register definiert die eine bestimmte Aufgabe übernehmen.

http://www.nongnu.org/avr-libc/user-manual/FAQ.htm...

Sowas ähnliches solltest du auch basteln. Also ein paar Register 
übernehmen immer die Paramterübergabe an Funktionen, einige kann man 
immer frei benutzen usw. Mußt die halt eine Art "Regelbuch" aufstellen 
und dich immer daran halten. Register die in einem Unterprogramm 
überschrieben werden mußt du vorher eben mit push sichern.

Da du ja ASM machst kannst du dann noch solche Spielchen treiben wie 
einige Register fest einer ISR zuzuteilen um maximale Geschwindigkeit 
herauszuholen wenns nötig ist.

Matthias

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

mein persöhnlicher "Geschmack", wenn ich "planlos" was teste:

r16-r19 sind immer temporäre Register, deren Inhalt ist also für keinen 
anderen Programmteil garantiert und jede Subroutine darf die ändern.

Wenn sie in einer IRQ genutzt werden müssen, dort natürlich PUSH/POP,
wenn eine aufrufende Routine den Inhalt eines Temp-Registern noch 
braucht und eine Subroutine aufruft, muß sich die aufrufende Routine um 
PUSH/POP kümmern.
Meist genutzt: r0/r1 als Ergebnisregister von MUL, r2 als schneller 
Zwischenspeicher für SREG in IRQ, r3 mit 0 initialisiert für 
Rechenroutinen.

X/Y/Z für Zeiger/16Bit-Sachen.

Der Rest erstmal, wie es sich ergibt. Alles, was selten gebraucht wird 
oder mehrere Register benötigen würde kommt erstnal ins Ram.
Display-Buffer, ADC-Werte als Beispiel.
Das Zählregister für einen IRQ, der alle 100ms einen Wert erhöht, kann 
ruhig im Ram liegen, bei 100µs dagegen eher nicht.

Möglichst zum Rechnen die unteren Register nehmen, nur wenn wirklich LDI 
usw. nötig sind und nicht sinnvoll umgangen werden können, entweder auf 
obere ausweichen oder den Kram von unten in die Temp-Register kopieren 
und danach zurück.

Das ist jetzt so "aus dem Hut" aufgeschrieben, ansonsten dem Vorschlag 
von Travel Rec. folgen und mal ein Programm posten.

Gruß aus Berlin
Michael

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.