www.mikrocontroller.net

Forum: Compiler & IDEs ATxmega: Warnung bei Adresse->Integer Wandlung für DMA


Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, vielleicht ist ja gerade ein GCC Crack am Start. Habe soeben den 
DMAC vom ATxmega ans laufen bekommen, allerdings stören mich da noch ein 
paar Fehlermeldungen.
Es geht darum eine Adresse in einen integralen Datentypen zu wandeln und 
auf die Art und Weise in 3 8-Bit-Stückchen zu zerhacken, damit man diese 
Adresse in das Adressregister der DMA laden kann.

Konkret handelt es sich um folgenden Code:
  EXTADC_TX_DMA.SRCADDR0 = (uint8_t) ( (uint32_t) ( (void*)ConvBytes ) >> 0 );
  EXTADC_TX_DMA.SRCADDR1 = (uint8_t) ( (uint32_t) ( (void*)ConvBytes ) >> 8 );
  EXTADC_TX_DMA.SRCADDR2 = (uint8_t) ( (uint32_t) ( (void*)ConvBytes ) >> 16 );
  EXTADC_TX_DMA.DESTADDR0
      = (uint8_t) ( (uint32_t) ( (void*)& ( EXTADC_UART.DATA ) ) >> 0 );
  EXTADC_TX_DMA.DESTADDR1
      = (uint8_t) ( (uint32_t) ( (void*)& ( EXTADC_UART.DATA ) ) >> 8 );
  EXTADC_TX_DMA.DESTADDR2
      = (uint8_t) ( (uint32_t) ( (void*)& ( EXTADC_UART.DATA ) ) >> 16 );

In jeder Zeile gibt es folgenden Fehler:
../ExtADC.c:113: warning: cast from pointer to integer of different size

Nunja, die Fehlermeldung kommt wohl, weil (void*) 16-Bit breit ist und 
uint32_t eben 32-Bit breit. Auch wenn ich hier kein Gefahrenpotenzial 
sehe, wird das als Warnung angegeben. Leider sehe ich aber auch keinen 
Weg drumherum, bzw. ich sehe gar nicht den Grund, warum der DMAC 
überhaupt 24-Bit Adressen braucht, wenn der GCC sowieso nur 16-Bit 
verwalten kann?

Eine zweite Stellungnahme wäre vielleicht interessant, danke schon mal 
im Voraus.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Simon K. wrote:
   EXTADC_TX_DMA.SRCADDR1 = (uint8_t) ( (uint32_t) ( (void*)ConvBytes )
>> 8 );

Nun, du machst aus irgendwas einen Zeiger, schiebst den dann aber um
8 Bits nach rechts, was ihn implizit zu einem Integer macht.

Funktioniert es denn so?
EXTADC_TX_DMA.SRCADDR1 = (uint8_t) ((uint32_t)(void*)ConvBytes ) >> 8);

Wobei ich mir gerade nicht sicher bin, ob der Cast nach void* nicht
ggf. die obersten 8 Bits abschneiden würde.

> ..., bzw. ich sehe gar nicht den Grund, warum der DMAC
> überhaupt 24-Bit Adressen braucht, wenn der GCC sowieso nur 16-Bit
> verwalten kann?

Der Xmega ist nun einmal nicht an den Limitierungen eines GCC konzipiert
worden. ;-)  Ich nehme mal an, dass das RAM-Adressen sind hier?  Der
Xmega kann ja wohl extern mehr als 64 KiB an RAM verwalten, auch wenn
der GCC dies nicht direkt (also in Form von Variablen) andressieren
kann.

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jörg Wunsch wrote:
> Simon K. wrote:
>
>
>    EXTADC_TX_DMA.SRCADDR1 = (uint8_t) ( (uint32_t) ( (void*)ConvBytes )
>>> 8 );
> 
>
> Nun, du machst aus irgendwas einen Zeiger, schiebst den dann aber um
> 8 Bits nach rechts, was ihn implizit zu einem Integer macht.
>
> Funktioniert es denn so?
Vor dem Schieben wird doch der Zeiger wieder in einen uint32_t 
gewandelt. So funktioniert es, jep.

>
> EXTADC_TX_DMA.SRCADDR1 = (uint8_t) ((uint32_t)(void*)ConvBytes ) >> 8);
> 
Brauch ich nun wirklich eine Brille oder ist das nicht genau das 
Gleiche, wie ich geschrieben habe, nur mit weniger Leerzeichen? :-)

> Der Xmega ist nun einmal nicht an den Limitierungen eines GCC konzipiert
> worden. ;-)  Ich nehme mal an, dass das RAM-Adressen sind hier?  Der
> Xmega kann ja wohl extern mehr als 64 KiB an RAM verwalten, auch wenn
> der GCC dies nicht direkt (also in Form von Variablen) andressieren
> kann.
Das heißt ja zwangsläufig, dass man bei Adressen > 64kiB da irgendwas 
zusammenfrickeln muss für das DMA-Adress-Highest-Byte. Hm.
Dann kann ich ja eigentlich auch direkt das DMA.SRCADDR2 Register auf 0 
setzen und den Zeiger statt in uint32_t in uint16_t wandeln. Dann kommt 
die Warnung nämlich nicht mehr ;)

Danke jedenfalls für deine Antwort.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Simon K. wrote:

> Brauch ich nun wirklich eine Brille oder ist das nicht genau das
> Gleiche, wie ich geschrieben habe, nur mit weniger Leerzeichen? :-)

Ich hätte nicht so früh am Morgen posten sollen. ;-)  Da ist noch ein
Klammerfehler drin, und wenn man den rausnimmt, ist es effektiv das
gleiche wie deins, ja.

Autor: Helmut Ru (heru01)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Simon, hallo Jörg,
in den Appnotes ist dieses Bsp. enthalten. Meldungen bei DMA und EBI.
Nun aber doch die Frage: ...und wie bekomme ich jetzt die Meldung weg? 
Ich weiss dass ich sie ignorieren kann, aber: kann ich eine Direktive 
setzen, die diese Meldung unterdrückt, in der Art:
#Meldung_aus

 EXTADC_TX_DMA.SRCADDR1 = (uint8_t) ( (uint32_t) ( (void*)ConvBytes )
>>> 8 );

#Meldung an

Gruß
Helmut

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welche Fehlermeldung genau? Die Fehlermeldung die ich dazu bekommen habe 
war, weil GCC 16Bit Pointer verwendet, ich aber das obere 2. Byte haben 
wollte. Was es bei 16Bit natürlich nicht gibt.
Sprich: Die Fehlermeldung kam bei mir nur in der Zeile mit SRCADDR2.
Setze das Register einfach auf 0, das sollte moralisch in Ordnung gehen 
:-)

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.