WinAVR: warning: assignment discards qualifiers

Gast #285170
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
Gast
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.
Gast
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
Gast
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.
Gast
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.
Gast
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;
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, ...

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 20 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.