mikrocontroller.net

Forum: Compiler & IDEs printf druckt falsch aus dem FLASH


Autor: Otto Richter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Roland Praml (pram)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Nico Schümann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Werner B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!!!

Autor: Otto Richter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Werner B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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>

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

Bewertung
0 lesenswert
nicht 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).

Autor: Otto Richter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Otto Richter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

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.