Analyse d’un reset du watchdog provoqué par un problème de synchronisation du cache du firmware
(pazzk.net)En développant un firmware basé sur ESP32,
j’ai rencontré un problème de Interrupt Watchdog Reset dans un environnement utilisant simultanément
le chiffrement du flash (Flash Encryption) et la PSRAM,
et cet article récapitule le processus de résolution de ce problème.
L’ESP32 est un MCU largement utilisé dans les environnements IoT et embarqués,
qui fournit, sur une base RTOS, la communication réseau TLS, un système de fichiers, les mises à jour OTA, etc.,
ce qui permet de mettre en œuvre sur une seule puce des applications embarquées nécessitant une connectivité réseau.
7 commentaires
Contenu intéressant, merci.
Mais pourquoi utilise-t-on aussi le cache pour la zone DMA ?
J’ai l’impression que ça risque de provoquer facilement des problèmes.
Le DMA n’utilise pas directement le cache ; comme il s’agit d’une mémoire partagée entre le DMA et le CPU, il faut donc tenir compte de la cohérence du cache.
Il n’y a pas de MMU, mais il est possible de définir des zones mémoire et leurs attributs avec le MPU.
Je pense que cela vaudrait la peine d’y jeter un œil.
Sur certains MCU haut de gamme, comme vous l’avez indiqué, il est possible de configurer via la MPU non seulement les droits d’accès, mais aussi les attributs liés au cache par région. Le document ST suivant constitue une bonne référence : https://community.st.com/t5/stm32-mcus/…
Cependant, sur l’ESP32-S3 utilisé dans cet article, il n’existe pas de mécanisme permettant de définir, pour chaque région mémoire, des attributs cacheable / non-cacheable via la MPU ou un mécanisme similaire, comme c’est le cas sur des CPU généralistes ou certains MCU.
Dans le cas de l’ESP32-S3, la mémoire externe (Flash/PSRAM) est conçue pour être accédée via le cache/MMU (TRM 4.3.3 External Memory), et le contrôle des droits d’accès est assuré par le PMS (Permission Management System) (TRM Chapter 15), mais ce composant est destiné à la protection des accès et ne sert pas à modifier le fait de passer ou non par le cache, ni le chemin d’accès lui-même.
Lien vers le TRM (Technical Reference Manual) : https://documentation.espressif.com/esp32-s3_technical_reference_manua….
Je pensais à tort qu’il s’agissait évidemment d’un cœur ARM.
Merci pour votre réponse bienveillante.
Oui, comme vous l’avez dit, à cause de la cohérence du cache, il faudrait sans doute faire un
cache invalidateà chaque fois, donc je me demandais pourquoi ne pas simplement utiliser une zone non cacheable.Ah, contrairement à un ordinateur généraliste, sur un MCU comme l’ESP32 il n’y a pas de MMU permettant de modifier à l’exécution les propriétés mémoire à la granularité de la page, et le fait qu’une zone soit cacheable ou non-cacheable est déterminé à l’avance par région mémoire, donc comme vous l’avez dit, ce n’est pas possible de l’utiliser ainsi (la SRAM interne est entièrement fixée en non-cacheable, et la PSRAM en mémoire cacheable).
Merci pour cette excellente question !