Forum: Compiler & IDEs ESP8266_NONOS_SDK: Welche Strings im RAM?


von Tim (Gast)


Lesenswert?

Hallo,

ich verwende das ESP8266_NONOS_SDK. Um genügend freien RAM zu behalten, 
muss man ja beachten, Strings in den Flash zu packen, mit z.B. 
PSTR("..."). Oder globale const Arrays mit ICACHE_RODATA_ATTR zu 
initialisieren. Eventuell übersieht man aber einige Vorkommnisse.

Gibt es eine Möglichkeit, mir die Strings/Arrays anzeigen zu lassen, 
welche noch im RAM landen würden? Ein Compilertool oder sowas?
Ich weiß, dass ich mit nm z.B. nachschauen kann, wo welche Funktion 
landet.

Danke.

von Irgend W. (Firma: egal) (irgendwer)


Lesenswert?

Tim schrieb:
> Ein Compilertool oder sowas?

Stelle bei deinen Compiler-/Linker-Toolchain mal ein das ein "map file" 
erzeugt wird und schaue dann in dieses rein...

von Tim (Gast)


Lesenswert?

Mh, das ist leider keine große Hilfe.
Das Problem sind auch solche Dinge. Angenommen, ich schreibe

> strncasecmp(h, "tri_tra_trallala", 16)

Dann steht "testtesttest" im RAM! Richtig wäre:

> strncasecmp(h, PSTR("tri_tra_trallala"), 16)

Sowas (ganz allgemein, nicht nur mit strncasecmp, was nur ein Beispiel 
war) würde ich gerne automatisch finden können.

von Tim (Gast)


Lesenswert?

"tri_tra_trallala" stände im RAM meinte ich.

von avr (Gast)


Lesenswert?

Das ist beim AVR so, der eine havard Architektur hat. Beim einer von 
Neumann Architektur sollten die Strings automatisch im flash landen.

von Tim (Gast)


Lesenswert?

Ich hätte nicht gefragt, wenn die Strings/Arrays nicht per Default im 
RAM landen würden...

von c-hater (Gast)


Lesenswert?

avr schrieb:

> Das ist beim AVR so, der eine havard Architektur hat. Beim einer von
> Neumann Architektur sollten die Strings automatisch im flash landen.

Das ist Schwachsinn und völlig unabhängig von der Architektur. Bei Code, 
der aus dem Flash geladen wird, muss natürlich jedes initialisierte 
Datum im Flash liegen. Weil: wo sollte es denn sonst herkommen?

Die Frage ist einfach nur: bleibt es erstmal nur im Flash liegen, oder 
wird es zusätzlich gleich bei der Initialisierung der Anwendung in den 
RAM kopiert.

von Tim (Gast)


Lesenswert?

Korrekt. Mich wundert ein bisschen, dass es keine einfache Möglichkeit 
gibt, herauszufinden, welche Konstanten in den RAM initialisiert werden. 
Ich habe händisch schon so einige herausklamüsert, aber das ist sehr 
mühsam...

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Tim schrieb:
>> strncasecmp(h, PSTR("tri_tra_trallala"), 16)
>
> Sowas (ganz allgemein, nicht nur mit strncasecmp, was nur ein Beispiel
> war) würde ich gerne automatisch finden können.

strncasecmp() wäre hier falsch, richtig wäre strncasecmp_P().

Siehe auch:

https://arduino-esp8266.readthedocs.io/en/latest/PROGMEM.html

Da ist auch eine Liste derjenigen Funktionen aufgeführt, die mit Strings 
im Flash umgehen können.

: Bearbeitet durch Moderator
von Tim (Gast)


Lesenswert?

Es gibt im NONOS SDK keine solche Funktion. War aber auch nur ein 
Beispiel. Das gilt auch für os_sprintf z.B.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.