Serial.print("text") vs. Serial.print(F("text")

Serial.print("text") vs. Serial.print(F("text")

Wann und warum nehm ich das eine oder das andere? Wo liegen die Vor-/Nachteile bei dem einen oder anderen?

Hab schon im Netz gesucht, aber keine gute Erklärung gefunden.

Durch die Harvard-Architektur des AVR landen alle Strings standardmäßig im RAM!

Das F()-Makro sorgt dafür dass sie im Flash bleiben. Das ist eine Arduino Vereinfachung, weil der Standard-Weg Strings im Flash zu behandeln recht kompliziert ist. Vor allem dient es dazu dass z.B. print() einen String im Flash von einem normalen String unterscheiden kann.

Wenn also das RAM knapp wird ist der erste Weg die Strings zu optimieren. Da gibt es auch noch anderen Optionen wenn man mit Standard String Funktionen wie strcmp() arbeitet.

Erkaufen tut man sich dass dadurch dass es etwas länger dauert, aber das ist meistens vernachlässigbar. Ein weiter Nachteil ist dass kein String-Pooling betrieben wird. Also zwei gleiche Strings mit F()-Makro belegen zweimal Flash.

Serenifly: Erkaufen tut man sich dass dadurch dass es etwas länger dauert, aber das ist meistens vernachlässigbar. Ein weiter Nachteil ist dass kein String-Pooling betrieben wird. Also zwei gleiche Strings mit F()-Makro belegen zweimal Flash.

Also ein Serial.print(F("text") dauert ein tick mehr Zeit als ein Serial.print("text") ?

Außerdem belegen 2 Serial.print(F("text") auch doppelt soviel Platz?

Habe ich das soweit richtig Verstanden?

Dann gibt es doch (außer bei knappem RAM) keinen vernünftigen Grund Serial.print(F("text") zu verwenden, oder?

Der Unterschied ist minimal. Ich glaube jemand hat man geschrieben, dass man es bei Webseiten merkt. Ansonsten nicht. Wobei man sieht, dass Leute gerade bei Ethernet schnell das RAM ausgeht.

Flash hat man normalerweise weit mehr als RAM. RAM ist zumindest auf dem UNO wirklich knapp. Wenn man RAM-intensive Bibliotheken wie SD/SdFat verwendet kommt man schnell Probleme.

Man kann auch per PROGMEM per Hand Daten im Flash ablegen (was anderes macht F() im Hintergrund auch nicht): https://www.arduino.cc/en/Reference/PROGMEM

Das bietet sich abseits von Strings auch bei großen Array Tabellen an