MSP Warnung bei Mittelwertbildung

Gast #1321331
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?
Gast #1321347
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
Gast #1321360
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
Gast #1321378
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 ;-)

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.