Forum: Mikrocontroller und Digitale Elektronik 8051 und RETI


von Nachfolger (Gast)


Lesenswert?

Hallo zusammen,

ich muss ein Projekt von meinem Vorgänger(ist nicht mehr da)
übernehmen.

Es ist eine Maschinensteuerung die eine
RS232-Receiver-Interruft-Routine enthält. Diese ISR wird richtigerweise
mit RETI abgeschlossen.

Meine Frage: Ist es auch möglich diese ISR mit einem
jmp rsneu abzuschliessen.

Aud rsneu würde stehen:

rsneu:  mov sp,#stack    ;Rücksprung von RS232


Funktioniert das?

Vielen Dank für eure Hilfe.

Der Nachfolger

von Christoph Kessler (db1uq) (Gast)


Lesenswert?

Manche Prozessoren legen die alte Adresse auf den Stack und
incrementieren erst nach RETI, andere Familien machen den Increment
schon vor dem Ablegen, das hab ich mal mit einem 8080-Emulator auf dem
6502 nach längerer Suche gemerkt.

von peter dannegger (Gast)


Lesenswert?

"rsneu:  mov sp,#stack    ;Rücksprung von RS232"


???

Wo siehts Du da einen Sprung ?
Es geht dahinter weiter, nirgends ist da ein Sprung.


Etwas nach SP zu laden, außer in der Initialisierung nach dem Reset,
ist Ober-Pfui !

Merkt man spätestens dann, wenn man seine eigenen Programme später mal
verstehen oder erweitern muß.


"Funktioniert das?"

Natürlich nicht !

Der 8051 hat eine Prioritätslogik, die verhindert, daß Interrupts durch
welche mit gleicher oder niederer Priorität unterbrochen werden können.

Und solange Du dieser Logik nicht mit einem RETI sagst, daß die
laufende Prioritätsstufe beendet wurde, tut sie das auch.

Es gibt außer dem RETI nur eine weitere Möglichkeit, die
Prioritätslogik zurückzusetzen, nämlich ein (Watchdog, externes oder
Power-On) Reset.


Peter

von Nachfolger (Gast)


Lesenswert?

Hallo Peter,

Die ISR wird beendet mit 'jmp rsneu'

Bei der Addresse rsneu wird dann der SP gesetzt.

Das das Ober-Pfui ist, ist mir klar, aber es muss bei uns auf die
schnelle eine Lösung gefunden werden, aus der ISR raus zu kommen ohne
das das Programm da weiterläuft wo es vor Aufruf der ISR stand.

Mist....

von Stephan H. (stephan-)


Lesenswert?

@ Nachfolger

Du kannst aber die ISR sofort mit RETI abschließen und Dir dabei ein
Flag setzen. Dann erstmal normal weitermachen und die ISR danach als
normale Routine laufen lassen. Wenns hilft.
Das wäre dann ne "zusätzliche" Prioritätenebene.

8051 Microkontroller Kochbuch. Bei Interesse würde ich nachschauen.

Aber ne ISR mit JMP zu beenden........naja.
Warum willst du rausspringen ??? Du holst doch nur das Byte ab.

Stephan

von Nachfolger (Gast)


Lesenswert?

Mein Vorgänger hat, wie Oberpfui, eine komplette Ausgaberoutine in die
ISR untergebracht. In Verbindung mit dem Rücksprung ins Hauptprogramm
gibts jetzt Probleme.
Ein Neuschreiben dieses Programmaschnittes kommt nicht in Frage(noch
nicht).
Werde mal Stephans Vorschlag diskutieren.

von peter dannegger (Gast)


Lesenswert?

Nochmal: ohne RETI kein Ende der ISR !


Ist ein beliebter 8051-Anfängerfehler, kein RETI machen und sich dann
wundern, warum kein Interrupt gleicher oder niederer Priorität mehr
ausgeführt wird.


Die Prioritätslogik ist im Prinzip ganz simpel und besteht nur aus 4
Bits  (= 4 Level). Jeder Interrupt setzt beim Eintritt das seiner Stufe
entsprechende Bit und jedes RETI löscht immer das höchste gesetzte Bit.

Und vor dem Eintritt wird geprüft ob schon das Bit seiner oder einer
höheren Prioritätsstufe gesetzt ist. Wenn ja, dann passiert nichts und
im nächsten Zyklus wird wieder geprüft usw.. Und erst wenn diese Bits
gelöscht sind, wird der Interrupt ausgeführt.


Da die Prioritätstufe immer nur beim Eintritt ausgewertet wird, kann
man auch die eigene Priorität im Interrupt hochsetzen und sich dann
sogar selber unterbrechen (bis zu 3-mal).
Und nach dem 4. RETI ist dann wieder alles in Butter, wirklich sehr
clever diese 8051-Entwickler.

Solche Tricks sollte man als Anfänger aber erstmal nicht machen.
Ich wollte nur aufzeigen, daß sie möglich sind und auch sicher
funktionieren.

