Análisis de un reinicio por watchdog causado por un problema de sincronización de caché en el firmware
(pazzk.net)Mientras desarrollaba firmware basado en ESP32,
me encontré con un problema en el que ocurría un Interrupt Watchdog Reset
en un entorno que usaba simultáneamente cifrado de flash (Flash Encryption) y PSRAM, y este artículo resume el proceso para resolverlo.
El ESP32 es un MCU ampliamente utilizado en entornos de IoT y sistemas embebidos,
y sobre una base RTOS ofrece comunicación de red TLS, sistema de archivos, actualizaciones OTA, entre otros,
lo que permite implementar en un solo chip aplicaciones embebidas que requieren conectividad de red.
7 comentarios
Lo leí con interés.
Pero, ¿cuál es la razón de usar caché también en el área DMA?
Parece que sería fácil que surgieran problemas ahí.
No es que el DMA use la caché directamente, sino que como es una memoria compartida tanto por el DMA como por la CPU, hay que considerar la coherencia de caché.
No hay MMU, pero sí se pueden definir regiones de memoria y sus atributos con el MPU.
Creo que valdría la pena revisarlo.
En algunos MCU de gama alta, como menciona, es posible configurar por región no solo los permisos de acceso sino también los atributos relacionados con la caché mediante la MPU. El siguiente material de ST será una buena referencia: https://community.st.com/t5/stm32-mcus/…
Sin embargo, en el ESP32-S3 usado en este artículo no se ofrece un método para configurar atributos de memoria
cacheable/non-cacheablepor región mediante la MPU o un mecanismo similar, como sí ocurre en CPU de propósito general o en algunos MCU.En el caso del ESP32-S3, la memoria externa (Flash/PSRAM) está diseñada para ser accedida a través de la caché/MMU (TRM 4.3.3 External Memory), y el control de permisos de acceso se realiza mediante el PMS (Permission Management System) (TRM Chapter 15), pero este mecanismo está pensado para la protección de acceso y no para cambiar si pasa por caché o la ruta de acceso en sí.
Enlace al TRM (Technical Reference Manual): https://documentation.espressif.com/esp32-s3_technical_reference_manua….
Obviamente, yo estaba pensando equivocadamente que sería un núcleo ARM.
Gracias por la amable respuesta
Entiendo; por la consistencia de caché que mencionaste, parecería que habría que hacer
cache invalidatecada vez, así que me dio curiosidad por qué no simplemente usar una región no cacheable.Ah, a diferencia de una computadora de propósito general, en un MCU como el ESP32 no se ofrece una MMU que permita cambiar en tiempo de ejecución los atributos de memoria a nivel de página, y si una región es cacheable o non-cacheable se determina por regiones de memoria predefinidas, así que como comentabas no es posible usarlo de esa manera (la SRAM interna está fijada por completo como non-cacheable y la PSRAM por completo como memoria cacheable).
¡Gracias por la buena pregunta!