mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik MSP Warnung bei Mittelwertbildung


Autor: Jan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.)
unsigned short mittelwert;
unsigned short mem0, mem1;

mem0 = ADC12MEM0;
mem1 = ADC12MEM1;
mittelwert = (mem0 + mem1) / 2

Autor: Fabio (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Fabio (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
http://www.ti.com/lit/zip/slac015

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

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ;-)

Autor: Fabio (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok, ich geb mich geschlagen ;)

hast ja recht...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.