Manche größeren CPUs richten dagegen ein Chaos, an, wenn man in den
Interrupts rumspielt (spurious Interrupts).


Peter

P.S.:
Diese 4 Prioritätsbits sind CPU-intern und nirgends direkt zugreifbar.

von Nachfolger (Gast)


Lesenswert?

> Nochmal: ohne RETI kein Ende der ISR !

Habe verstanden!


Besten Dank
Nachfolger

von peter dannegger (Gast)


Lesenswert?

P.S.:

Wenn man sich dagegen mal die Prioritätslogik im STR71x (ARM7TDMI von
ST) ansieht, da kann man sich nur noch ständig vor den Kopf schlagen,
wie dermaßen umständlich dort die Jungens denken.

Da muß man haufenweise Register und Bits in einer ganz bestimmten
Reihenfolge sichern und setzen, sonst krachts an allen Ecken und
Enden.

Ein leerer Interrupthandler ist bestimmt mindestens 100 Byte groß von
allem diesen total überflüssigen Schrunz.

Prioritätswechsel innerhalb Interrupts sind generell verboten !


Peter

von Dietmar (Gast)


Lesenswert?

Bloß nicht, keine Alternative für RETI.

Strukturiert und "gerade" sollte man auch in Assembler programmieren,
oder absolut "Herr" der Manipulationen sein.

Natürlich, beim 8051 gibt es Möglichkeiten der Stack-Manipulation. Aber
das ist ober-pfui, wie schon weiter oben gelesen.

Die einzige Ausnahme ist, wenn man einen fehlerredundanten Codespeicher
mit der Möglichheit, daß sich der Controller nach einem Programmabsturz
(Sprung in einen nicht erwünschten Speicherbereich) nochmal fängt,
aufbauen möchte:

Im Abstand von 0x80 Adressen oder mehr oder weniger Bytes im freien
Codespeicher oder zwischen Modulen kann man folgenden Code unterbringen
(in Assembler, bzw. Assemblermacros einfach, in C fast unmöglich):

Man lädt den Stack mit der Rücksprungadresse 0x00 und macht danach
einen RETI.

MOV SP, #09
MOV 08, #0
MOV 09, #0
RETI

Bei einem Sprung hierher wird der 8051 neu gestartet und alle
Interrupts sind wieder freigegeben.

Dietmar

von Dietmar (Gast)


Lesenswert?

Hallo Microcontroller.net Forum,

sorry, ich hatte gerade einen PC-Absturz mit der Message "Forbidden
#403". Daher kommt vermutlich eine mehrfache Wiederholung des letzten
Postings.

Dietmar

von Dietmar (Gast)


Lesenswert?

@peter dannegger:

Ja, der ARM ist da very strange, ich finde mich da auch ein wenig ins
Mittelalter zurück versetzt:

Ruft man beim 8051 ein Unterprogramm einfach mit:

ACALL Unterprogramm
oder
LCALL Unterprogramm
auf, so kehrt man mit
RET
oder
RETI
automatisch zurück.

Beim ARM verzweigt man zum Unterprogramm:
BL Unterprogramm
muß dann dort das Linkregister LR manuell sichern:
STMFD, SP, {LR}
führt das Unterprogramm aus
und muß dann das Linkregister mit einem speziellen Befehl, der den
Stack wieder korrigiert,
LDMFD, SP, {PC}
in den Program Counter übergeben.

Gruß

Dietmar

von Thomas (Gast)


Lesenswert?

"sorry, ich hatte gerade einen PC-Absturz mit der Message "Forbidden
#403". Daher kommt vermutlich eine mehrfache Wiederholung des letzten
Postings."


Hmmmm, war wohl eher ein Absturz Deines Fingers oder Hirns.
Denn ohne Mausklick kein Posting...

von Peter D. (peda)


Lesenswert?

"Hmmmm, war wohl eher ein Absturz Deines Fingers oder Hirns."

Weder noch.

Das passiert einfach, wenn man nach dem Abschicken eines Beitrags mit
dem "Zurück"-Feld zurück will.

Man muß nach dem Abschicken die Forumseite (linker Rand) neu aufrufen.


Peter

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Vernünftige Browser zeigen übrigens bei diesem "Zurück" eine Meldung
an, die darauf verweist, daß die angezeigte Seite aus POST-Daten
besteht ... diese Meldung sollte einen eigentlich schon ausreichend
davon abhalten, wieder und wieder auf "zurück" zu klicken.

von Dietmar (Gast)


Lesenswert?

@Thomas:

"Hmmmm, war wohl eher ein Absturz Deines Fingers oder Hirns.
Denn ohne Mausklick kein Posting..."

Habe einmal den Button "Submit" angeklickt, um die Message zu posten.
Warten, nichts passiert, nach einer Minute noch 2-3 mal Submit
angeklickt, dann Absturz.

"Zurück" habe ich übrigens nicht angeklickt.

Keine Ahnung, was das war.

Dietmar

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
Noch kein Account? Hier anmelden.