Forum: Mikrocontroller und Digitale Elektronik Frage zu Quelltext


von C Starter (Gast)


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

von Olaf B. (Firma: OBUP) (obrecht)


Lesenswert?

C Starter schrieb:
> (var1-var2)

was passiert, wenn
1
var1 = var2

oder
1
var1 = var2 = 0

Division durch 0 sollte man vermeiden!

mfg

O. Brecht

von Loddaar (Gast)


Lesenswert?

C Starter schrieb:
> Kann irgendwo ein unvorhersehbarer Zustand entstehen

evtl. ja, Stichwort atomarer Zugriff
was für einen Prozessor hast du?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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?

von PittyJ (Gast)


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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

C Starter schrieb:
> vielleicht kann wer schnell über den code schauen
> volatile int var1;
> Float var3 ;
> Var1
> Var3
C ist Case-sensitiv. Deshalb gibt es in obigem Progamm kein Var1 und 
kein Var3 und auch kein Float...

von C Starter (Gast)


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

von Joh W. (Firma: tet) (hampel)


Lesenswert?

Habe noch zu wrap-around 
http://stackoverflow.com/questions/19842215/wrap-around-explanation-for-signed-and-unsigned-variables-in-c 
gefunden
Dazu finde ich leider auch nix im Compiler Datenblatt ...

von schraubär (Gast)


Lesenswert?

var1 ist int, geht also von -32768 bis +32767.
Wenn var1 also bereits bei 32767 steht und Du +1 dazu addierst, dann 
wird die var1 danach bei -32768 stehen.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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...

: Bearbeitet durch Moderator
von Mike (Gast)


Lesenswert?

*W*hile (1)
.... kennt der compiler auch ned

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.