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é
Sag doch erst mal: welcher Controller? Dann poste Dein Programm und dann sehen wir weiter.
@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.
>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.
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.
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.html#faq_reg_usage 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
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
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.