[ESP32 Arduino] การแก้ตำแหน่งและขนาดของ partition

Partition เปรียบเสมือนไดร์ต่าง ๆ บนเครื่องคอมพิวเตอร์ของเรา เดิมพื้นที่โปรแกรมที่ 1 และ 2 ของ ESP32 ที่กำหนดไว้เป็นค่าเริ่มต้น กำหนดไว้อย่างละ 1310720 ไบต์ (1.25MB) ดังนั้นพื้นที่เก็บโปรแกรมที่ 1 และที่ 2 รวมกันจึงอยู่ที่ 2.5MB แต่หากโปรแกรมของท่านมีขนาดใหญ่ จำเป็นต้องแก้ตำแหน่ง (ผู้พัฒนาใช้คำว่า offset) และขนาด สามารถทำได้โดยมีขั้นตอนดังนี้

แก้ไฟล์ default.csv ในโฟลเดอร์ partitions

ทันทีที่มีการคอมไพล์โค้ด ตัวชุดคอมไพล์เลอร์ของ ESP32 จะเข้ามาอ่านไฟล์ที่ \espressif\esp32\tools\partitions\default.csv ดังนั้นเราจึงสามารถแก้ขนาด และตำแหน่งของ partition ได้ที่ไฟล์นี้

ก่อนที่จะแก้ไขไฟล์ เพื่อความปลอดภัย ควรคัดลอกไฟล์ต้นแบบเดิมเก็บไว้ก่อน ผมได้คัดลอกไว้ แล้วเปลี่ยนชื่อเป็น default.backup.csv

เปิดไฟล์ default.csv เนื่องจากเป็นไฟล์ CSV ดังนั้นข้อมูลจึงอยู่ในรูป CSV ด้วย การแก้ไขให้ดูทางด้านซ้ายส่วนคอลั่ม name ว่าเป็นพื้นที่ของอะไร

ส่วนที่แก้ไขส่วนใหญ่จะเป็น app0 app1 เป็นพื้นที่เก็บโปรแกรมที่ 1 และพื้นที่เก็บโปรแกรมที่ 2 เดิมมีพื้นที่ส่วนละ 1.25MB ส่วน eeprom เป็นพื้นที่เก็บข้อมูลทั่วไป เดิมมีพื้นที่ 65536 ไบต์ (64KB) มักไม่ค่อยได้ใช้งาน ส่วน spiffs เป็นพื้นที่เก็บไฟล์ต่าง ๆ มักใช้เก็บไฟล์หนัก ๆ ในส่วนนี้ เช่น ไฟล์เว็บ ไฟล์รูป เป็นต้น

การแก้ จะต้องดูในส่วนของ offset และ size ทันทีที่แก้ size ในส่วนใด ๆ ก็ตาม ส่วนอื่น ๆ จะต้องแก้ offset ตามไปด้วย

จะเห็นว่าค่าแต่ละค่าอยู่ในรูปเลขฐาน 16 ดังนั้นการนำมาคิดขนาดสามารถทำได้โดยแปลงเป็นเลขฐาน 10 ก่อน โดยใช้เครื่องคิดเลขที่มีมากับ Windows (สำหรับ Windows 10 จะใช้งานลำบากหน่อย)

ตัวอย่าง size ของ app0 และ app1 คือ 0x140000 สามารถแปลงเป็นเลขฐาน 10 ได้ 1310720 ไบต์ นำมาหาร 1024 จำนวน 2 ครั้ง ได้ 1.25 พอดี ก็คือได้ 1.25MB นั่นเอง

ตัวอย่าง ผมต้องการแก้ไขให้พื้นที่ app0 และ app1 เพิ่ม 1 ใน 2 ของที่มีอยู่เดิม (เดิม + ครึ่งหนึ่งของเดิม) ค่าที่นำไปใส่ในช่อง size สามารถหาได้จาก 1310720 + (1310720 / 2) ได้ 1966080 แปลงเป็นเลขฐาน 16 ได้ 0x1E0000 จึงนำค่านี้ไปใส่ในใส่ size ของ app0 และ app1

