Forum: Mikrocontroller und Digitale Elektronik Structs in ISR


von micro1 (Gast)


Lesenswert?

Hallo,

wenn man eine Variable hat die in einr ISR und im Hauptprogramm
geändert wird muss diese ja volataile sein.
Nun habe ich aber noch structuren die sowohl in der ISR und im
Hauptprogramm geändert werden. Diese kann ich aber gar nicht volataile
machen sondern nur static.
In der ISR greif ich dann natürlich mit dem Punktoperator darauf zu.
Kann das Probleme geben, wenn ich in einer ISR auf die structur
zugreife da diese ja nicht volataile ist?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

.
   Diese kann ich aber gar nicht volataile
   machen sondern nur static.

Warum?

von micro1 (Gast)


Lesenswert?

Wenn ich die structur mit volatile anlegen will bekomme ich compiler
fehler.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Ach?














Was hältst Du davon, einen Quelltextschnipsel und die betreffende
Compilerfehlermeldung hier zu veröffentlichen?

von micro1 (Gast)


Lesenswert?

static struct structname

SIGNAL (SIG_OVERFLOW1)
{
structname.xyz=1;
}

void main(void)
{
structname.xyz=2;
....
}

So sieht der code jetzt aus.
Das hat bis jetzt auch immer funktioniert.
Nur habe ich jetzt gelesen das variablen die in ISRs und
imHauptprogramm genutzt werden volatile sein müssen.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Ich sehe keine Fehlermeldung.

Weißt Du, was im von Dir zitierten Codeschnipsel das Schlüsselwort
"static" bewirkt?

von micro1 (Gast)


Lesenswert?

Ja. Das heist diese Variable ist nur in diesem Modul zu sehen.
Das modul von dem der Schnipsel stammt heist main.c.
In meinem main.c gibt es halt die funktion
void main(void)
und sämtliche ISR sind dort programmiert.
Jetzt meine Frage.
Im AVR GCC Tutorial steht das variablen die in einer ISR benutzt werden
und im Hauptprogramm müssen volatile sein.
Nun ist meine Strukutr aber static.
Ich nutze die Struktur in mehrern ISR´s und im Hauptprogramm.
Ist dies schlimm. Bis jetzt funktioniert es nämlich.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Ich sehe immer noch keine Fehlermeldung.

von Dirk D. (dirkd)


Lesenswert?

Wie definierst Du eigentlich Deine Struktur?

Versuch mal

typedef struct
{
   int xyz;
   int abc;
} mystruct;

volatile mystruct astruct;

Das gibt bei mir keine Fehlermeldung.

> Wenn ich die structur mit volatile anlegen will bekomme ich
> compiler fehler.

Bei so einer Aussage solltest Du eigentlich mal den Code + den Wortlaut
der Fehlermeldung posten. Welchen Compiler Du verwendest könntest Du
auch mal erwähnen.

von micro1 (Gast)


Lesenswert?

Also ok

