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

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.

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.