Interrupts und Variablen

Gast #40469
Lesenswert?
• ▲
▼
Ja natürlich, genau das ist ja Sinn und Zweck der globalen Variablen.

Ist deine Variable global kannst du sie im ganzen Programm, egal ob nun 
main() oder eine Interrupt-Routine, schreiben und lesen.
Gast #40470
Lesenswert?
• ▲
▼
Bitte beachten

Falls man sowohl vom main oder Nicht-Interrupt-Routines als auch von 
Interrupt-Routinen auf globale variablen zugreifen will muss man sie als 
"volatile" deklarieren:

static volatile uint8_t  flag;
Gast #40471
Lesenswert?
• ▲
▼
Das war klar. Aber Eure Aussagen beantworten meine Frage nicht.

@Sascha

mir ist die Bedeutung der globalen Variable schon geläufig. Meine Frage 
zielte eigentlich auf eine Antwort ab, ob es eine Alternative (pointer) 
gibt und ob diese effizienteren Code beim kompilieren ergibt.

@Peter
Ja, ich habe die FAQ gelesen, wird sonst wegoptimiert die Variable.
Gast #40472
Lesenswert?
• ▲
▼
Nein, es gibt keine andere Variante als statische (Modul-lokale)
oder globale Varianten, um ISRs mit dem Rest der Welt
kommunizieren zu lassen.

Schön, daß Du die FAQ auch gelesen hast. :-)  Leider ist das
noch nicht so die Norm, daß die Leute das tun, daher Peters
Hinweis...
Gast #40473
Lesenswert?
• ▲
▼
Was mir dazu noch eingefallen ist: man sollte natürlich mit
»volatile« deklarierten Variablen sehr vorsichtig umgehen.  Das
Schlüsselwort verhindert jede Zugriffsoptimierung auf diesen
Variablen, sie werden als jeses Mal im Speicher gelesen oder
geschrieben.

Typischer Fall:

#include <inttypes.h>

#include <avr/io.h>
#include <avr/signal.h>

volatile uint8_t timertick;

SIGNAL(SIG_OVERFLOW0)
{
        if (timertick++ == 8)
                timertick = 0;
}

Sieht doch vernünftig aus, oder? :-)
Für einen AT90S8515 mit -O compiliert gibt das 23 Worte Code
für die Interruptroutine.

Alternative:

SIGNAL(SIG_OVERFLOW0)
{
        uint8_t t = timertick;

        if (t++ == 8)
                t = 0;

        timertick = t;
}

Hier wird die nicht optimierbare Variable timertick nur
genau einmal gelesen und einmal geschrieben.  Die Arithmetik
erfolgt auf der optimierbaren Variable `t'.  Das ergibt nur
20 Worte für die Routine.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 23 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.