mikrocontroller.net

Forum: Compiler & IDEs AVR-GCC: Wie float im Flash?


Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich muß einen float aus dem Flash auslesen, leider gibt es aber nur 
pgm_read_dword und damit kriege ich folgende Warnung:

DISPLAY.C:35: warning: dereferencing type-punned pointer will break 
strict-aliasing rules

Der Code:
float gain_uout;

*(long*)&gain_uout = pgm_read_dword( EEP_GAIN_UOUT );

Wie kann ich die Warnung beseitigen?


Peter

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

Bewertung
0 lesenswert
nicht lesenswert
Indem du nicht versuchst zu behaupten, dass ein long das gleiche wie
ein float sei.  's ist ja auch kein Fehler, sondern eine Warnung,
dein Code ist einfach unportabel.

Autor: SF (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So könnte es funktionieren:
float PROGMEM gain_flash = 1.2345;
float gain_ram;
  
  memcpy_P(&gain_ram, &gain_flash, sizeof(gain_ram));

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jörg Wunsch wrote:

> dein Code ist einfach unportabel.

Daß, obwohl er funktioniert, irgendwo der Wurm drin ist, war mir schon 
vorher klar, sonst hätte ich die Frage ja nicht gepostet.
Ich hätte eigentlich eher nen Tip in die richtige Richtung erwartet.

Ich muß den float-Wert von einer ganz bestimmten Adresse lesen, wo ihn 
das Kalibrationsprogramm ablegt.


Peter

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

Bewertung
0 lesenswert
nicht lesenswert
Peter Dannegger wrote:

> Ich muß den float-Wert von einer ganz bestimmten Adresse lesen, wo ihn
> das Kalibrationsprogramm ablegt.

Schon klar, dafür ist es ja ein EEPROM. ;-)

SF's Beispiel sollte es tun.  Die Beschwerde war, dass du zwei
Zeiger auf völlig unterschiedliche Typen vergewaltigst.  Wenn man
stattdessen über void * geht, ist die Sache portabel.

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter Dannegger wrote:
> Jörg Wunsch wrote:
>
>> dein Code ist einfach unportabel.
>
> Daß, obwohl er funktioniert, irgendwo der Wurm drin ist, war mir schon
> vorher klar, sonst hätte ich die Frage ja nicht gepostet.
> Ich hätte eigentlich eher nen Tip in die richtige Richtung erwartet.
>

Hast schon mal versucht, über ne Union zu lesen? Also ohne Casts durch 
Überlagern von long und float? Ist zwar unschon und kostet evtl n paar 
Bytres Code, aber die Warnung sollte weg sein.

Ausserdem kann man iirc die entsprechene Optimierung deaktivieren, so 
daß kein Fehler mehr entstehen kann.

...ah, schon gefunden:

Beitrag "dereferencing type-punned pointer - was ist das?"

Autor: Tmo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ich erledige das mit folgendem Standardtyp (kostet keinen extra  Code 
oder Speicher):
typedef union
{
  u8 _a[4];
    s8 _sa[4];
  u16 _w[2];
    s16 _sw[2];
    u32 _l;
    s32 _sl;
    f32 _f;
    struct
    {
        u8 u8Lo;
        u16 u16Mid;
        u8 u8Hi;
    } _uMid;
    struct
    {
        s8 s8Lo;
        s16 s16Mid;
        s8 s8Hi;
    } _sMid;
} tBuffer32;

Gruss und hoffe es hilft ...

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.