mikrocontroller.net

Forum: Compiler & IDEs Rückkehr von ISR nach main


Autor: Norbert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo erstmal...

in meinem C-Programm mit ISR (Timer0 Overflow) möchte ich, daß die 
Rückkehr aus der ISR nicht zum ürsprünglichem Befehl(+1) springt sondern 
an den Programmstart (main).

Ist das in C möglich?

In ASM war alles soooooo einfach, da war ich Herrscher und Gebieter über 
jedes einzelne Bit.

Irgendwie hab' ich das Gefühl, daß 'C' mich in meiner Autorität
einschränkt.

Gruß    Norbert

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da gibt es so Funktionsaufrufe wie setjmp() und longjmp() mit denen man 
solche Schweinereien machen kann. Frag mich aber nun nicht wie das 
funktioniert, ich programmiere immer getreu nach der Bibel ;-)

Gruss,

Peter

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum so kompliziert, wenn es auch einfach geht.
Einfach eine Adresse in eine Funktion casten:

#define CALL(addr)      (((void(*)(void))(char *)addr)())

CALL(0x0000); // Reset = Sprung nach 0x0000


Peter

Autor: Norbert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Peter: Schweinerei ist OK! Hab' mir heut' Nacht die Bibel zu Hilfe 
genommen. Jetzt läufts bestens.

@Peter Dannegger: Ich kann zwar Deinen Befehl nicht lesen geschweige 
verstehen, werde ihn mir aber in meine Sammlung aufnehmen.

Norbert

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Norbert,

dann sieh mal im C-Handbuch unter Cast-Operator nach.

Mann kann einen Ausdruck in ein anderes Format casten (float, char usw.) 
oder in einen Pointer auf eine Funktion.

D.h. im obigen Beispiel wird kein RJMP sondern ein RCALL 0x0000 gemacht. 
Ist aber in diesem Fall egal, da dann eh der Stack neu initialisiert 
wird.


Funktionspointer braucht man z.B. auch, um einen Kommandointerpreter 
aufzubauen. Dazu erstellt man eine Tabelle mit den Kommadotexten (z.B. 
"LOAD", "STORE" usw.) und mit den Pointern auf die dann auszuführenden 
Funktionen.

Z.B.:

if( strcmp( rx_buff, comm_tab[i].name ) == 0 )
  return comm_tab[i].func(); // execute command


Peter

Autor: Jonas Diemer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ähm, main ist doch auch eine funktion, oder? kann man die nicht direct 
aufrufen?

- wohl eher nicht, wegen stack... (oder?)

Autor: Norbert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Peter Dannegger,

das mit dem Casten bei Variablen war mir bekannt, weitergehende 
Anwendungen sind noch 'Böhmische Dörfer'.

Nach 20 Jahren ASM und einem kleinen Intermezzo in Visual Basic hab' ich 
mir neulich 3 Fachbücher über ANSI-C geholt. Mit Christians Tut und 
diesem Forum wird's wohl auch was mit der C-Programmierung.

Ich darf mir nur nicht zuviel aufeinmal zumuten.


Norbert

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.