<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>http://micropython.aundz.net/index.php?action=history&amp;feed=atom&amp;title=Wie_Micropython_den_Arbeitsspeicher_nutzt</id>
	<title>Wie Micropython den Arbeitsspeicher nutzt - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="http://micropython.aundz.net/index.php?action=history&amp;feed=atom&amp;title=Wie_Micropython_den_Arbeitsspeicher_nutzt"/>
	<link rel="alternate" type="text/html" href="http://micropython.aundz.net/index.php?title=Wie_Micropython_den_Arbeitsspeicher_nutzt&amp;action=history"/>
	<updated>2026-11-10T16:53:37Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Micropython</subtitle>
	<generator>MediaWiki 1.46.2</generator>
	<entry>
		<id>http://micropython.aundz.net/index.php?title=Wie_Micropython_den_Arbeitsspeicher_nutzt&amp;diff=1892&amp;oldid=prev</id>
		<title>Mp-admin: Die Seite wurde neu angelegt: „== Speicheraufteilung des RAM in MicroPython ==  Bei MicroPython auf einem ESP32 muss man zwischen dem physisch vorhandenen RAM des Mikrocontrollers und dem Speicher unterscheiden, den MicroPython tatsächlich für seine Laufzeitumgebung verwendet.  Die genaue Aufteilung ist abhängig von ESP32-Variante, Firmware, MicroPython-Version, aktivierten Funktionen und ggf. vorhandenem PSRAM. Die folgenden Angaben beziehen sich daher auf das grundlegende Speicher…“</title>
		<link rel="alternate" type="text/html" href="http://micropython.aundz.net/index.php?title=Wie_Micropython_den_Arbeitsspeicher_nutzt&amp;diff=1892&amp;oldid=prev"/>
		<updated>2026-08-23T14:36:23Z</updated>

		<summary type="html">&lt;p&gt;Die Seite wurde neu angelegt: „== Speicheraufteilung des RAM in MicroPython ==  Bei MicroPython auf einem ESP32 muss man zwischen dem physisch vorhandenen RAM des Mikrocontrollers und dem Speicher unterscheiden, den MicroPython tatsächlich für seine Laufzeitumgebung verwendet.  Die genaue Aufteilung ist abhängig von ESP32-Variante, Firmware, MicroPython-Version, aktivierten Funktionen und ggf. vorhandenem PSRAM. Die folgenden Angaben beziehen sich daher auf das grundlegende Speicher…“&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Speicheraufteilung des RAM in MicroPython ==&lt;br /&gt;
