Forum: Compiler & IDEs wie anderes Sprungziel in ISR angeben


von Egon M. (kpc)


Lesenswert?

Hallo,
so eine ISR springt stur dahin zurück, wo sie hergekommen ist
(bei meinem Versuchsprogramm z.B. in eine Endlosschleife).

Ich hätte es aber gern, wenn sie im Befehlszähler etwas weiter spränge.

Dann habe ich alternativ in die ISR den Aufruf einer Funktion 
geschrieben, wurde aber vom Compiler belehrt, daß diese Funktion hier 
nicht definiert sei.
Vielleicht löst eine Funktion das Problem gar nicht. Goto geht leider 
auch nicht.

Kennt jemand einen Trick?

Gruß
Egon

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

> Ich hätte es aber gern, wenn sie im Befehlszähler etwas weiter spränge.

Kaputtes Design.

> Dann habe ich alternativ in die ISR den Aufruf einer Funktion
> geschrieben,

Ja, so kann man das Problem lösen, wenn denn die betreffende Funktion 
nicht sonderlich viel Zeit benötigt.

> wurde aber vom Compiler belehrt, daß diese Funktion hier
> nicht definiert sei.

Tja, dann fehlte da halt der Funktionsprototyp bzw. die zugehörige 
Include-Datei war nicht eingebunden.

von Stefan E. (sternst)


Lesenswert?

Wieso kommst du jetzt eigentlich wieder auf diesen Schrott mit Watchdog 
und "nach ISR woanders hin springen" zurück. Du hattest doch schon 
angefangen, den "normalen" Weg zu gehen. Woran hapert es jetzt?

Hier die anderen Threads zum gleichen "Projekt":
Beitrag "watchdog ohne Totalreset?"
Beitrag "16-bit-Timer - wer kann helfen?"
Beitrag "wie ATMega644- Watchdog ohne Headerdatei betreiben?"

von Gast (Gast)


Lesenswert?

wenn es unbedingt sein muss - die Vorposter haben ja schon geschrieben, 
dass das ein kaputtes Design ist - kannst Du per inline ASM den Stack 
manipulieren: Rücksprungadresse runterPOPen (nicht runterpoppen :-) und 
neue Zieladresse auf den Stack pushen plus den Rest wieder drauf 
schreiben.

Die Zeit, die es dauert, um das zu realisieren solltest Du aber besser 
in ein anderes Programmdesign investieren.

von Oliver (Gast)


Lesenswert?

>Dann habe ich alternativ in die ISR den Aufruf einer Funktion
>geschrieben, wurde aber vom Compiler belehrt, daß diese Funktion hier
>nicht definiert sei.

Solange du solche elementaren Dinge nicht hinbekommst, macht es gar 
keinen Sinn, über Stackmanipulationen auch nur nachzudenken.

>Goto geht leider auch nicht.

Das geht bestimmt, ebenso ein break, aber beides braucht es vermutlich 
gar nicht.

Formuliere doch nochmal den Kern der Aufgabenstellung. Das war doch 
irgenwas mit Impulsen und Sensorfehlererkennung durch timeout.

Oliver

von Peter D. (peda)


Lesenswert?

Solange Du kein Multitasking benutzt, geht unter C ein long Jump:

http://www.java2s.com/Code/C/Memory/Memorylongjump.htm


Aber ich muß auch sagen, es ist deutlich besser (wartbarer, weniger 
fehleranfällig), wenn man es durch einen besseren Programmablaufplan 
löst.

Sobald die Programme größer werden, steigt die Gefahr, daß Du durch den 
Sprung andere wichtige Prozesse killst. Ein Eingenschaft von Interrupts 
ist nämlich, daß Du garnicht weißt, was er gerade unterbricht.

Bzw. wenn Du wirklich weißt, daß er nur an einer bestimmten Stelle 
unterbricht, dann brauchst Du ja garkeinen Interrupt mehr.
Dann kannst Du einfach an dieser Stelle warten, bis das 
Interrupt-Pending-Flag gesetzt ist.


Peter

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Peter Dannegger schrieb:
> Solange Du kein Multitasking benutzt, geht unter C ein long Jump:

Dann sollte man aber immer noch dran denken, die Interrupts noch
freizuschalten.

Ich hoffe aber, dass ich in meinem Leben niemals einem Gerät mit
derartiger verhunzter Firmware in Berührung kommen muss. schauder

von Oliver (Gast)


Lesenswert?

>Ich hoffe aber, dass ich in meinem Leben niemals einem Gerät mit
>derartiger verhunzter Firmware in Berührung kommen muss.

Nach dem bisherigen Verlauf der Diskussion ist die Gefahr äusserst 
gering...

Oliver

von Egon M. (kpc)


Lesenswert?

