Bei der Entwicklung einer ESP32-basierten Firmware
trat in einer Umgebung, in der Flash Encryption und PSRAM gemeinsam verwendet werden, ein Problem mit einem Interrupt Watchdog Reset auf. Dieser Beitrag fasst den Weg zur Lösung dieses Problems zusammen.
Der ESP32 ist ein in IoT- und Embedded-Umgebungen weit verbreiteter MCU,
der auf RTOS-Basis TLS-Netzwerkkommunikation, Dateisysteme, OTA-Updates usw. bereitstellt
und die Umsetzung netzwerkgebundener Embedded-Anwendungen auf einem einzigen Chip ermöglicht.
7 Kommentare
Ich fand den Inhalt sehr interessant.
Aber warum wird auch für den DMA-Bereich Cache verwendet?
Es wirkt, als könnte das leicht zu Problemen führen.
DMA verwendet den Cache nicht direkt, aber da es sich um Speicher handelt, der sowohl von DMA als auch von der CPU gemeinsam genutzt wird, muss die Cache-Kohärenz berücksichtigt werden.
Es gibt zwar keine MMU, aber mit der MPU lassen sich Speicherbereiche und deren Eigenschaften festlegen.
Es wäre gut, wenn Sie das einmal prüfen könnten.
Bei einigen High-End-MCUs lassen sich, wie Sie erwähnt haben, über die MPU nicht nur Zugriffsrechte, sondern auch Cache-bezogene Attribute pro Speicherbereich konfigurieren. Das folgende ST-Material ist dafür eine gute Referenz: https://community.st.com/t5/stm32-mcus/…
Allerdings wird beim in diesem Beitrag verwendeten ESP32-S3 keine Methode angeboten, mit der sich cacheable-/non-cacheable-Eigenschaften für einzelne Speicherbereiche über die MPU oder einen ähnlichen Mechanismus festlegen lassen, wie man es von allgemeinen CPUs oder einigen MCUs kennt.
Beim ESP32-S3 ist der Zugriff auf externen Speicher (Flash/PSRAM) so ausgelegt, dass er über Cache/MMU erfolgt (TRM 4.3.3 External Memory). Die Steuerung der Zugriffsrechte erfolgt zwar über das PMS (Permission Management System) (TRM Kapitel 15), dieses dient jedoch dem Zugriffsschutz und hat nicht die Aufgabe, festzulegen, ob der Zugriff über den Cache erfolgt oder den Zugriffspfad selbst zu ändern.
Link zum TRM (Technical Reference Manual): https://documentation.espressif.com/esp32-s3_technical_reference_manua….
Ich hatte fälschlicherweise angenommen, dass es natürlich ein ARM-Kern sein würde.
Vielen Dank für die freundliche Antwort.
Wie Sie erwähnt haben, müsste man wegen der Cache-Konsistenz wohl jedes Mal ein
cache invalidatedurchführen. Mich hat deshalb interessiert, warum man nicht einfach einen nicht cachebaren Bereich verwendet.Ah, anders als bei Universalcomputern stellen MCUs wie der ESP32 keine MMU bereit, mit der sich Speichereigenschaften zur Laufzeit auf Seitenebene ändern lassen, und ob ein Bereich cacheable oder non-cacheable ist, wird vorab pro Speicherbereich festgelegt, sodass sich das wie von Ihnen beschrieben leider nicht nutzen lässt (internes SRAM ist vollständig fest als non-cacheable konfiguriert, PSRAM vollständig als cacheable Memory).
Vielen Dank für die gute Frage!