mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik [AVR] __flash conversion warning


Autor: Nico W. (nico_w)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin zusammen,

Pointer, __flash und co sind noch recht neu für mich und ich bin schon 
eine ganze Zeit am lesen. Manches klappt schon ganz gut, aber hier weiß 
ich nicht mehr weiter.

Angefangen habe ich mal hiermit: 
https://www.mikrocontroller.net/articles/AVR-GCC-T...

Mein Code sind in etwa so aus:
void writestr_F(const __flash char *data_F) {
  uint8_t r, i=0;
  while ((r = data_F[i])) {
    do_something(r);
    i++;
  }
}

#define FSTR(X) ((const __flash char *) { X })

main() {
  writestr_F(FSTR("print a string"));
}

Ich bekomme jetzt aber diese Warnung:
 warning: conversion from address space 'generic' to address space '__flash' [-Waddr-space-convert]

Grüße
Nico

Autor: Peter II (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
bin mir nicht sicher, aber die {} sehen mir falsch aus.
#define FSTR(X) ((const __flash char *) ( X) )

Autor: Nico W. (nico_w)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Leider nicht. Egal ob (X),{X} oder X.

Autor: Oliver S. (oliverso)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"Print a String" ist nunmal ein normaler Sting, den legt der Compiler im 
SRam an. Da ändert auch der davor geschrieben Cast in einen Flash 
Pointer nichts.

Das Makro FSTR dient nur und ausschließlich dazu, Flash-Pointer zu 
initialisieren. Was du brauchst, ist PSTR. Das legt eine Stringkonstante 
direkt im Flash an.

Dazu solltest du dir nochmals den Unterschied zwischen printf und 
printf_P anschauen.

Oliver

Autor: Nico W. (nico_w)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oliver S. schrieb:
> "Print a String" ist nunmal ein normaler Sting, den legt der Compiler im
> SRam an. Da ändert auch der davor geschrieben Cast in einen Flash
> Pointer nichts.

Ja, was du schreibst macht durchaus Sinn. Ich habe mir mal nach deinem 
Tipp printf_P und printf angeguckt. Kam da jetzt aber nicht wirklich 
weiter. Allerdings habe ich mir dann mal PSTR genauer angesehen.

Letzendlich will ich mein Zeugs ja in den Flash schreiben. Aber nicht 
mehr über PSTR und dem PROGMEM sondern über __flash.

Über Beitrag "Struct mit String im Flash Zugriff"
und PSTR bin ich jetzt auf folgendes hinaus:
#define XSTR(X) ({static const __flash char __s[] = (X); &__s[0];})

Autor: Oliver S. (oliverso)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nico W. schrieb:
> Letzendlich will ich mein Zeugs ja in den Flash schreiben. Aber nicht
> mehr über PSTR und dem PROGMEM sondern über __flash.

Je nun, des Menschen Wille ist sein Himmelreich...

Oliver

: Bearbeitet durch User
Autor: Nico W. (nico_w)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oliver S. schrieb:
> Je nun, des Menschen Wille ist sein Himmelreich...

Jepp, und der Wille macht sogar den Code deutlich einfacher kompatibel 
zu nem ARM.

Anstatt:
#ifdef __AVR__

  #include <avr/pgmspace.h>

#else

  #define PROGMEM
  #define PGM_P const char *
  #define PSTR(s) ((const PROGMEM char *)(s))
  #define pgm_read_byte(x) (*((uint8_t *)(x)))
  #define pgm_read_word(x) (*((uint16_t *)(x)))
  #define pgm_read_dword(x) (*((uint32_t *)(x)))

#endif /* __AVR__, ! __AVR__ */

einfach:
#ifndef __AVR__
  #define __flash
#endif /* ! __AVR__ */

#define FSTR(X) ((const __flash char[]) { X })
#define XSTR(X) ({static const __flash char __s[] = X; &__s[0];})

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.