ESP8266_NONOS_SDK: Welche Strings im RAM?

Gast #6752987
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.
Gast #6753318
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.
Gast #6754073
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.
Gast #6754099
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...
Moderator Persönliche Seite #6754972
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.

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