mikrocontroller.net

Forum: Compiler & IDEs wie anderes Sprungziel in ISR angeben


Autor: Egon Müller (kpc)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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?"

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Egon Müller (kpc)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Egon Müller (kpc)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Egon Müller (kpc)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: MWS (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Egon Müller (kpc)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.