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


von Slowflyer (Gast)


Lesenswert?

Hallo,

ich habe hier eine Compilerwarnung:

warning: assignment discards qualifiers from pointer target type

Beispielquelltext siehe weiter unten.
1
uint8_t *motor_1;
2
-> 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

von The Daz (Gast)


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.

von Slowflyer (Gast)


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

von Slowflyer (Gast)


Angehängte Dateien:

Lesenswert?

Natürlich den Anhanhg vergessen... aber jetzt

von Fritz G. (fritzg)


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.

von Slowflyer (Gast)


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.

von Patrick D. (oldbug) Benutzerseite


Lesenswert?

Dir fehlt vermutlich das 'volatile'...

von The Daz (Gast)


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.

von A.K. (Gast)


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;

von Slowflyer (Gast)


Lesenswert?

Hmm.. Ok, probier ich mal aus.

Danke!

von Karl H. (kbuchegg)


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, ...

von Slowflyer (Gast)


Lesenswert?

Hab es jetzt mit volatile gelöst. Funktioniert einwandfrei, Danke!!!

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.