Hallo, ich habe eine Frage zur ISR bei Codevision: Meine ISR ist in mehrere Blöcke (Abfragen z.B., wie if ...) unterteilt. Bis hierhin alles problemlos! Nun muss ich aber aus Zeitgründen in der Lage sein, aus jedem Block heraus aus der gesamten ISR herausspringen zu können, um wieder im Hauptprogramm landen zu können. Ist es erlaubt, dann mit #asm (reti) zu arbeiten? Welche Möglichkeiten habe ich sonst, um sicher!!! eine ISR zu verlassen?
:
Gesperrt durch Moderator
Wolfgang Staven schrieb: > Hallo, ich habe eine Frage zur ISR bei Codevision: Meine ISR ist in > mehrere Blöcke (Abfragen z.B., wie if ...) unterteilt. Bis hierhin alles > problemlos! Nun muss ich aber aus Zeitgründen in der Lage sein, aus > jedem Block heraus aus der gesamten ISR herausspringen zu können, um > wieder im Hauptprogramm landen zu können. Ist es erlaubt, dann mit #asm > (reti) zu arbeiten? Welche Möglichkeiten habe ich sonst, um sicher!!! > eine ISR zu verlassen? Ganz normaler return; so wie er in jeder anderen Funktion auch verwendet wird. Der Rest ist Sache des Compilers. Und lass um Himmels Willen ja die Finger von einem Assembler Return. Das ist ein ziemlich sicherer Weg ins Desaster, weil der Compiler vor Verlassen der Funktion wahrscheinlich noch den Stack aufräumen muss.
Hi Warum kein Sprung zum Ende und dann ganz normaler Ausstieg. Ich arbeite eigentlich nur mit Assembler und da die gepushten Register auch wieder alte werte erhalten sollen, bleibt da gar nichts andres übrig. Außerdem hasse ich es, wenn Unterprogramme mit Break und Co verlassen werden. Sauber programmiert heißt, eine Routine hat 1 Einstieg und 1 Ausstieg. Ales andere ist Spahetti-Code. Gruß oldmax
ISR mit vielen Böcken und if's, die dann aber aus Zeitgründen vorzeitig verlassen zu müssen, klingt nach ziemlich vermurkster Softwarearchitektur. Vielleicht solltest du da nochmals drüber nachdenken, ob das alles so ist, wie es sein könnte. Oliver
an K.H. Buchegger: Das hört sich sehr gut an! Nur return; eingeben? In meinem C-Handbuch findet sich kein "return;", sondern dort ist nur "return (x)" aufgeführt (x = für 1 oder 0), und da bekomme ich bei Codevision eine Fehlermeldung! Danke für den Hinweis! an oldmax: Das hört sich auch gut an, aber wie komme ich mitten aus der ISR ans Ende? an Oliver (Gast): Ich halte es nicht für richtig, ohne Kentniss der Materie solche bösartigen Vermutungen anzustellen! Die Sache ist vereinfacht so zu sehen: Während der ISR muss ein Portpin immer wieder abgefragt werden. Bei einer Änderung des Zustands muss sofort aus der ISP ins Main Programm zurückgekehrt werden. Da diese Änderung zu verschiedenen Zeiten auftritt, muss auch mehrfach abgefragt werden und somit dann auch mehrfach die Möglichkeit der Rückkehr gegeben sein.
>an Oliver (Gast): Ich halte es nicht für richtig, ohne Kentniss der >Materie solche bösartigen Vermutungen anzustellen! Das war nicht bösartig, das war nur ein gut gemeinter Vorschlag. Aber das kannst du sicherlich auf Grund deiner Kenntnis der Materie besser beurteilen. Dein C-Buch ist übrigens im Bezug auf return falsch, oder du verstehst es nicht richtig. Oliver
Wolfgang Staven schrieb: > an K.H. Buchegger: Das hört sich sehr gut an! Nur return; eingeben? > In meinem C-Handbuch findet sich kein "return;", sondern dort ist nur > "return (x)" aufgeführt (x = für 1 oder 0), und da bekomme ich bei > Codevision eine Fehlermeldung! Danke für den Hinweis! Schmeiss das Buch weg und kauf dir ein richtiges. > an oldmax: Das hört sich auch gut an, aber wie komme ich mitten aus der > ISR ans Ende? > an Oliver (Gast): Ich halte es nicht für richtig, ohne Kentniss der > Materie solche bösartigen Vermutungen anzustellen! Bei allem nötigen Respekt. Ich halte es für bösartig ohne elementare Kentnisse einer Programmiersprache ein Program schreiben zu wollen. Dein jetzt gezeigtes Unwissen zusammen mit der Problembeschreibung im Einleitungsposting nährt den Verdacht, dass Oliver recht hat. > > Die Sache ist vereinfacht so zu sehen: Während der ISR muss ein Portpin > immer wieder abgefragt werden. Bei einer Änderung des Zustands muss > sofort aus der ISP ins Main Programm zurückgekehrt werden. Da diese > Änderung zu verschiedenen Zeiten auftritt, muss auch mehrfach abgefragt > werden und somit dann auch mehrfach die Möglichkeit der Rückkehr gegeben > sein. Autsch. Das klingt nach warten in einer ISR. Olivers Verdacht nähert sich der Gewissheit an.
Ich habe gedacht, dass man hier, selbst als Anfänger, Hilfe bei Problemen bekommen kann, stattdessen gerät man an notorische Besserwisser. Dann muss ich eben woanders nach fachlicher Kompetenz suchen und melde mich gleich wieder ab.
Man könnte ja auch mal den Code zeigen. Dann haben beide was davon und können sichs ausraufen, ob die dort verwirklichte Umsetzung brauchbar ist oder nicht.
Das kannst du natürlich machen. Aber du könntest auch einfach mal dein Programm zeigen (als Anhang). Dann hilft es sich nämlich viel einfacher. Oliver
Wolfgang Staven schrieb: > Ich habe gedacht, dass man hier, selbst als Anfänger, Hilfe bei > Problemen bekommen kann, stattdessen gerät man an notorische > Besserwisser. Mag vielleicht daran liegen, dass diese "Besserwisser" ein paar Millionen mehr Lines of Code am Buckel haben als du. (Kennst du das Stereotyp des Deutschen in der großen weiten Welt da draussen? Ein Deutscher ist einer, der einem Arbeiter der seine Arbeit schon seit Jahrzehnten macht, erst einmal erklärt wie man es besser macht, obwohl er keine Ahnung von der Materie hat. Genau so verhältst du dich jetzt) > Dann muss ich eben woanders nach fachlicher Kompetenz > suchen und melde mich gleich wieder ab. Ba ba und foi net
Tja, scheint was dran zu sein an den Herbstdepressionen und Empfindlichkeiten. Nun gut, jeder wie er will :-)
Hi Nun seid doch mal nicht so streng... Wir haben alle angefangen und so manchen Mist gebaut, trotzdem sind Fragen und Antworten zu Hilfestellungen geworden. Und Karl Heinz ein > Bei allem nötigen Respekt. > Ich halte es für bösartig ohne elementare Kentnisse einer > Programmiersprache ein Program schreiben zu wollen. ist bei allem nötigen Respekt keine Hilfestellung. Ab wann bist du der Meinung, das man genug elementare Kenntnisse hat, damit man nicht bösartig ein Programm schreibt ? Zum Thema: Eine Interruptroutine (ISR) hat die Aufgabe, ein Programm aufgrund eines Ereignisses zu unterbrechen, um einen kurzen Programmblock zu bearbeiten, der dieses Ereignis behandelt. Das sind z. B. Timer-Ereignisse. So kann man einen Timer alle ms einen Interrupt auslösen lassen. In der ISR wir nun einfach in einer Variablen die ms hochgezählt. Mehr nicht. Im Hauptprogramm schaut man nun einfach nach, ob die Variable einen Wert überschritten hat, um dann z.B. 100 abzuziehen und in einer anderen Variable 0,1 s hochzuzählen. Die ISR zählt völlig unabhängig die ms. Genau so verhält es sich mit den ISR der UART. Auch hier wird beim Empfang eines Wertes ( Bytes) ein Interrupt ausgelöst. Die ISR schreibt diesen Wert in eine allgemein zugängliche Variable und gut is. Der Rest ist für die ISR nicht interessant. Darum kümmert sich das Hauptprogramm. Damit das so funktioniert, werden z. B. Flags gesetzt. Man kann eine Variable definierern und die Bits entsprechend zuordnen. Die ISR setzt z.B. Bit 5 (Zeichen empfangen) . Im Hauptprogramm wird dieses Bit abgefrgt (Polling) und ein entsprechendes (normales ) Unterprogramm damit beauftragt, dieses empfangene Byte auszuwerten und as Flag zurückzusetzen. Eine ISR, die bei einem Ereignis sich selbst verläßt, ( so hast du es beschrieben) ist falsch aufgesetzt. Da dein Programmcode nicht öffentlich ist, kann man da nur vermuten. Von daher versuch erst mal zu verstehen, was ich hier beschrieben hab und dann bau deine ISR so um, das dein Hauptprogramm nur durch die ISR unterbrochen wird.. Gruß oldmax
oldmax schrieb: >> Bei allem nötigen Respekt. >> Ich halte es für bösartig ohne elementare Kentnisse einer >> Programmiersprache ein Program schreiben zu wollen. > ist bei allem nötigen Respekt keine Hilfestellung. Ab wann bist du der > Meinung, das man genug elementare Kenntnisse hat, damit man nicht > bösartig ein Programm schreibt ? Das sollte eine Spitze darauf sein [quote] an Oliver (Gast): Ich halte es nicht für richtig, ohne Kentniss der Materie solche bösartigen Vermutungen anzustellen! [/quote] Die Vermutung Olivers ist nach dem Vorgeplänkel nicht von der Hand zu weisen. Natürlich ist schon klar, dass der TO höchst wahrscheinlich aus Unwissenheit in der Situation ist, dass er denkt er müsse aus der ISR vorzeitig aussteigen. Wahrscheinlich fehlt ihm nur die Idee der Fallunterscheidung mit einem switch-case oder einer if/else-if Leiter. Höchst wahrscheinlich hat er auch die ISR mit zuviel Funktionalität vollgestopft. Zumindest klingt die ganze Beschreibung danach. Und dieser Teil hier [quote] sondern dort ist nur "return (x)" aufgeführt (x = für 1 oder 0), und da bekomme ich bei Codevision eine Fehlermeldung! [/quote] hat mich ganz ehrlich schockiert!
>stattdessen gerät man an notorische Besserwisser.
Ja, und wenn Du jetzt noch raffst, dass es diese Leute tatsächlich
besser wissen als Du, wird vielleicht noch alles gut ;-) Denn letztlich
ist es doch genau das, was Du hier suchst: Rat von jemandem, der es
besser weiß als Du? Oder möchtest Du lieber an notorische Schlechter
-Wisser geraten?
Also mecker nicht rum :-)
> Oder möchtest Du lieber an notorische Schlechter-Wisser geraten?
Wobei, da ist er hier in diesem Forum auch gar nicht so falsch. Es kommt
immer drauf an, welche Antworten man sich rausfischt ;)
und um nochmal auf den return-Wert zu kommen: da es bei einer Interruptfunktion keine aufrufende Funktion gibt, kann es auch keinen Rückgabewert geben. Niemand könnte mit einem Wert was anfangen, und Stackprobleme sind vorprogrammiert.
H.J.Seifert schrieb: > und um nochmal auf den return-Wert zu kommen: da es bei einer > Interruptfunktion keine aufrufende Funktion gibt, kann es auch keinen > Rückgabewert geben. Niemand könnte mit einem Wert was anfangen, und > Stackprobleme sind vorprogrammiert. Mich hat eigentlich mehr schockiert, dass die Behebung dieses Pipifax-"Problems" sofort den Trieb auslöst einen Assembler-reti einzubauen. (Und nein, der Returnwert beim return muss keine Klammern haben. return ist ja schliesslich kein Funktionsaufruf oder hat eine abzufragende Bedingung wie sie ein if hat)
Beitrag #5139789 wurde von einem Moderator gelöscht.
Beitrag #5139807 wurde von einem Moderator gelöscht.
Dieser Beitrag ist gesperrt und kann nicht beantwortet werden.