Interrupt ohne globale Var. ?

Gast #312281
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
Persönliche Seite #312282
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.
Gast #312283
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
Gast #312286
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.
#312289
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
Gast #312293
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.
Gast #312294
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

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.

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.