7P by pazzk 2달전 | ★ favorite | 댓글 7개

ESP32 기반 펌웨어를 개발하면서,
플래시 암호화(Flash Encryption)와 PSRAM을 함께 사용하는 환경에서
Interrupt Watchdog Reset이 발생하는 문제를 겪었는데, 이 문제를 해결하는 과정을 정리한 글입니다.

ESP32는 IoT·임베디드 환경에서 널리 사용되는 MCU로,
RTOS 기반에서 TLS 네트워크 통신, 파일시스템, OTA 업데이트 등을 제공해
네트워크 연결이 필요한 임베디드 애플리케이션을 단일 칩으로 구현할 수 있습니다.

흥미로운 내용 잘 봤네요
그런데 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 메모리로 통짜로 고정되어 있습니다).

좋은 질문 감사합니다!