Forum: Compiler & IDEs printf druckt falsch aus dem FLASH


von Otto Richter (Gast)


Lesenswert?

Hallo da draußen,

um RAM zu sparen versuche ich, meine Texte für den USART-Debugger ins
FLASH zu verlegen, dazu ein Beispiel:

static uint8_t  x  [ ] PROGMEM = "anzahl_nicht_beschriebener_stellen"
;
printf (" %c  \n\r", x ) ;   // das ist Zeile 269 !!

...und der gcc meldet:

../wert_eingabe_vid_prgr_nr.c: In function `vid_prgr_nr_edit_wert':
../wert_eingabe_vid_prgr_nr.c:269: Warnung: int Format, Zeiger Argument
(Argument 2)

Bin Anfänger und verstehe die Fehlermeldung nicht und weiß auch nicht ,
was ich falsch mache, denn x ist ein Array, aber doch auch ein pointer
auf das Array.

Wie geht's richtig ??

...noch schöne, dicke Ostereier

von Otto

von Roland P. (pram)


Lesenswert?

probier mal
printf (" %s \n\r", PSTR(x));

Du willst einen String ausgeben, deshalb %s, sowie einen Pointer der
aber im Flash liegt, dieser muss erst mittels PSTR "konvertiert"
werden.
Da der AVR Flash und Ram getrennt hat, braucht man versch.
Zugriffsstrategien. Weiteres stet im GCC-Tutorial.

Gruß
Roland

von Nico Schümann (Gast)


Lesenswert?

Hier mal ein Beispiel (könnte man der Einfachheit hablber auch ohne
Malloc machen):

#include <avr/eeprom.h>
char eeStartupMsg[] EEMEM = "VERSION 0.0.5 ALPHA\r\n";

int main()
{mc_init();
 char *startupMsg = malloc(sizeof(eeStartupMsg));
 eeprom_read_block(startupMsg,&eeStartupMsg,sizeof(eeStartupMsg));
 printf("%s",startupMsg);
 free(startupMsg);
}

Achte auch darauf, dass du die .eep-Datei mitflasht.
MfG,
Nico

von Werner B. (Gast)


Lesenswert?

Falls der Formatstring in PROGMEM stehen soll

printf_P(PSTR("Hallo aus dem Progmem %d mal.\n"), 73);

Falls ein String-Parameter im PROGMEM steht

printf(" %S %d %S\n", PSTR("Hallo aus dem Progmem\n"), 73,
PSTR("mal"));

Beachte  "%S" statt "%s" im Format!!!

von Otto Richter (Gast)


Lesenswert?

Hallo Roland,

danke für Deine schnelle Antwort.

Das %s war mir völlig neu, ist aber logisch. Was PSTR macht, habe ich
noch nicht gerafft, ich denke es regelt, welcher Speichertyp
angesprochen werden soll, aber 'mal im Blindflug hingeschrieben ergibt
das eine neue Fehlermeldung des gcc:

../wert_eingabe_vid_prgr_nr.c: In function `vid_prgr_nr_edit_wert':
../wert_eingabe_vid_prgr_nr.c:269: Fehler: ungültige Initialisierung
../wert_eingabe_vid_prgr_nr.c:269: Fehler: __c löst einen
Abschnittstypkonflikt aus
make: *** [wert_eingabe_vid_prgr_nr.o] Error 1
Build succeeded with 0 Warnings...


No 'ne Idee ?

Schönes Oster-WE noch !

Otto

von Werner B. (Gast)


Lesenswert?

Sorry, aber mit "deutschen" Fehlermeldungen stehe ich seit mehr als 20
Jahren auf Kriegsfuß. Wenn man sie mit dem Wörterbuch ins Englische
zurückübersetzt ergeben sie oft eine Sinn, aber so ;-(

Ich verute aber mal das mit eine  PSTR() etwas nicht stimmt, da das
Makro etwas mit einem __c anstellt.

<cut source="avr/pgmspace.h">
# define PSTR(s) (__extension__({static char __c[] PROGMEM = (s);
&__c[0];}))
</cut>

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Bitte poste einen Sourcecode, mit dem der Fehler reproduzierbar
ist.  Ich habe Werners Beispiele ausprobiert und bekommen keine
Fehler.  PSTR() ist aber zuweilen wirklich etwas eigenwillig in
der Anwendung, da es auf einem GCC-Trick beruht (ein Block darf
einen Wert zurückgeben).

von Otto Richter (Gast)


Lesenswert?

Hallo Jörg,

mein Programm ist nicht besonders kompliziert, steuert ein LCD, fragt
10 Tasten ab, steuert einen MPEG2-Encoder-chip und die ganze
Video-Audio-Pripherie, aber es gibt einige 100 verschiedene
Betriebszustände mit entsprechenden LCD-Texten und Tasten-Freigaben
etc. Die Programm-Struktur habe ich mir selbst überlegt, sie
funktioniert, ist aber u.U. nicht das, was ein erfahrener Programmiere
machen würde.

Das Programm hat mehr als 20 c-files und mehr als 10.000 Zeilen, ist
aber sehr gut dokumentiert.

Würde Dich so ein Source-Code interessieren ?

Otto

von Karl H. (kbuchegg)


Lesenswert?

Otto

Wenn die Anforderung nach einem Beispiel kommt, dann ist
damit gemeint:
Ein mögtlichst kurzes aber vollständiges Programm.
Das kann auch bedeuten, dass DU dieses Programm extra
als Testprogram schnell schreibst.
Was machen wir damit:
  Cursor drauf. Copy&Paste in unsere eigene Entwicklungsumgebung
  Compiler drueber und nachschauen was passiert, was nicht
  passiert bzw. wo der Fehler ligen könnte.

Du willst Hilfe, also musst Du auch etwas dafür tun.

von Otto Richter (Gast)


Lesenswert?

Vielen Dank an Alle,

ich hab' die verschiedenen Ansätze zwar in der Tiefe noch nicht ganz
verstanden, aber es läuft, wie es soll,

nochmals Danke

Otto

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.