mikrocontroller.net

Forum: Compiler & IDEs printf_P aus Flash funktioniert scheinbar nicht


Autor: Andreas Paulin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ all the Gurus in here:

Config: ATMEGA128, AVR-GCC, AVRStudio

Problem: SRAM voll, printf_P könnte Abhilfe schaffen, aber die 
printf-Ausgabestrings werden trotz printf_P anscheinend ins RAM kopiert.

Die 4K SRAM sind langsam voll, mapfile sagt:
"0x00800db9                PROVIDE (__bss_end, .)"

und ich bekomme seltsame Probleme-> Stackkollision liegt nahe.

Der Speicherfresser:
Im Projekt ist eine große Debug_Funktion, in einem eigenem Quellfile, 
die in main() ggfs eingebunden wird:
#ifdef DEBUG_DEV_PAULIN  
  // Testversion Paulin
  DebugFunc_Paulin();
#endif
So. In dieser Debugfunktion hats einen Haufen printf's, deren 
Format/Ausgabestrings meines Wissens beim Startup ins SRAM kopiert 
werden und dort genutzt werden. Und Speicher fressen......
Um hier SRAM zu sparen gibts die 'printf_P' Version, die aus dem Flash 
heraus arbeitet. Auch klar....
DebugFunc_Paulin() frisst aber IMMER ~ 1KSRAM, egal, ob ich die printf_P 
Versionen einsetze oder die normal printf.

Und weiter: Selbst ein auskommentieren der Funktion
#ifdef DEBUG_DEV_PAULIN  
  // Testversion Paulin
  //DebugFunc_Paulin();
#endif

hindert den Linker scheints nicht daran, sie komplett einzubinden, denn 
ich finde immer im Mapfile die kleine Zeile:
 .data          0x008005bc      0x496 DebugCode_Paulin.o

's isch aber doch auskommentiert....! heul

Nur komplettes Entfernen des Quellfiles aus dem Projekt bringts.

Wie kriege ich die printf_P richtig an den Start und 1K RAM eingespart?
Und wie kriege ich den Linker dazu, garnicht verwendete Funktionen auch 
nicht einzubinden?

Autor: Andreas Paulin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oha......... Zusatz:
Die printf_P-Versionen geben nur wirres Zeug aus .....@?&&%rgfQ@@
Zurück zu printf funktionierts wieder.....

Riecht nach irgendwas ganz Grundsätzlichem....aber wo ist da jetzt der 
Kardinalfehler...?

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Afaik können die _P-Varianten nur die unteren 64 kB des Flash 
adressieren. Es muss also gewährleistet sein, dass die betreffenden 
Strings in den unteren 64 kB liegen.

Autor: Andreas Paulin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Johannes: OK, da ist was dran...
aber wir haben weniger als 64K. Mapfile sagt:

0x00005c5e                _etext = .
na, das sind ca 25kByte...

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ohne zu sehen, was du machst, ist es schwer zu sagen, was daran falsch 
ist.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Die printf_P-Versionen geben nur wirres Zeug aus .....@?&&%rgfQ@@

Versuchs mal mit PSTR("Hallo !")

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nachtrag:

printf_P(PSTR("Hallo !"));

Autor: Andreas Paulin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@holger: Hei, Du bist mein HELD!! Das wars :)

Ich dachte, wenn die printf_P-Version verwendet wird, wird das 
Umkopieren der Strings aus dem Flash ins SRAM automatisch unterdrückt.
Muss man auch wissen, dass die Formatstrings auch noch explizit im Flash 
festgenagelt werden müssen....... die Doku sagt da recht knapp:
"Variant of printf() that uses a fmt string that resides in program 
memory."

Aber nirgendwo der Hinweis "use PSTR"..

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Ich dachte, wenn die printf_P-Version verwendet wird, wird das
> Umkopieren der Strings aus dem Flash ins SRAM automatisch unterdrückt.

Nein. Wenn der Compiler die Stringkonstante sieht, ist ihm alles andere 
erstmal egal. Wenn er den Funktionsaufruf sieht, weiß an der Stelle auch 
nur, daß printf_P einen Zeiger auf const char haben will. Daß die 
Funktion intern diesen Zeiger nutzt, um auf Flash zuzugreifen, ist dem 
Compiler dagegen nicht bekannt.

> Aber nirgendwo der Hinweis "use PSTR"..

Das ist ja auch nichts Spezielles für printf_P, sondern gilt allgemein 
für Strings, die im Flash stehen sollen.

Autor: Andreas Paulin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK, danke für die Info. Ist klarer jetzt.
Um den Linker, der linkt, obwohl er nicht zu linken braucht, kümmer ich 
mich später. Hab jetzt erstmal wieder Platz im SRAM :-))

Autor: mthomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#define myprintf(fmt, ...) printf_P(PSTR(fmt), ##__VA_ARGS__)

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.