7 คะแนน โดย pazzk 2025-12-30 | 7 ความคิดเห็น | แชร์ทาง WhatsApp

ขณะพัฒนาเฟิร์มแวร์บน ESP32
ได้พบปัญหา Interrupt Watchdog Reset ในสภาพแวดล้อมที่ใช้งานทั้ง
Flash Encryption และ PSRAM ร่วมกัน
บทความนี้สรุปกระบวนการแก้ไขปัญหาดังกล่าวไว้

ESP32 เป็น MCU ที่ถูกใช้อย่างแพร่หลายในงาน IoT และระบบฝังตัว
โดยบนพื้นฐานของ RTOS นั้นรองรับ TLS network communication, filesystem, OTA update เป็นต้น
ทำให้สามารถสร้างแอปพลิเคชันแบบฝังตัวที่ต้องการการเชื่อมต่อเครือข่ายได้ด้วยชิปตัวเดียว

7 ความคิดเห็น

 
pathfinder 2025-12-30

อ่านเนื้อหาได้อย่างน่าสนใจเลยครับ
แต่สงสัยว่าทำไมพื้นที่ DMA ถึงใช้แคชด้วยล่ะครับ?
ดูเหมือนว่าจะเกิดปัญหาได้ง่ายนะครับ

 
pazzk 2025-12-31

DMA ไม่ได้ใช้แคชโดยตรง แต่เป็นหน่วยความจำที่ DMA และ CPU ใช้ร่วมกัน ดังนั้นจึงต้องคำนึงถึงความสอดคล้องของแคช

 
pathfinder 2026-01-01

แม้จะไม่มี MMU แต่ก็ยังสามารถกำหนดพื้นที่หน่วยความจำและคุณสมบัติของแต่ละพื้นที่ได้ด้วย MPU
น่าจะลองตรวจสอบดูสักครั้งนะครับ

 
pazzk 2026-01-02

ใน MCU ระดับสูงบางรุ่น อย่างที่คุณกล่าวไว้ สามารถใช้ MPU เพื่อกำหนดได้ไม่เพียงสิทธิ์การเข้าถึง แต่รวมถึงคุณสมบัติที่เกี่ยวข้องกับแคชในระดับแต่ละพื้นที่ด้วย เอกสารของ ST ต่อไปนี้น่าจะเป็นแหล่งอ้างอิงที่ดี: https://community.st.com/t5/stm32-mcus/…

อย่างไรก็ตาม ใน ESP32-S3 ที่ใช้ในบทความนี้ ไม่ได้มีวิธีการกำหนดคุณสมบัติ cacheable / non-cacheable แยกตามพื้นที่หน่วยความจำผ่าน MPU หรือกลไกที่คล้ายกัน เหมือนที่มีใน CPU ทั่วไปหรือ MCU บางรุ่น

สำหรับ ESP32-S3 หน่วยความจำภายนอก (Flash/PSRAM) ถูกออกแบบให้เข้าถึงผ่าน cache/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….

 
pathfinder 2026-01-02

ผมเข้าใจผิดไปเองว่าแน่นอนว่าต้องเป็นคอร์ arm
ขอบคุณสำหรับคำตอบที่กรุณามากครับ

 
pathfinder 2025-12-31

ผมสงสัยว่าตามที่คุณพูดเรื่องความสอดคล้องกันของแคช น่าจะต้องทำ cache invalidate ทุกครั้ง แล้วทำไมถึงไม่เขียนไปที่พื้นที่แบบ non-cacheable ไปเลย

 
pazzk 2026-01-01

อ้อ ต่างจากคอมพิวเตอร์ทั่วไป ใน MCU อย่าง ESP32 จะไม่มี MMU ที่สามารถเปลี่ยนคุณสมบัติของหน่วยความจำเป็นรายเพจขณะรันไทม์ได้ ดังนั้นอย่างที่คุณบอกเลยจึงไม่สามารถใช้งานแบบนั้นได้ โดยสถานะว่า cacheable / non-cacheable จะถูกกำหนดตามช่วงหน่วยความจำที่ตายตัวไว้ล่วงหน้า (internal SRAM จะถูกตรึงเป็น non-cacheable และ PSRAM จะถูกตรึงทั้งก้อนเป็นหน่วยความจำแบบ cacheable)

ขอบคุณสำหรับคำถามดี ๆ ครับ!