ファームウェアのキャッシュ同期問題によって発生したウォッチドッグリセットの分析
(pazzk.net)ESP32ベースのファームウェアを開発する中で、
フラッシュ暗号化(Flash Encryption)とPSRAMを併用する環境において、
Interrupt Watchdog Resetが発生する問題に遭遇し、この問題を解決するまでの過程を整理した記事です。
> ESP32はIoT・組み込み環境で広く使われているMCUで、
> RTOSベースでTLSネットワーク通信、ファイルシステム、OTAアップデートなどを提供し、
> ネットワーク接続が必要な組み込みアプリケーションを単一チップで実装できます。
7件のコメント
興味深い内容、よく拝見しました
ところで、DMA領域でもキャッシュを使う理由は何でしょうか?
問題が起きやすそうですが
DMA がキャッシュを直接使用しているわけではなく、DMA と CPU の両方で共有されるメモリであるため、キャッシュコヒーレンシを考慮する必要があります。
MMUはありませんが、MPUでメモリ領域とそれに対する属性を指定することはできます。
一度検討してみるとよいと思います
一部のハイエンドMCUでは、ご指摘のとおり、MPUを通じてアクセス権限だけでなくキャッシュ関連の属性も領域単位で設定できます。次のSTの資料がよい参考になると思います: https://community.st.com/t5/stm32-mcus/…
ただし、この記事で使用したESP32-S3では、汎用CPUや一部のMCUで提供されているような、メモリ領域ごとの cacheable / non-cacheable 属性をMPUや類似のメカニズムで設定する方式は提供されていません。
ESP32-S3の場合、外部メモリ(Flash/PSRAM)はキャッシュ/MMUを経由してアクセスするよう設計されており(TRM 4.3.3 External Memory)、アクセス権限の制御はPMS(Permission Management System)によって行われますが(TRM Chapter 15)、この機能はアクセス保護のためのものであり、キャッシュ経由かどうかやアクセス経路そのものを変更する役割はありません。
TRM(Technical Reference Manual)リンク: https://documentation.espressif.com/esp32-s3_technical_reference_manua….
当然 arm コアだと私が勘違いしていましたね
ご親切なご回答ありがとうございます
おっしゃるとおりキャッシュの一貫性のために毎回
cache invalidateを実行する必要がありそうですが、単に non-cacheable 領域を使わない理由が気になりましたああ、汎用コンピュータと違って、ESP32のようなMCUではメモリ属性をページ単位でランタイムに変更できるMMUが提供されておらず、cacheable / non-cacheableかどうかはあらかじめ決められたメモリ領域単位で決まっているため、おっしゃるような使い方はできないんですよね(内部SRAMはnon-cacheable、PSRAMはcacheableメモリとして一括で固定されています)。
良い質問をありがとうございます!