Análise de um reset por watchdog causado por um problema de sincronização do cache do firmware
(pazzk.net)Ao desenvolver um firmware baseado em ESP32,
enfrentei um problema em que ocorria um Interrupt Watchdog Reset
em um ambiente que usava Flash Encryption e PSRAM ao mesmo tempo, e este texto organiza o processo de resolução desse problema.
O ESP32 é um MCU amplamente usado em ambientes de IoT e embarcados,
e, com base em RTOS, oferece comunicação de rede TLS, sistema de arquivos, atualizações OTA e outros recursos,
permitindo implementar em um único chip aplicações embarcadas que exigem conexão de rede.
7 comentários
Conteúdo interessante, gostei bastante.
Mas por que a área de DMA também usa cache?
Parece que isso facilitaria o surgimento de problemas.
Não é que o DMA use o cache diretamente; como se trata de uma memória compartilhada entre o DMA e a CPU, é preciso considerar a coerência do cache.
Não há MMU, mas é possível definir regiões de memória e suas propriedades com a MPU.
Acho que valeria a pena dar uma olhada.
Em alguns MCUs de alto desempenho, como você mencionou, é possível usar a MPU para configurar por região não apenas as permissões de acesso, mas também propriedades relacionadas ao cache. O material da ST a seguir é uma boa referência: https://community.st.com/t5/stm32-mcus/…
No entanto, no ESP32-S3 usado neste texto, não é oferecido um mecanismo como o de CPUs de uso geral ou de alguns MCUs, em que os atributos
cacheable/non-cacheablepodem ser configurados por região de memória via MPU ou algo semelhante.No caso do ESP32-S3, a memória externa (Flash/PSRAM) foi projetada para ser acessada por meio do cache/MMU (TRM 4.3.3 External Memory), e o controle de permissões de acesso é feito pelo PMS (Permission Management System) (TRM Capítulo 15), mas esse recurso serve para proteção de acesso e não tem o papel de alterar se o acesso passa pelo cache nem o próprio caminho de acesso.
Link do TRM (Technical Reference Manual): https://documentation.espressif.com/esp32-s3_technical_reference_manua….
Obviamente eu estava errado ao presumir que seria um core ARM.
Obrigado pela resposta atenciosa
Entendi, por causa da consistência de cache que você mencionou, imagino que seria necessário fazer
cache invalidatetoda vez, então fiquei curioso para saber por que não usar simplesmente uma região não cacheável.Ah, ao contrário de computadores de uso geral, em MCUs como o ESP32 não há uma MMU que permita alterar em tempo de execução os atributos da memória por página, e se a memória é
cacheableounon-cacheableé definido previamente por região de memória, então realmente não dá para usar da forma que você mencionou (a SRAM interna é fixa como memórianon-cacheable, e a PSRAM fica inteiramente fixa como memóriacacheable).Obrigado pela ótima pergunta!