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


von Norbert (Gast)


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

von Peter (Gast)


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

von Peter D. (peda)


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

von Norbert (Gast)


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

von Peter D. (peda)


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

von Jonas Diemer (Gast)


Lesenswert?

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

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

von Norbert (Gast)


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

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.