main.c:13: warning: passing arg 1 of `going' discards qualifiers from
pointer target type
Das war die Fehlermeldung.
#include <avr\io.h>
#include "struct.h"
#include "test.h"


volatile port hallo;

int main(void)
{
hallo.abc=0;
going(&hallo);
do
{
}
while(1);
return 0;
}
Das war der Code.

Jetzt aber noch mal zurück zur anderen Frage.
Kann die structur static bleiben  wenn ich in ISR darauf zugreife und
im Hauptprogramm?

von Cri Gri (Gast)


Lesenswert?

Hi leute....

hmm...hab mal so ne frage nebenbei!Also,was bringt mir so ne STRUCT
eigentlich? wofür verwendet ihr den die beim µC progn??
sorry wegen der Frage aber ich will halt noch lernen ;)

mfg Cri

von A.K. (Gast)


Lesenswert?

Wetten das going() den Parameter nicht als "pointer to violatile ..."
deklariert hat?

von Dirk D. (dirkd)


Lesenswert?

@micro1:
So jetzt haben wir eine Fehlermeldung.

Aber wieder keine Definition der Struktur. Und um zu verstehen was bei
Dir falsch läuft bräuchte man auch noch die Definition der Funktion
going. Die ISR wäre auch nicht schlecht.

Der Punkt ist volatile kannst und sollst Du verwenden.

@Cri Gri:
> wofür verwendet ihr den die beim µC progn??
Aus dem gleichen Grund wie jeder sonst struct verwendet. Strukturieren
;-) Zusammenfassen von einzelnen Variablen zu einem neuen Datentyp. Das
hat nix mit µC zu tun.

von micro1 (Gast)


Lesenswert?

hier die structur
ist nur ein Beispiel mein Orginal quellcode ist zu lang aber vom selben
typ
#ifndef struct_h
typedef struct
{
unsigned int abc:1;
}port;

#define struct_h 1
#endif

nun kommt die funktion going plus header
#include "struct.h"

void going(port *hallo);

#include "test.h"
#include "struct.h"

void going(port *hallo)
{
int x;

}

und nun die isr

SIGNAL(SIG_OVERFLOW0)
{
hallo.abc=1;
}

von micro1 (Gast)


Lesenswert?

Achja wenn ich in der main
static port hallo schreibe kommt keine Fehlermeldung

von A.K. (Gast)


Lesenswert?

"void going(port *hallo);"

Sach ich doch. Schreib da
  void going(volatile port *hallo);
und schon sieht's besser aus.

Mit "static" gibt es deshalb keinen Fehler, weil "static" kein
Bestandteil vom Datentyp ist, "volatile" jedoch schon.

von micro1 (Gast)


Lesenswert?

Ah jetzt funktionierts. Danke.
Aber ich verstehe immer noch nicht das es mit static trozt zugriff in
einer ISR immer funktioniert.
Weis da jemand genau bescheit drüber. Ich habe mir nämlich den
Assembler code angeschaut.
Meine volatile varibalen werden in der ISR mit "LDI" geladen.
Mein static variablen aber auch?

von Dirk D. (dirkd)


Lesenswert?

@A. K.
Genau. Das selbe Problem hätte der OP  bei Verwendung von const.

Beides sind "type qualifier" die auf jeden Datentyp angewendet werden
können. Damit natürlich auf selbst definierte, sprich structs.

Normalerweise sollte es aber "nur"  eine Warnung sein. (Ich denke
auch, daß jede Warnung eigentlich ein Fehler ist)

von Dirk D. (dirkd)


Lesenswert?

> [...] Mein static variablen aber auch?

Verwendest Du überhaupt Compiler-Optimierungen?

Wenn nicht, sollte ein volatile eigentlich nicht notwendig sein. Aber
Du machst die Funktionalität Deines Programms von den Compiler-Optionen
(und der Implementierung des Compilers) abhängig.

von micro1 (Gast)


Lesenswert?

Ich habe volle OPtimierung eingeschaltet

von Dirk D. (dirkd)


Lesenswert?

static und volatile schließen sich nicht gegenseitig aus. Sie sind haben
unterschiedliche Funktionen

static gehört in die gleiche Gruppe wie extern, auto oder register (und
mutable in c++)

Sie bestimmen die Art und Weise in der die Variablen und/oder
Funktionen gespeichert werden.

Dagegen gehört volatile zu den qualifier genau wie const. Volatile
bestimmt, daß der Compiler nicht versuchen soll einen Zugriff auf diese
Variablen (weg zu)-optimieren.

Du kannst z. B. eine Variable auch als

static volatile int x;

deklarieren.

Selbst ein

static volatile const int x;

ist syntaktisch in Ordnung.

Beispiel für eine mögliche Optimierung (Etwas stark konstruiert)

Du hast die Variable

unsigned long * RTC = 0xFFFE200;
unsigned long secs;
Später hast Du im Hauptprogramm die Zeilen

ms=*RTC;
printf("%d",ms);
ms=*RTC;
printf("%d",ms);

Ein Optimierer könnte auf die Idee kommen die zweite Zuweisen
wegzulassen, da sich an dem Inhalt an der Adresse 0xFFE200 nichts
geändert hat, da nicht auf RTC zugegriffen wurde.

In Wirklichkeit steht z. B. an dieser Adresse eine Uhrzeit in ms die
sich zwischen den Zuweisungen durch einen Interrupt geändert hat.

Um so eine Optimierung zu verhindern würde man ein volatile als
qualifier hinzufügen. also:

volatile unsigned long * RTC = 0xFFFE200;

Ich hoffe das habe ich zu später Stunde noch fehlerfrei hinbekommen ;-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.