www.mikrocontroller.net

Forum: Compiler & IDEs Interrupts und Variablen


Autor: Axel Beierlein (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nu isses passiert. Nächstes Problem.

Ist es nur möglich in Interrupts globale Variablen zu verwenden wenn ich 
diese in main auswerten will?

Gruß Axel

Autor: Sascha Weitkunat (Gast)
Datum:

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

Autor: Peter Fleury (Gast)
Datum:

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

Autor: Axel Beierlein (Gast)
Datum:

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

Autor: Joerg Wunsch (Gast)
Datum:

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

Autor: Joerg Wunsch (Gast)
Datum:

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

Autor: Axel Beierlein (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Jörg. Genau sowas meinte ich. Habe mich da vielleicht etwas doof 
ausgedrückt beim Fragen.

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.