7 điểm bởi pazzk 2025-12-30 | 7 bình luận | Chia sẻ qua WhatsApp

Trong quá trình phát triển firmware dựa trên ESP32,
khi sử dụng đồng thời Flash Encryption và PSRAM,
đã gặp phải vấn đề Interrupt Watchdog Reset xảy ra; đây là bài viết tổng hợp quá trình giải quyết vấn đề đó.

ESP32 là MCU được sử dụng rộng rãi trong môi trường IoT và embedded,
cung cấp truyền thông mạng TLS, hệ thống tệp, cập nhật OTA trên nền RTOS,
nên có thể hiện thực các ứng dụng embedded cần kết nối mạng chỉ với một chip duy nhất.

7 bình luận

 
pathfinder 2025-12-30

Nội dung thú vị, mình đã đọc rất kỹ.
Nhưng vì sao ngay cả vùng DMA cũng dùng cache vậy?
Có vẻ như rất dễ phát sinh vấn đề.

 
pazzk 2025-12-31

DMA không trực tiếp sử dụng cache, nhưng vì đó là vùng nhớ được chia sẻ giữa cả DMA và CPU nên cần phải tính đến tính nhất quán của cache.

 
pathfinder 2026-01-01

Không có MMU, nhưng vẫn có thể dùng MPU để chỉ định các vùng bộ nhớ và các thuộc tính tương ứng của chúng.
Có lẽ bạn nên thử xem xét một lần.

 
pazzk 2026-01-02

Trên một số MCU cao cấp, đúng như bạn nói, có thể dùng MPU để thiết lập theo từng vùng không chỉ quyền truy cập mà cả các thuộc tính liên quan đến cache. Tài liệu sau của ST sẽ là một tài liệu tham khảo rất tốt: https://community.st.com/t5/stm32-mcus/…

Tuy nhiên, trên ESP32-S3 được sử dụng trong bài viết này, không có cơ chế cho phép thiết lập thuộc tính cacheable / non-cacheable theo từng vùng nhớ bằng MPU hay cơ chế tương tự như trên CPU đa dụng hoặc một số MCU khác.

Với ESP32-S3, bộ nhớ ngoài (Flash/PSRAM) được thiết kế để truy cập thông qua cache/MMU (TRM 4.3.3 External Memory), và việc kiểm soát quyền truy cập được thực hiện qua PMS (Permission Management System) (TRM Chương 15), nhưng thành phần này dùng cho bảo vệ truy cập chứ không có vai trò thay đổi việc có đi qua cache hay không, hoặc bản thân đường truy cập.

Liên kết TRM (Technical Reference Manual): https://documentation.espressif.com/esp32-s3_technical_reference_manua….

 
pathfinder 2026-01-02

Hóa ra tôi đã nhầm khi đương nhiên cho rằng đó sẽ là lõi ARM.
Cảm ơn bạn đã trả lời rất nhiệt tình

 
pathfinder 2025-12-31

Đúng như bạn nói, do tính nhất quán của cache nên có lẽ mỗi lần đều phải thực hiện cache invalidate, vì vậy tôi thắc mắc tại sao lại không dùng luôn vùng non-cacheable để ghi.

 
pazzk 2026-01-01

À, khác với máy tính đa dụng, trên các MCU như ESP32 không có MMU cho phép thay đổi thuộc tính bộ nhớ theo đơn vị trang trong lúc chạy, và việc có cacheable / non-cacheable hay không được quyết định theo từng vùng bộ nhớ đã được ấn định sẵn, nên đúng như bạn nói là không thể dùng theo cách đó được (SRAM nội bộ được cố định nguyên khối là bộ nhớ non-cacheable, còn PSRAM được cố định nguyên khối là bộ nhớ cacheable).

Cảm ơn bạn đã đặt một câu hỏi hay!