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
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.
"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
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....
@ 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
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.
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.
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
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
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
@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
"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...
"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
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.
@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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.