Jörg Wunsch schrieb:
> Peter Dannegger schrieb:
>> Solange Du kein Multitasking benutzt, geht unter C ein long Jump:
>
> Dann sollte man aber immer noch dran denken, die Interrupts noch
> freizuschalten.
>
> Ich hoffe aber, dass ich in meinem Leben niemals einem Gerät mit
> derartiger verhunzter Firmware in Berührung kommen muss. *schauder*

Hallo Jörg

Ich kann mir gut vorstellen, daß sich deutliche Unlustgefühle 
einstellen, wenn man als Experte zusehen muß, was die Dilettanten so 
alles verzapfen.
Ich habe also volles Verständnis für Deinen Schauder.

Du kannst Dir weiterhin unbesorgt jegliche Firmware zulegen,  m e i n e 
ist garantiert auf gar keinen Fall dabei (es handelt sich um ein nicht 
kommerzielles Vorhaben zur Überwachung meines Gartenteiches).
Im übrigen funktioniert es mit einem interruptauslösenden Watchdog 
bestens.

Ob ich mich mal wieder hier mit Fragen einfinden darf?

Vielen Dank auch für die anderen Beiträge!
Viele Grüße
Egon

von Egon M. (kpc)


Lesenswert?

Stefan Ernst schrieb:
> Wieso kommst du jetzt eigentlich wieder auf diesen Schrott mit Watchdog
> und "nach ISR woanders hin springen" zurück. Du hattest doch schon
> angefangen, den "normalen" Weg zu gehen. Woran hapert es jetzt?
>
Im Manual, dessen Lektüre einem ja immer wieder empfohlen wird, wurde 
der Watchdog als sehr nützlich angepriesen.

Deshalb habe ich nach besseren Beschreibungen gesucht, ihn mal 
ausprobiert und ich finde, daß er sehr brauchbar ist - wenn man seine 
Tücken vermeidet.

Ich habe in den beiden Programmen jeweils vor der kritischen Abfrage den 
WD gestartet und ihn danach gleich wieder ausgeschaltet. In der von 
Atmel gebrauchfertig vorgegbenen ISR habe ich einfach ein Flag gesetzt, 
das sich überall leicht abfragen lies.
Indem ich vor und nach WD-Gebrauch das Statusregister gesichert und 
wiederhergestellt habe, konnte ich die beiden Programme ohne Störungen 
in eine größeres Projekt mit allerhand Interrupts, wo man nicht einfach 
cli(); oder sei(); schreiben kann, integriert - und es funktioniert 
immer noch (Ulis Webserver ETH_M32....).

Also, der Watchdog ist vielleicht nicht fein, aber manchmal sehr 
praktisch.

Viele Grüße
Egon

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Lässt du dich früh auch von deinem Hund beißen, weil du keine Lust
hast, dir anzusehen, wie man den normalen Wecker auf dem Nachttisch
stellt?

Ungefähr sowas machst du jedenfalls gerade in deiner Software...

von Egon M. (kpc)


Lesenswert?

Jörg Wunsch schrieb:
> Lässt du dich früh auch von deinem Hund beißen, weil du keine Lust
> hast, dir anzusehen, wie man den normalen Wecker auf dem Nachttisch
> stellt?
>
> Ungefähr sowas machst du jedenfalls gerade in deiner Software...

Dein Vergleich ist besser als man denkt, insofern nämlich mein liebes 
Hündchen mich nicht beißen, sondern freundlich an der Nase lecken würde 
- besser als das schrille Weckergeklingel!

Nichts für ungut
Egon

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Egon Müller schrieb:

> Dein Vergleich ist besser als man denkt, insofern nämlich mein liebes
> Hündchen mich nicht beißen, sondern freundlich an der Nase lecken würde

Dann agiert er aber nicht als Watchdog, sondern als regulärer Timer.

von MWS (Gast)


Lesenswert?

He, he, hab' mir diesen Thread gelinkt für den Fall daß wieder mal ein 
Basic / C Flamewar entsteht.

Hier kann nun wirklich niemand mehr behaupten daß Ergebnisse in C besser 
sind oder der Programmierer durch Benutzung selbiger Sprache automatisch 
mehr Ahnung hätte :D

von Egon M. (kpc)


Lesenswert?

Jörg Wunsch schrieb:
> Egon Müller schrieb:
>
>> Dein Vergleich ist besser als man denkt, insofern nämlich mein liebes
>> Hündchen mich nicht beißen, sondern freundlich an der Nase lecken würde
>
> Dann agiert er aber nicht als Watchdog, sondern als regulärer Timer.

Das stimmt; es wird bei dem Programm ein Port sechs mal abgefragt und 
zwei mal mittels Timer ausgezählt, wobei der Sensor in jeder Phase 
stehen bleiben kann. Da kam es mir bequemer vor, diese kritische Passage 
einmal mittels Watchdog zu überwachen als in jeder der sechs Schleifen 
einen Ausstieg mittels Zähler zu integrieren.

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.