F() leassons learned

Ich hatte in der letzten Woche ein sehr seltsames Verhalten bei Strings. Sie waren leer obwohl ich sie vorher gefüllt hatte. Wurden nicht in der Console angezeigt usw.
Nach viel debuggen habe ich dann doch die Warnung beachtet: "Low memory availability, stability problems may occur". Darauf bin ich über die Funktion F() gestolpert. Damit werden Strings aus Progmem gelesen und mein Speicher ist wieder frei - Problem gelöst.

Beschreibung Das F()-Makro am Seitenende.

Es gibt auch noch das p() Makro.

Grüße Uwe

Das schein eher jemand in einem Sketch definiert zu haben:

#define P(name)   static const prog_uchar name[] PROGMEM

Gruß Tommy

Ich habe mir die Beiträge mal durchgelesen.....

P(signMessage) = "This is some text . . . ";
Das sieht irgendwie so aus, als wäre dort eine Funktion als lvalue in Verwendung.
Es ist nicht eindeutig als Deklaration/Definition erkenntlich.

Das static gefällt mir da auch nicht wirklich, das könnte/wird dazu führen, dass der Compiler, oder besser Linker, doppelte Vorkommen eines Strings nicht erkennen/optimieren kann, so wie es auch dank des static beim F Makro passiert.

Auch die Ausgabe Routine ist in den Beiträgen etwas "lala".....

Hier mal ein alternatives P, ganz ohne #define, und prächtig optimierbar.

using P = __FlashStringHelper *;


const char text[] PROGMEM {"This is some text . . . "};



void setup() 
{
  Serial.begin(9600);
  Serial.println(P(text));
}

void loop() 
{

}
1 Like

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.