Bin gerade mit dem MSP430F169 am spielen und bekomme immer bei meiner Mittelwertbildung immer die Warnung: undefined behavior: the order of valatile accesses is undefined in statement Mein Code sieht so aus: unsigned short mittelwert; ... mittelwert = (ADC12MEM0 + ADC12MEM1) / 2 Kann mir jemand sagen was ich machen muss damit die Warunung weg ist?
1.) Wenn Du weißt, was Du tust und sicherstellen kannst, dass während der gesamten Mittelwertbildung keine ADC-Messung läuft, die ADC12MEM0 oder ADC12MEM1 ändern könnte, dann ignoriere die Warnung (es ist ja kein Fehler!) 1b) Wenn Dich die Warnung stört, dann kannst Du sie abschalten (IAR): Project -> Options -> C/C++ compiler -> Suppress... [Pa082] 2.)
1 | unsigned short mittelwert; |
2 | unsigned short mem0, mem1; |
3 | |
4 | mem0 = ADC12MEM0; |
5 | mem1 = ADC12MEM1; |
6 | mittelwert = (mem0 + mem1) / 2 |
Hy, ich schliesse mich da Stefan an. Ansonsten emfpehle ich dir einmal die TI-Code Beispiele anzuschauen. Da sieht man schön wie man den ADC initialisiert, Interrupts sperrt, bzw freigibt. inkl. das Rücksetzen der jeweiligen Flags... ich bin der Meinung das Auslesen eines ADC Registers setzt das jeweilige IR-Flag zurück, da du eine Addition der beiden Register machst und dann der Variable zuordnest kann der Compiler nicht garantieren dass beide IR-Flags zurückgestezt werden, bzw. welches der beiden zurückgesetzt wird. In den beispielen wird immer jedes Register einzeln ausgelesen. Ich hab jetzt im USER-GUIDE nicht nachgelesen wie es funktioniert, denke aber es macht mehr Sinn das ganze sequenziell abzuhandeln. Kannst ja die werte in ein Array speichern und dann den Mittelwert bilden. üblicherweise reichen dir ja auch nicht 2 Werte für einen schönen Mittelwert. MFG Fabio
http://www.ti.com/lit/zip/slac015 hier der Link zu den Codebeispielen für MSP430x13x, MSP430F14x, MSP430F15x, MSP430F16x
Das hat weder was mit den IFG-Bits noch mit der Initialisierung des ADC zu tun! Es geht allein darum, dass ADC12MEMx Variablen bzw. Speicherbereiche einer Peripherie-Einheit sind, die vom Compiler nicht kontrolliert werden können. D.h. die Addition von ADC12MEM0 und ADC12MEM1 ist kein atomater Zugriff, sondern eine aneinander Reihung von Assemblerbefehlen, wobei jederzeit mittendrin die Speicherbereiche für ADC12MEMx durch den ADC geändert werden könnten, wodurch die Rechenoperation unvorhersehbare Ergebnisse liefern könnte. Das erkennt der Compiler und wirft eine Warnung aus... nicht mehr aber auch nicht weniger ;-)
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.