เนื่องจากขนาดมีการเปลี่ยนแปลง ทำให้ผลกระทบจะไปตกอยู่ที่ offset ของพื้นที่ถัดไป เมื่อเราแก้ไขขนาดของ app0 แล้ว ผลที่ตามมาคือบรรทัดหลังจากนั้นค่า offset จะเปลี่ยนไปทั้งหมด จึงต้องคิดหาค่า offset ใหม่ การหาค่า offset ของบรรทัดถัดไปหาได้จากค่า offset ของบรรทัดก่อนหน้า บวกกับค่าของ size ของบรรทัดก่อนหน้า เช่น ค่า offset ของ app1 จะหาได้จากค่า offset ของ app0 บวกขนาดของ app0 เมื่อนำ 0x10000 + 0x1E0000 จึงได้ 0x1F0000 นำค่า 0x1F0000 ไปใส่ใน offset ของบรรทัดถัดไป

บรรทัดถัด ๆ ไปก็ทำเช่นเดิม ค่า offset ทั้งหมดจึงเปลี่ยนไปดังนี้

  • บรรทัด app1 นำ 0x1F0000 + 0x1E0000 ได้ 0x3D0000 นำไปเป็นค่า offset ของ eeprom
  • บรรทัด eeprom นำ 0x3D0000 + 0x1000 ได้ 0x3D1000 นำไปเป็นค่า offset ของ spiffs

ในบรรทัดสุดท้าย เนื่องจากมีการแบ่งพื้นที่จาก spiffs ออกไปให้ app0 และ app1 ดังนั้นค่า size ของ spiffs จึงต้องลดลงเนื่องจากถูกหักออกไป การคิดค่า size ใหม่ทำได้โดยนำค่าเดิมมาหักลบกับค่าที่หักไป จึงได้ 1503232 – 1310720 ได้ 192512 นำไปคิดเป็นเลขฐาน 16 ได้ 0x2F000 ผมจึงนำค่านี้ไปใส่ใน size ของ spiffs เลย

ไฟล์ที่ถูกแก้เสร็จแล้วจึงมีหน้าตาดังรูปนี้

บันทึกไฟล์ให้เรียบร้อย แล้วปิดไปได้เลย

แก้ไขไฟล์ boards.txt (กรณีเปลี่ยนขนาดของ app0 app1)

โปรแกรม Arduino จะสนใจค่าที่อยู่ใน boards.txt ว่าเป็นค่าเท่าไร และคอมไพล์เลอร์ตอบขนาดของโปรแกรมหลังคอมไพล์มาเท่าไร แม้เราจะแก้ไข partition ให้พอสำหรับโปรแกรมของเราแล้ว แต่โปรแกรมจะไม่มารับรู้ขนาดของพื้นที่โปรแกรมที่เพิ่มขึ้นด้วย หากไม่มาแก้ไฟล์ boards.txt โปรแกรม Arduino จะบอกว่าคอมไพล์ผ่านปกติ แต่จะไม่อัพโหลดให้เนื่องจากพื้นที่ยังเกินอยู่

การแก้ไข ให้เข้าไปที่ espressif\esp32 เปิดไฟล์ boards.txt ขึ้นมา เลื่อนหาในส่วนของบอร์ดพัฒนาที่ท่านใช้ ตัวอย่างนี้ผมใช้ ESP32 Dev Module เลื่อนมาที่ .upload.maximum_size แก้เป็นขนาดจริงของ app0 หรือ app1 ซึ่งก็คือ 1966080 จากนั้นบันทึกไฟล์ แล้วปิดไปได้เลย

กรณีเปิดโปรแกรม Arduino ค้างไว้ ให้ปิดแล้วเปิดใหม่ จากนั้นลองอัพโหลด จะพบว่าโปรแกรม Arduino แสดงพื้นที่โปรแกรมที่มากขึ้นแล้ว