printf_P aus Flash funktioniert scheinbar nicht

Gast #665280
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:
1
"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:
1
#ifdef DEBUG_DEV_PAULIN  
2
  // Testversion Paulin
3
  DebugFunc_Paulin();
4
#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
1
#ifdef DEBUG_DEV_PAULIN  
2
  // Testversion Paulin
3
  //DebugFunc_Paulin();
4
#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?
Gast #665295
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...?
Gast #665371
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"..
Gast #665394
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren