Forum: Mikrocontroller und Digitale Elektronik Interrupt ohne globale Var. ?


von honkmichi (Gast)


Lesenswert?

Hi,
Gibt es eine Möglichkeit, in C (GCC Compiler), in einer
Interruptroutine den Inhalt einer Variablen zu verändern ohne das die
Variable global definiert ist?
Also das ich die Variable wärend der Laufzeit definiere und sie nach
dem Interrupt wieder lösche? Wie wird sowas gemacht?
mfg

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Du kannst einen Pointer global definieren, der auf die auf dem Heap zur
Laufzeit angelegte Variable verweist ...

Ansonsten kannst Du innerhalb einer Interruptroutine auf dem Stack oder
auch auf dem Heap soviele Variablen anlegen, wie der jeweilige Speicher
hergibt, wenn Du sie vor Beenden der Interruptroutine auch wieder
freigibst (passiert auf'm Stack automatisch), dann passiert auch
nichts böses.

von Gerhard (Gast)


Lesenswert?

Hallo

ist das ne akademische Frage ? Versteh den Hintergrund nicht. gehts nur
allgemin darum, keine globalen Variablen zu definieren ?

Eine Möglichkeit ist die, eine Variable in einer Subroutine zu
verwalten

int Sub1( int var )
{
   static int v1;
   v1 = var;
   return( v1 );
}

Ist ein sinnloses Beispiel - aber grundsätzlich verstehe ich so dein
Prob. isses das ? Du rufst also aus deiner ISR die Sunroutine auf.

Gerhard

von Ssss S. (sssssss)


Lesenswert?

1
SIGNAL (SIG_OVERFLOW1){
2
  unsigned char myvar;
3
  myvar = 123;
4
        uart_send(myvar);
5
}

Meinst du sowas ?
Nach dem interrupt ist die Variable wieder "weg"

Bye, Simon

von ich (Gast)


Lesenswert?

nein geht nicht ein interrupt kann keine werte zurück geben. sie muss
global deklariert werden.
mfg ich

Ps: Yea, das erste mal, dass ich in diesem Forum eine Frage beantworten
kann!!!

von honkmichi (Gast)


Lesenswert?

Ich will in der Interrupt routine einen Bit in einer 64Bit Variablen
ändern. Nur ich will nicht während der gesamten Laufzeit diese 64Bit
Variable im Speicher behalten, weil ich sie nur für ein Teilprogramm
brauche. Soll ein Programm zum empfangen des DCF77 Signals sein.

Wenn ich das Ändern des Bits über ein flag steuere das durch den
Interrupt geändert wird, muss ich 1min in einer Funktion verharren.
Weil wenn ich da wieder rauslaufe ist meine 64Bit Variable ja wieder
gelöscht. Ist also auch keine saubere Lösung.

von honkmichi (Gast)


Lesenswert?

In C kann ich doch Speicherplatz reservieren (mit malloc)und irgendwann
wieder freigeben (free). Geht das mit dem MC auch?

von Stephan (Gast)


Lesenswert?

Du könntest auch einen unbenutzten Pin oder Port-Bit entsprechend setzen
und später auswerten. So ginge das auch ohne globale Variable.

Stephan.

von Peter D. (peda)


Lesenswert?

Wegen läppischen 8 Byte ein Malloc-Monster anzuschmeißen lohnt sich
nicht, der Verwaltungsaufwand frißt die Einsparung wieder auf.

Ist denn Dein SRAM wirklich schon randvoll ?

Dann zeig mal Dein Programm, es gibt bestimmt wesentlich besser
geeignete Einsparkandidaten.


Peter

von Ronny (Gast)


Lesenswert?

hi

reden wir vom AVR?

wenn ja:
im Statusregister gibts doch n frei verwendbares Bit (Flag). Vielleicht
ist das geeignet....



mfg Ronny

von crazy horse (Gast)


Lesenswert?

genau das ist für Interupt-Rückgabe gänzlich ungeeignet, da die
1.Aufgabe fast jeden Int-Programms darin besteht, den Zustand des SREG
zu sichern und am Ende wieder herzustellen.

von Ronny (Gast)


Lesenswert?

Hi

Das ist wohl wahr, aber man kann ja die Int-Routine das entsprechend
geänderte Register zurückgebn lassn.


mfg ronny

von crazy horse (Gast)


Lesenswert?

aber auch nur dann, wenn das T-flag sonst im ganzen Programm nicht
genutzt wird, und das kannst du in C nicht garantieren, im Gegenteil,
es ist davon auszugehen, dass es benutzt wird.
Das ist Murks.

von Hagen (Gast)


Lesenswert?

"Programmieren ist das clevere Abwägen von Aufwand und Nutzen"

Das sollte meiner Meinung nach IMMER die wichtigste Devise eines
Programmierers sein.

Nur weil einige übertreibende JAVA Programmierer das Konzept der OOP
nicht verstanden haben und meinen das globale Variablen schlecht und
Verschwendung wären, sollte man sich denoch an obige Devise halten.

Was ist an den globalen Vars so schlecht ? Das eigentliche Problem sind
nicht diese Vars sondern die korrekte Kapselung der Zugriffe auf diese
Vars um Fehler zu vermeiden.

Die einzigste saubere Lösung für dein Problem ist die Möglichkeit
dynamisch zur Laufzeit Speicher allozieren zu können, ergo ein
Speichermanager wie Malloc() etc. Das beseitigt aber die globale
Variable immer noch nicht. Denn für die ISR benötigst du immer noch
eine globale Var in der dann der Zeiger auf den dynamischen
Speicherbereich drinnen steht. Dieser braucht also auch immer 2-4
Bytes.


Gruß Hagen

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.