mikrocontroller.net

Forum: Compiler & IDEs WinAVR: warning: assignment discards qualifiers


Autor: Slowflyer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe hier eine Compilerwarnung:

warning: assignment discards qualifiers from pointer target type

Beispielquelltext siehe weiter unten.
uint8_t *motor_1;
-> motor_1 = &OCR0A;

Kann mir mal jemand bitte die Warnung näher erläutern? Wenn ich das
richtig verstehe ist durch die Zuweisung der Ziel-Pointer-Typ verworfen
worden. Welchen Typ müsste der Ziel-Pointer dann haben? Mit uint16_t
*motor_1 geht es auch nicht, da meckert der Compiler über inkomptible
Pointer-Typen.

Danke im Voraus,

Willi

Autor: The Daz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schau mal in die AVR header files vom GCC. Dort ist OCR0A per #define
auf eine Memory-Adresse gemappt (0xirgendwas). Du schreibst folglich

motor1 = &(0xirgendwas)

Kann so nicht funktionieren.

Autor: Slowflyer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die schnelle Antwort.

Also so geht es nicht. Ich möchte das OCRxA und OCRxB Register der 3
verfügbaren Timer in Abhängigkeit von einer Variable beschreiben. D.h.
Variable == 0 dann OCR0A und OCR0B, Variable == 1 dann OCR1A und OCR1B
etc. Im Anhang hab ich einen Beispiel-Code reingestellt (der nicht
funktioniert, siehe Beitrag von The Daz), um es etwas zu verdeutlichen.
Wenn jemand eine Idee hat, wie man es lösen könnte, dann immer her
damit. Ich bin für jeden Tip dankbar.

Gruß,

Willi

Autor: Slowflyer (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Natürlich den Anhanhg vergessen... aber jetzt

Autor: Fritz Ganter (fritzg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
einfache Lösung: nimm nen switch()

Sonst könnte dir der Eintrag "How do I pass an IO port as a parameter
to a function?" in der avr-libc FAQ helfen.

Autor: Slowflyer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich sehe gerade, dass ich den Quelltext nicht vernüftig eingerückt habe.
Es sind zwei if-Abfragen hintereinander, im Prinzip sind es eigentlich
mehr, aber der Einfachheit halber habe ich sie weggelassen. Switch case
wird in diesem Fall nichts bringen, da die If-Abfragen auf verschiedenen
Variablen beruhen und ich keine Möglichkeit habe, diese in eine zu
packen. Außerdem habe ich noch zusätzlich if-Abfragen, die Bereiche
(z.B. < 0) abfragen: mit switch also nicht möglich.

Autor: Patrick Dohmen (oldbug) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dir fehlt vermutlich das 'volatile'...

Autor: The Daz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du wirst nicht umhin kommen, aussen einen switch auf com zu nehmen, und
in den cases individuell den switch check durchzufuehren und auf die
entsprechenden Register zuzugreifen.

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nope, OldBug liegt da schon richtig: Die Ports sind wohlweislich als
"volatile" deklariert. Steuerregister und Ports müssen das sein,
sonst sorgt der Optimizer des Compilers für unliebsame Überraschungen.

Also beispielsweise
  volatile uint8_t *motor_1 = &OCR0A;

Autor: Slowflyer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmm.. Ok, probier ich mal aus.

Danke!

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist eigentlich garantiert, dass comm immer im erlaubten
Bereich liegt?

Wenn ja, koenntest Du mal ueberlegen, die erste if-then-else
Leiter (oder den switch) durch einen Array Zugriff zu ersetzen.

  limitswitch = limitswitches[comm];
  motor_1 = motors_1[comm];
  motor_2 = motors_2[comm];


mit geeignet initialisierten Arrays

  volatile uint8_t* motors_1[] = { 0, &OCR0A, &OCR1A, &OCR2A };
  volatile uint8_t* motors_2[] = { 0, &OCR0B, &OCR1B, &OCR1B };
  unsigned char limitiswitsches[] = { 0, END_1, END_2, END_3 };

Oder man koennte eine struct, bestehend aus motor_1, motor_2 und
limitswitch machen und davon wieder ein Array, ...

Autor: Slowflyer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab es jetzt mit volatile gelöst. Funktioniert einwandfrei, Danke!!!

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.