Frage zu Quelltext

Gast #4399555
Lesenswert?

Hallo,

vielleicht kann wer schnell über den code schauen, finde leider nix in 
meinem C Buch und Compiler Datenblatt.

volatile int var1;
int var2 = 0;
Float var3 ;

void Main (void)
{
While (1)
{
 Var3 = 1000.0f / (var1-var2);

}

}

void ISR (void)
{
Var1++;
}


Kann irgendwo ein unvorhersehbarer Zustand entstehen und funktioniert in 
der ISR der wrap automatisch ?
Vielen Dank
Moderator (Firma: Titel) Persönliche Seite #4399569
Lesenswert?

C Starter schrieb:
> Kann irgendwo ein unvorhersehbarer Zustand entstehen
Welche Wortbreite hat dein Prozessor? Wie oft muss der die var1 für den 
increment in die Hand nehmen?

> funktioniert in der ISR der wrap automatisch ?
Welcher "Wrap"?

> finde leider nix in meinem C Buch
Welches?
Informationen zur Interruptbehandlung stehen nicht im C-Buch sondern im 
Compiler-Manual. Wenn du das dort nicht gefunden hast, dann hast du an 
der falschen Stelle geschaut.

Ansonsten fehlen wie üblich für eine konkrete Aussage Informationen:
Zielplattform? Compiler?
Gast #4399572
Lesenswert?

Wenn Var1 in mehrere Speicherzellen gespeichert wird, dann kann das 
Lesen
von Var1 Probleme machen.
Ist eines der Bytes schon gelesen, und kommt dann der Interrupt 
dazwischen, der den Wert schreibt, dann kann die weitere Leseoperation 
ein falsches Bitmuster liefern.

Man müßte also schauen, ob dein Prozessor irgendwie atomaren Zugriff 
machen kann, damit eine Leseoperation von Var1 nicht unterbrochen wird.
Gast #4399751
Lesenswert?

Lothar M. schrieb:
> Ansonsten fehlen wie üblich für eine konkrete Aussage Informationen:
> Zielplattform? Compiler?

O.k. nächster Versuch ....

Zielplattform = PSoC 1,
Prozessor = 8Bit , m8c, CY8C29466-24PXI
Compiler = Imagecraft c compiler psoc

Tolles Forum, vielen Dank für die Super Schnellen Rückmeldungen !


P.s. float sollte von mir auch klein geschrieben werden! Tippfehler
Moderator (Firma: Titel) Persönliche Seite #4399967
Lesenswert?

C Starter schrieb:
> Prozessor = 8Bit
Dann dürfte ein int-Wert 16 bit haben (das steht aber in der 
Compiler-Doku). Somit musst du sicherstellen, dass wie erwähnt das 
Lesen der 16-Bit Integer-Variablen var1 atomar passiert.
Denn sonst könnte ja der Zählerstand von var1 z.B. bei 0x00ff stehen. 
Die Hauptroutine beginnt mit dem Einlesen und liest das MSB zuerst: 
0x00. Dann kommt ein Interrupt, unterbricht das Einlesen und 
inkrementiert var1 auf 0x0100. Nach dem Interruptende macht die 
Hauptroutine weiter und liest das LSB ein: 0x00. Zusammengetzt ergibt 
sich damit für die Haputroutine dann var1 = 0x0000.

In der Praxis sieht es dann so aus, dass var3 "fast immer" richtig 
berechnet wird, aber "ab und zu" ein komplett unsinniger Wert 
herauskommt...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren