# 펌웨어 캐시 동기화 문제로 발생한 와치독 리셋 분석

> Clean Markdown view of GeekNews topic #25441. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=25441](https://news.hada.io/topic?id=25441)
- GeekNews Markdown: [https://news.hada.io/topic/25441.md](https://news.hada.io/topic/25441.md)
- Type: news
- Author: [pazzk](https://news.hada.io/@pazzk)
- Published: 2025-12-30T15:20:58+09:00
- Updated: 2025-12-30T15:20:58+09:00
- Original source: [pazzk.net](https://pazzk.net/ko/blog/esp32s3-flash-cache-issue)
- Points: 7
- Comments: 7

## Summary

**ESP32 펌웨어에서 플래시 암호화와 PSRAM을 병행 사용할 때 발생한 와치독 리셋**의 원인을 펌웨어 캐시 동기화 문제로 추적한 사례입니다. 캐시 무효화 시점과 인터럽트 처리 간의 경합이 시스템 리셋으로 이어지는 과정을 분석하고, RTOS 환경에서 안전하게 메모리 접근을 보장하기 위한 코드 수정 방법을 제시합니다.

## Topic Body

ESP32 기반 펌웨어를 개발하면서,  
플래시 암호화(Flash Encryption)와 PSRAM을 함께 사용하는 환경에서  
Interrupt Watchdog Reset이 발생하는 문제를 겪었는데, 이 문제를 해결하는 과정을 정리한 글입니다.  
  
> ESP32는 IoT·임베디드 환경에서 널리 사용되는 MCU로,  
> RTOS 기반에서 TLS 네트워크 통신, 파일시스템, OTA 업데이트 등을 제공해  
> 네트워크 연결이 필요한 임베디드 애플리케이션을 단일 칩으로 구현할 수 있습니다.

## Comments



### Comment 48481

- Author: pathfinder
- Created: 2025-12-30T23:33:26+09:00
- Points: 1

흥미로운 내용 잘 봤네요  
그런데 DMA영역도 캐시를 쓰는 이유는 뭘까요?  
문제 생기기 쉬울것 같은데요

### Comment 48489

- Author: pazzk
- Created: 2025-12-31T06:29:03+09:00
- Points: 1
- Parent comment: 48481
- Depth: 1

DMA가 캐시를 직접적으로 사용하는 건 아니고 DMA나 CPU 모두에게 공유되는 메모리기 때문에 캐시 일관성을 고려해야해요.

### Comment 48552

- Author: pathfinder
- Created: 2026-01-01T23:38:30+09:00
- Points: 1
- Parent comment: 48489
- Depth: 2

MMU는 없지만 MPU로 메모리 영역과 그에 대한 속성을 지정할 수는 있습니다.  
한번 검토해 보시면 좋을것 같네요

### Comment 48561

- Author: pazzk
- Created: 2026-01-02T08:57:32+09:00
- Points: 1
- Parent comment: 48552
- Depth: 3

일부 하이엔드 MCU에서는 말씀하신 것처럼 MPU를 통해 접근 권한뿐 아니라 캐시 관련 속성까지 영역 단위로 설정할 수 있습니다. 다음의 ST 자료가 좋은 참고 자료일 것입니다: https://community.st.com/t5/stm32-mcus/how-to-use-the-memory-protection-unit-to-manage-cache-coherency/ta-p/858387  
  
다만 이 글에서 사용한 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_manual_en.pdf.

### Comment 48593

- Author: pathfinder
- Created: 2026-01-02T23:30:25+09:00
- Points: 1
- Parent comment: 48561
- Depth: 4

당연히 arm 코어일거라고 제가 잘못 생각하고 있었네요  
친절한 답변 감사합니다

### Comment 48524

- Author: pathfinder
- Created: 2025-12-31T22:34:04+09:00
- Points: 1
- Parent comment: 48489
- Depth: 2

네 얘기하신 캐시 일관성 때문에 매번 cache invalidate 를 시켜줘야 할텐데 그냥 non cacheable 영역으로 쓰지 않는 이유가 궁금했습니다

### Comment 48537

- Author: pazzk
- Created: 2026-01-01T08:55:39+09:00
- Points: 1
- Parent comment: 48524
- Depth: 3

아, 범용 컴퓨터와 달리 ESP32 같은 MCU에서는 메모리 속성을 페이지 단위로 런타임에 변경할 수 있는  
MMU를 제공하지 않고, cacheable / non-cacheable 여부는 미리 정해진 메모리 영역 단위로 결정되어 있어서 말씀하신대로 사용하기는 불가능하더라고요(내부 SRAM은 non-cacheable, PSRAM은 cacheable 메모리로 통짜로 고정되어 있습니다).  
  
좋은 질문 감사합니다!
