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
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
C Starter schrieb: > Kann irgendwo ein unvorhersehbarer Zustand entstehen evtl. ja, Stichwort atomarer Zugriff was für einen Prozessor hast du?
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?
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.
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...
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
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 ...
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.