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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.