Forum: Mikrocontroller und Digitale Elektronik MSP Warnung bei Mittelwertbildung


von Jan (Gast)


Lesenswert?

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?

von Stefan (Gast)


Lesenswert?

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

von Fabio (Gast)


Lesenswert?

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

von Fabio (Gast)


Lesenswert?

http://www.ti.com/lit/zip/slac015

hier der Link zu den Codebeispielen für MSP430x13x, MSP430F14x, 
MSP430F15x, MSP430F16x

von Stefan (Gast)


Lesenswert?

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 ;-)

von Fabio (Gast)


Lesenswert?

ok, ich geb mich geschlagen ;)

hast ja recht...

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.