www.mikrocontroller.net

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


Autor: honkmichi (Gast)
Datum:

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

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

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

Autor: Gerhard (Gast)
Datum:

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

Autor: Ssss Ssssss (sssssss)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
SIGNAL (SIG_OVERFLOW1){
  unsigned char myvar;
  myvar = 123;
        uart_send(myvar);
}

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

Bye, Simon

Autor: ich (Gast)
Datum:

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

Autor: honkmichi (Gast)
Datum:

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

Autor: honkmichi (Gast)
Datum:

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

Autor: Stephan (Gast)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

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

Autor: Ronny (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi

reden wir vom AVR?

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



mfg Ronny

Autor: crazy horse (Gast)
Datum:

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

Autor: Ronny (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

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


mfg ronny

Autor: crazy horse (Gast)
Datum:

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

Autor: Hagen (Gast)
Datum:

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

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.