&lt;br /&gt;
Bei MicroPython auf einem ESP32 muss man zwischen dem physisch vorhandenen RAM des Mikrocontrollers und dem Speicher unterscheiden, den MicroPython tatsächlich für seine Laufzeitumgebung verwendet.&lt;br /&gt;
&lt;br /&gt;
Die genaue Aufteilung ist abhängig von ESP32-Variante, Firmware, MicroPython-Version, aktivierten Funktionen und ggf. vorhandenem PSRAM. Die folgenden Angaben beziehen sich daher auf das grundlegende Speichermodell und nicht auf eine bestimmte Firmware.&lt;br /&gt;
&lt;br /&gt;
=== 1. Physischer RAM des ESP32 ===&lt;br /&gt;
&lt;br /&gt;
Der ESP32 besitzt mehrere unterschiedliche RAM-Bereiche. Ein Teil davon ist für spezielle Hardwarefunktionen reserviert oder wird von der ESP-IDF bzw. MicroPython verwendet.&lt;br /&gt;
&lt;br /&gt;
Beim klassischen ESP32 (ESP32-D0WD) stehen intern ungefähr 520 KiB SRAM zur Verfügung. Diese sind jedoch nicht einfach als ein zusammenhängender Speicherbereich nutzbar.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Bereich&lt;br /&gt;
! Typische Größe&lt;br /&gt;
! Verwendung&lt;br /&gt;
|-&lt;br /&gt;
| DRAM&lt;br /&gt;
| ca. 320 KiB&lt;br /&gt;
| Daten, Variablen, MicroPython-Heap&lt;br /&gt;
|-&lt;br /&gt;
| IRAM&lt;br /&gt;
| ca. 128 KiB&lt;br /&gt;
| Programmcode, zeitkritischer Code&lt;br /&gt;
|-&lt;br /&gt;
| RTC RAM&lt;br /&gt;
| 8 KiB&lt;br /&gt;
| Daten, die bestimmte Sleep-Modi überleben können&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die tatsächlich für MicroPython verfügbaren Größen sind kleiner, da bereits Teile des RAM von Bootloader, ESP-IDF, Hardwaretreibern und MicroPython selbst benötigt werden.&lt;br /&gt;
&lt;br /&gt;
=== 2. MicroPython-Heap ===&lt;br /&gt;
&lt;br /&gt;
Der wichtigste Speicherbereich für Python-Programme ist der &amp;#039;&amp;#039;&amp;#039;MicroPython-GC-Heap&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
MicroPython verwendet einen eigenen Garbage Collector (GC). Python-Objekte wie&lt;br /&gt;
&lt;br /&gt;
* Integer und Float-Objekte&lt;br /&gt;
* Strings&lt;br /&gt;
* Listen&lt;br /&gt;
* Dictionaries&lt;br /&gt;
* Tupel&lt;br /&gt;
* Klassen und Instanzen&lt;br /&gt;
* Bytearrays&lt;br /&gt;
* Python-Codeobjekte&lt;br /&gt;
* LVGL-Objekte und deren Python-Wrapper&lt;br /&gt;
&lt;br /&gt;
werden grundsätzlich aus diesem Heap angefordert.&lt;br /&gt;
&lt;br /&gt;
Der aktuelle Zustand kann mit&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import gc&lt;br /&gt;
&lt;br /&gt;
print(gc.mem_alloc())&lt;br /&gt;
print(gc.mem_free())&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ermittelt werden.&lt;br /&gt;
&lt;br /&gt;
`gc.mem_alloc()` liefert den aktuell belegten Speicher des MicroPython-Heaps.&lt;br /&gt;
&lt;br /&gt;
`gc.mem_free()` liefert den aktuell freien Speicher innerhalb dieses Heaps.&lt;br /&gt;
&lt;br /&gt;
Die Summe aus beiden Werten entspricht ungefähr der aktuellen Größe des GC-Heaps:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
GC-Heap = mem_alloc() + mem_free()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei handelt es sich &amp;#039;&amp;#039;&amp;#039;nicht um den gesamten freien RAM des ESP32&amp;#039;&amp;#039;&amp;#039;. Es wird ausschließlich der Speicher betrachtet, den der MicroPython-Garbage-Collector verwaltet.&lt;br /&gt;
&lt;br /&gt;
=== 3. Aufbau des MicroPython-GC-Heaps ===&lt;br /&gt;
&lt;br /&gt;
Der GC-Heap ist wiederum in kleine Blöcke unterteilt. MicroPython verwaltet diese Blöcke mit einer Bitmap.&lt;br /&gt;
&lt;br /&gt;
Auf einem 32-Bit-System entspricht ein GC-Block typischerweise vier Maschinenwörtern, also:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
4 × 4 Byte = 16 Byte&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Objekte werden aus einer oder mehreren solchen Blöcken aufgebaut.&lt;br /&gt;
&lt;br /&gt;
Das bedeutet auch, dass der Heap nicht beliebig fein aufgeteilt werden kann. Kleine Objekte benötigen mindestens einen Heap-Block.&lt;br /&gt;
&lt;br /&gt;
Mit&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import micropython&lt;br /&gt;
&lt;br /&gt;
micropython.mem_info()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kann man wesentlich detailliertere Informationen über den Heap ausgeben.&lt;br /&gt;
&lt;br /&gt;
Mit&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
micropython.mem_info(1)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kann MicroPython zusätzlich eine Darstellung der Heap-Belegung ausgeben.&lt;br /&gt;
&lt;br /&gt;
Diese Informationen sind besonders nützlich, wenn ein Programm trotz scheinbar ausreichendem freien Speicher keine größeren Objekte mehr anlegen kann.&lt;br /&gt;
&lt;br /&gt;
=== 4. Fragmentierung des Heaps ===&lt;br /&gt;
&lt;br /&gt;
Ein wichtiger Unterschied besteht zwischen &amp;#039;&amp;#039;&amp;#039;freiem Speicher&amp;#039;&amp;#039;&amp;#039; und &amp;#039;&amp;#039;&amp;#039;zusammenhängendem freiem Speicher&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Beispielsweise kann ein Heap so aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
[####][....][##][....][######][..][###][........]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei sind `.` freie Bereiche und `#` belegte Bereiche.&lt;br /&gt;
&lt;br /&gt;
Es kann insgesamt viel freier Speicher vorhanden sein, trotzdem kann eine große Speicheranforderung fehlschlagen, wenn kein ausreichend großer zusammenhängender Bereich verfügbar ist.&lt;br /&gt;
&lt;br /&gt;
Der Garbage Collector kann nicht immer beliebig fragmentierte Speicherbereiche zusammenführen.&lt;br /&gt;
&lt;br /&gt;
Deshalb ist bei größeren Objekten nicht nur&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
gc.mem_free()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
interessant, sondern auch die tatsächliche Heap-Struktur.&lt;br /&gt;
&lt;br /&gt;
=== 5. Python-Code und Flash ===&lt;br /&gt;
&lt;br /&gt;
Python-Quelltext liegt zunächst als Datei im Flash-Dateisystem.&lt;br /&gt;
&lt;br /&gt;
Beim Import wird der Code jedoch verarbeitet und in eine für MicroPython geeignete interne Darstellung gebracht.&lt;br /&gt;
&lt;br /&gt;
Je nach Situation entstehen dabei zusätzliche Objekte im RAM.&lt;br /&gt;
&lt;br /&gt;
Deshalb kann beispielsweise&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import lvgl&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
deutlich mehr RAM benötigen als die Größe der eigentlichen Datei vermuten lässt.&lt;br /&gt;
&lt;br /&gt;
Bei großen Modulen ist deshalb die Dateigröße im Flash kein zuverlässiger Hinweis auf den später benötigten RAM.&lt;br /&gt;
&lt;br /&gt;
=== 6. Bytecode und Frozen Modules ===&lt;br /&gt;
&lt;br /&gt;
MicroPython kann Module als &amp;#039;&amp;#039;&amp;#039;Frozen Modules&amp;#039;&amp;#039;&amp;#039; in die Firmware integrieren.&lt;br /&gt;
&lt;br /&gt;
Der Python-Code wird dabei bereits beim Erstellen der Firmware in die Firmware aufgenommen.&lt;br /&gt;
&lt;br /&gt;
Dadurch muss der entsprechende Quelltext nicht aus dem Dateisystem geladen werden.&lt;br /&gt;
&lt;br /&gt;
Frozen Modules haben deshalb insbesondere bei kleinen Mikrocontrollern einen wichtigen Vorteil:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Normaler Python-Code&lt;br /&gt;
! Frozen Module&lt;br /&gt;
|-&lt;br /&gt;
| Datei im Flash-Dateisystem&lt;br /&gt;
| Bestandteil der Firmware&lt;br /&gt;
|-&lt;br /&gt;
| Import aus dem Dateisystem&lt;br /&gt;
| Import aus der Firmware&lt;br /&gt;
|-&lt;br /&gt;
| zusätzlicher Dateisystemplatz erforderlich&lt;br /&gt;
| kein Dateisystemplatz erforderlich&lt;br /&gt;
|-&lt;br /&gt;
| Code kann teilweise RAM benötigen&lt;br /&gt;
| Code kann weitgehend direkt aus dem Flash verwendet werden&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Allerdings benötigen auch Frozen Modules RAM für die tatsächlich erzeugten Python-Objekte und Laufzeitdaten.&lt;br /&gt;
&lt;br /&gt;
=== 7. Stack ===&lt;br /&gt;
&lt;br /&gt;
Neben dem MicroPython-Heap existieren &amp;#039;&amp;#039;&amp;#039;Stacks&amp;#039;&amp;#039;&amp;#039; für die CPU bzw. die einzelnen ESP32-Tasks.&lt;br /&gt;
&lt;br /&gt;
Der Stack wird unter anderem für&lt;br /&gt;
&lt;br /&gt;
* Funktionsaufrufe&lt;br /&gt;
* lokale Variablen auf C-Ebene&lt;br /&gt;
* Interrupts&lt;br /&gt;
* Treiber&lt;br /&gt;
* FreeRTOS-Tasks&lt;br /&gt;
&lt;br /&gt;
verwendet.&lt;br /&gt;
&lt;br /&gt;
Der Stack gehört &amp;#039;&amp;#039;&amp;#039;nicht&amp;#039;&amp;#039;&amp;#039; zum MicroPython-GC-Heap.&lt;br /&gt;
&lt;br /&gt;
Deshalb bedeutet beispielsweise&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
gc.mem_free() = 30 KiB&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
nicht, dass insgesamt noch 30 KiB RAM frei sind.&lt;br /&gt;
&lt;br /&gt;
Umgekehrt kann ein System bereits an eine RAM-Grenze stoßen, obwohl `gc.mem_free()` noch einen scheinbar komfortablen Wert anzeigt.&lt;br /&gt;
&lt;br /&gt;
=== 8. C-Heap ===&lt;br /&gt;
&lt;br /&gt;
MicroPython selbst besteht größtenteils aus C-Code.&lt;br /&gt;
&lt;br /&gt;
Auch die ESP-IDF und die Hardwaretreiber verwenden Speicher außerhalb des MicroPython-GC-Heaps.&lt;br /&gt;
&lt;br /&gt;
Dieser Speicher wird über die C-/ESP-IDF-Speicherverwaltung angefordert.&lt;br /&gt;
&lt;br /&gt;
Dazu gehören beispielsweise:&lt;br /&gt;
&lt;br /&gt;
* Netzwerk-Stack&lt;br /&gt;
* WLAN&lt;br /&gt;
* TCP/IP&lt;br /&gt;
* Bluetooth&lt;br /&gt;
* SPI-/I2C-Treiber&lt;br /&gt;
* Displaytreiber&lt;br /&gt;
* DMA-Puffer&lt;br /&gt;
* LVGL&lt;br /&gt;
* ESP-IDF-Komponenten&lt;br /&gt;
* interne MicroPython-Datenstrukturen&lt;br /&gt;
&lt;br /&gt;
Dieser Bereich ist für `gc.mem_free()` unsichtbar.&lt;br /&gt;
&lt;br /&gt;
Das erklärt, warum der tatsächlich noch verfügbare RAM kleiner sein kann als der durch `gc.mem_free()` angezeigte Wert.&lt;br /&gt;
&lt;br /&gt;
=== 9. DMA-fähiger Speicher ===&lt;br /&gt;
&lt;br /&gt;
Bestimmte Hardwarekomponenten des ESP32 können nicht auf jeden RAM-Bereich zugreifen.&lt;br /&gt;
&lt;br /&gt;
Beispielsweise benötigen DMA-Controller Speicher mit bestimmten Eigenschaften.&lt;br /&gt;
&lt;br /&gt;
Daher können Treiber eigene DMA-fähige Speicherbereiche reservieren.&lt;br /&gt;
&lt;br /&gt;
Das ist insbesondere bei&lt;br /&gt;
&lt;br /&gt;
* SPI&lt;br /&gt;
* I2S&lt;br /&gt;
* Displaycontrollern&lt;br /&gt;
* SD-Karten&lt;br /&gt;
* Kameras&lt;br /&gt;
* Audio&lt;br /&gt;
&lt;br /&gt;
relevant.&lt;br /&gt;
&lt;br /&gt;
Ein großer freier MicroPython-Heap bedeutet deshalb nicht automatisch, dass ein ausreichend großer DMA-Puffer angelegt werden kann.&lt;br /&gt;
&lt;br /&gt;
=== 10. PSRAM ===&lt;br /&gt;
&lt;br /&gt;
Viele ESP32-Boards besitzen zusätzlich externes &amp;#039;&amp;#039;&amp;#039;PSRAM&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Beim klassischen ESP32 sind beispielsweise 2 MiB oder 4 MiB PSRAM verbreitet.&lt;br /&gt;
&lt;br /&gt;
PSRAM erweitert den verfügbaren Speicher erheblich, ist aber technisch nicht identisch mit dem internen SRAM.&lt;br /&gt;
&lt;br /&gt;
Je nach MicroPython-Firmware kann PSRAM&lt;br /&gt;
&lt;br /&gt;
* vollständig oder teilweise in den MicroPython-Heap integriert sein,&lt;br /&gt;
* für bestimmte C-Datenstrukturen verwendet werden,&lt;br /&gt;
* von einzelnen Treibern bevorzugt genutzt werden,&lt;br /&gt;
* oder überhaupt nicht für den normalen Python-Heap zur Verfügung stehen.&lt;br /&gt;
&lt;br /&gt;
Deshalb muss bei einer konkreten Firmware geprüft werden, wie PSRAM tatsächlich eingebunden wurde.&lt;br /&gt;
&lt;br /&gt;
=== 11. RTC RAM ===&lt;br /&gt;
&lt;br /&gt;
Der ESP32 besitzt zusätzlich einen kleinen RTC-Speicher.&lt;br /&gt;
&lt;br /&gt;
Dieser Speicher ist für Funktionen rund um Sleep-Modi vorgesehen.&lt;br /&gt;
&lt;br /&gt;
Ein Teil der Daten kann je nach Sleep-Modus erhalten bleiben.&lt;br /&gt;
&lt;br /&gt;
Der RTC-Speicher gehört nicht zum normalen MicroPython-GC-Heap.&lt;br /&gt;
&lt;br /&gt;
=== 12. Übersicht ===&lt;br /&gt;
&lt;br /&gt;
Die folgende Darstellung zeigt das grundsätzliche Modell:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
ESP32 RAM&lt;br /&gt;
│&lt;br /&gt;
├── Internes SRAM&lt;br /&gt;
│   │&lt;br /&gt;
│   ├── DRAM&lt;br /&gt;
│   │   │&lt;br /&gt;
│   │   ├── MicroPython GC-Heap&lt;br /&gt;
│   │   │   ├── Python-Objekte&lt;br /&gt;
│   │   │   ├── Strings&lt;br /&gt;
│   │   │   ├── Listen&lt;br /&gt;
│   │   │   ├── Dictionaries&lt;br /&gt;
│   │   │   └── sonstige Python-Daten&lt;br /&gt;
│   │   │&lt;br /&gt;
│   │   ├── C-Heap&lt;br /&gt;
│   │   │   ├── ESP-IDF&lt;br /&gt;
│   │   │   ├── Treiber&lt;br /&gt;
│   │   │   ├── Netzwerk&lt;br /&gt;
│   │   │   └── LVGL&lt;br /&gt;
│   │   │&lt;br /&gt;
│   │   └── DMA-Puffer&lt;br /&gt;
│   │&lt;br /&gt;
│   ├── IRAM&lt;br /&gt;
│   │   └── Programmcode / zeitkritischer Code&lt;br /&gt;
│   │&lt;br /&gt;
│   └── RTC RAM&lt;br /&gt;
│       └── Sleep-/RTC-Daten&lt;br /&gt;
│&lt;br /&gt;
└── Externes PSRAM (falls vorhanden)&lt;br /&gt;
    │&lt;br /&gt;
    ├── C-Heap&lt;br /&gt;
    ├── Treiber&lt;br /&gt;
    └── ggf. MicroPython GC-Heap&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 13. Was zeigt `gc.mem_free()` tatsächlich? ===&lt;br /&gt;
&lt;br /&gt;
Für die Praxis ist die wichtigste Erkenntnis:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
gc.mem_free()&lt;br /&gt;
        │&lt;br /&gt;
        ▼&lt;br /&gt;
freier Speicher im MicroPython-GC-Heap&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
und &amp;#039;&amp;#039;&amp;#039;nicht&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
gesamter noch verfügbarer RAM des ESP32&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für eine vollständige Speicheranalyse müssen daher mindestens mehrere Bereiche betrachtet werden:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Messwert&lt;br /&gt;
! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| `gc.mem_alloc()`&lt;br /&gt;
| Von Python-Objekten belegter GC-Heap&lt;br /&gt;
|-&lt;br /&gt;
| `gc.mem_free()`&lt;br /&gt;
| Freier GC-Heap&lt;br /&gt;
|-&lt;br /&gt;
| `micropython.mem_info()`&lt;br /&gt;
| Detaillierte Struktur des GC-Heaps&lt;br /&gt;
|-&lt;br /&gt;
| ESP-IDF Heap-Informationen&lt;br /&gt;
| Freier/benutzter C-Speicher&lt;br /&gt;
|-&lt;br /&gt;
| PSRAM-Informationen&lt;br /&gt;
| Zustand des externen RAM&lt;br /&gt;
|-&lt;br /&gt;
| `os.statvfs(&amp;quot;/&amp;quot;)`&lt;br /&gt;
| Speicherplatz des Flash-Dateisystems&lt;br /&gt;
|-&lt;br /&gt;
| `esp32.flash_size()`&lt;br /&gt;
| Physische Größe des Flash&lt;br /&gt;
|-&lt;br /&gt;
| `esp32.Partition.info()`&lt;br /&gt;
| Aufteilung des Flash in Partitionen&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 14. Bedeutung für das CYD mit LVGL ===&lt;br /&gt;
&lt;br /&gt;
Für unser CYD ist insbesondere die Unterscheidung zwischen &amp;#039;&amp;#039;&amp;#039;Flash&amp;#039;&amp;#039;&amp;#039; und &amp;#039;&amp;#039;&amp;#039;RAM&amp;#039;&amp;#039;&amp;#039; wichtig.&lt;br /&gt;
&lt;br /&gt;
Der Flash enthält unter anderem:&lt;br /&gt;
&lt;br /&gt;
* MicroPython-Firmware&lt;br /&gt;
* Partitionstabelle&lt;br /&gt;
* Bootloader&lt;br /&gt;
* Python-Dateien&lt;br /&gt;
* LVGL-Firmwarebestandteile&lt;br /&gt;
* Dateisystem&lt;br /&gt;
&lt;br /&gt;
Der RAM enthält dagegen während des Betriebs unter anderem:&lt;br /&gt;
&lt;br /&gt;
* MicroPython-GC-Heap&lt;br /&gt;
* Python-Objekte&lt;br /&gt;
* LVGL-Objekte&lt;br /&gt;
* Display-Puffer&lt;br /&gt;
* Touch-Daten&lt;br /&gt;
* SPI-/DMA-Puffer&lt;br /&gt;
* Netzwerkdaten&lt;br /&gt;
* C-Datenstrukturen&lt;br /&gt;
&lt;br /&gt;
Gerade LVGL kann relativ viel RAM benötigen. Ein Display-Puffer von beispielsweise 240 × 320 Pixeln benötigt bei 16 Bit Farbtiefe bereits:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
240 × 320 × 2 Byte&lt;br /&gt;
= 153.600 Byte&lt;br /&gt;
≈ 150 KiB&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zwei solche Buffer würden bereits etwa 300 KiB benötigen.&lt;br /&gt;
&lt;br /&gt;
Damit wird verständlich, warum bei einer LVGL-MicroPython-Firmware der verfügbare RAM wesentlich schneller knapp werden kann als der Flash.&lt;br /&gt;
&lt;br /&gt;
=== 15. Unser `memtools.py` ===&lt;br /&gt;
&lt;br /&gt;
Für `memtools.py` bedeutet das, dass `mem_view()` künftig sinnvollerweise mehrere voneinander unabhängige Speicherinformationen anzeigen sollte:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
mem_view()&lt;br /&gt;
│&lt;br /&gt;
├── Flash&lt;br /&gt;
│   ├── Gesamtgröße&lt;br /&gt;
│   └── Partitionen&lt;br /&gt;
│&lt;br /&gt;
├── Filesystem&lt;br /&gt;
│   ├── Gesamt&lt;br /&gt;
│   ├── Belegt&lt;br /&gt;
│   └── Frei&lt;br /&gt;
│&lt;br /&gt;
├── MicroPython GC&lt;br /&gt;
│   ├── Gesamt&lt;br /&gt;
│   ├── Belegt&lt;br /&gt;
│   └── Frei&lt;br /&gt;
│&lt;br /&gt;
├── C-Heap&lt;br /&gt;
│   ├── Gesamt&lt;br /&gt;
│   ├── Belegt&lt;br /&gt;
│   └── Frei&lt;br /&gt;
│&lt;br /&gt;
└── PSRAM&lt;br /&gt;
    ├── Gesamt&lt;br /&gt;
    ├── Belegt&lt;br /&gt;
    └── Frei&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit würde `memtools.py` nicht nur den &amp;#039;&amp;#039;&amp;#039;MicroPython-Heap&amp;#039;&amp;#039;&amp;#039;, sondern tatsächlich die wesentlichen Speicherressourcen des ESP32 überwachen.&lt;/div&gt;</summary>
		<author><name>Mp-admin</name></author>
	</entry>
</feed>