Interrupt ohne globale Var. ?

Gast #312281
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
Persönliche Seite #312282
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.
Gast #312283
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
Gast #312285
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!!!
Gast #312286
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.
Gast #312288
Du könntest auch einen unbenutzten Pin oder Port-Bit entsprechend setzen
und später auswerten. So ginge das auch ohne globale Variable.

Stephan.
#312289
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
Gast #312291
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.
Gast #312293
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.
Gast #312294
"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

Eine eigene Frage? Dieser Thread ist über 20 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.